3、C#脚本基础:变量、数据类型、控制流——游戏逻辑的基石。

各位同学,欢迎来到第三节课。

上一章我们搭好了Unity环境,也摸清了脚本的基本结构。今天我们要聊的,是真正让游戏“活”起来的东西——C#脚本的核心三要素:变量、数据类型、控制流。

说白了,这就是游戏逻辑的“语法”。你写的每一行代码,本质上都是在跟计算机说:“嘿,记住这个数”、“把这个值翻倍”、“如果玩家按了空格,就跳起来”。

我个人习惯把这三样东西比作“游戏世界的物理规则”。变量是容器,数据类型是容器的形状,控制流是规则本身。搞懂了它们,你就能开始创造自己的游戏规则了。

3.1 变量:游戏世界的“储物箱”

变量是什么?简单说,就是用来存数据的一个“盒子”。

在游戏里,玩家的血量、金币数量、角色的名字、当前关卡编号……这些都是数据。你需要一个地方来存放它们,并且随时可以拿出来用、修改。

声明一个变量的语法很简单:

// 声明一个变量,用来存玩家的生命值
int playerHealth = 100;

这里 int 是数据类型,playerHealth 是变量名,= 100 是初始值。

嗯,这里要注意:变量名不能乱起。我见过不少新手用 abc 来命名,结果代码写到后面自己都看不懂了。

我的命名习惯: 变量名要“见名知意”。比如 playerSpeedenemyCountisGameOver。多用驼峰命名法(首单词小写,后续单词首字母大写)。

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'; 存单个字符,用单引号

我在项目中遇到过最坑的事,就是忘了给 floatf 后缀。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);
        }
    }
}

你看,这个脚本里用到了:

  • 变量currentHealthmaxHealth
  • 数据类型int
  • 控制流if 判断是否按下空格、是否死亡

这就是游戏逻辑的基石。你以后写的所有游戏脚本,本质上都是这些东西的组合。

我的建议: 学到这里,你可以自己动手改一改上面的代码。比如改成按“H”键回血,或者加一个“无敌状态”的 bool 变量。动手试,比看十遍都管用。

3.5 本章小结

今天我们聊了三件事:

  1. 变量:用来存数据的盒子,命名要规范。
  2. 数据类型:int、float、bool、string……选对类型很重要。
  3. 控制流:if/else 做判断,for/while 做循环。

这些东西看着简单,但它们是所有游戏逻辑的“原子”。你想想看,从《超级马里奥》到《原神》,底层逻辑无非就是“如果……就……”、“重复……直到……”。

下一章,我们会深入函数和方法——也就是把一段逻辑打包起来,随时调用。到时候你会发现,代码可以写得更优雅、更高效。

嗯,今天就到这里。记得动手敲代码,别光看。