3、C#脚本基础:变量、数据类型、控制流——游戏逻辑的基石。
各位同学,欢迎来到第三节课。
上一章我们搭好了Unity环境,也摸清了脚本的基本结构。今天我们要聊的,是真正让游戏“活”起来的东西——C#脚本的核心三要素:变量、数据类型、控制流。
说白了,这就是游戏逻辑的“语法”。你写的每一行代码,本质上都是在跟计算机说:“嘿,记住这个数”、“把这个值翻倍”、“如果玩家按了空格,就跳起来”。
我个人习惯把这三样东西比作“游戏世界的物理规则”。变量是容器,数据类型是容器的形状,控制流是规则本身。搞懂了它们,你就能开始创造自己的游戏规则了。
3.1 变量:游戏世界的“储物箱”
变量是什么?简单说,就是用来存数据的一个“盒子”。
在游戏里,玩家的血量、金币数量、角色的名字、当前关卡编号……这些都是数据。你需要一个地方来存放它们,并且随时可以拿出来用、修改。
声明一个变量的语法很简单:
// 声明一个变量,用来存玩家的生命值
int playerHealth = 100;
这里 int 是数据类型,playerHealth 是变量名,= 100 是初始值。
嗯,这里要注意:变量名不能乱起。我见过不少新手用 a、b、c 来命名,结果代码写到后面自己都看不懂了。
playerSpeed、enemyCount、isGameOver。多用驼峰命名法(首单词小写,后续单词首字母大写)。
3.2 数据类型:盒子的“形状”
变量有不同类型,就像储物箱有不同形状。你不能把水装进漏网的篮子里,对吧?
C#里常用的数据类型,我整理了一张表,你直接记就行:
| 数据类型 | 关键字 | 示例 | 说明 |
|---|---|---|---|
| 整数 | int | int score = 0; |
存整数,比如金币数、生命值 |
| 浮点数 | float | float speed = 5.5f; |
存小数,注意后面要加 f |
| 布尔值 | bool | bool isDead = false; |
只有 true 或 false,用来做判断 |
| 字符串 | string | string playerName = "勇者"; |
存文本,用双引号括起来 |
| 字符 | char | char grade = 'A'; |
存单个字符,用单引号 |
我在项目中遇到过最坑的事,就是忘了给 float 加 f 后缀。C#默认小数是 double 类型,你不加 f,它会报错说“无法隐式转换”。
float 没加 f,调试了整整半小时。后来养成习惯:写小数就顺手加 f,就像出门带钥匙一样自然。
3.3 控制流:让游戏“做决定”
有了变量和数据,接下来就是让游戏根据条件做出不同反应。这就是控制流。
控制流主要有三种:顺序、分支、循环。
3.3.1 分支语句:if / else
这是最常用的。你想想看,游戏里到处都是判断:
- 如果玩家血量归零,游戏结束。
- 如果按下跳跃键,角色跳起。
- 如果金币数量大于100,解锁新关卡。
写法很简单:
int playerHealth = 50;
if (playerHealth <= 0)
{
Debug.Log("游戏结束");
}
else
{
Debug.Log("继续战斗");
}
这里 if 后面括号里放的是条件,条件为 true 就执行大括号里的代码,否则执行 else 里的。
==(两个等号)表示“等于”,一个等号 = 是赋值。我见过太多新手把 if (score = 100) 写成赋值,结果代码永远为 true。
3.3.2 循环语句:for / while
循环就是让某段代码重复执行。比如生成10个敌人、播放5次音效、遍历背包里的所有物品。
for 循环: 适合知道循环次数的情况。
// 生成5个敌人
for (int i = 0; i < 5; i++)
{
Debug.Log("生成第 " + i + " 个敌人");
}
while 循环: 适合不知道具体次数,但知道什么时候停止的情况。
int enemyCount = 3;
while (enemyCount > 0)
{
Debug.Log("还有 " + enemyCount + " 个敌人存活");
enemyCount--;
}
我个人习惯:能用 for 就用 for,因为结构清晰,不容易写出死循环。但 while 在某些场景下更灵活,比如等待玩家输入。
while(true) 忘记加退出条件,结果游戏直接卡死。记住:循环一定要有“出口”,否则就是死循环。
3.4 综合小案例:玩家受伤逻辑
光说不练假把式。我们来写一个简单的玩家受伤逻辑,把今天学的串起来。
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
// 变量:玩家当前血量
public int currentHealth = 100;
// 变量:玩家最大血量
public int maxHealth = 100;
void Update()
{
// 如果按下空格键,模拟受伤
if (Input.GetKeyDown(KeyCode.Space))
{
TakeDamage(10);
}
}
void TakeDamage(int damage)
{
// 扣血
currentHealth -= damage;
// 控制流:判断是否死亡
if (currentHealth <= 0)
{
currentHealth = 0;
Debug.Log("玩家死亡");
}
else
{
Debug.Log("当前血量:" + currentHealth);
}
}
}
你看,这个脚本里用到了:
- 变量:
currentHealth、maxHealth - 数据类型:
int - 控制流:
if判断是否按下空格、是否死亡
这就是游戏逻辑的基石。你以后写的所有游戏脚本,本质上都是这些东西的组合。
3.5 本章小结
今天我们聊了三件事:
- 变量:用来存数据的盒子,命名要规范。
- 数据类型:int、float、bool、string……选对类型很重要。
- 控制流:if/else 做判断,for/while 做循环。
这些东西看着简单,但它们是所有游戏逻辑的“原子”。你想想看,从《超级马里奥》到《原神》,底层逻辑无非就是“如果……就……”、“重复……直到……”。
下一章,我们会深入函数和方法——也就是把一段逻辑打包起来,随时调用。到时候你会发现,代码可以写得更优雅、更高效。
嗯,今天就到这里。记得动手敲代码,别光看。