U
章 01基础11 课 — 点击打开
03 / 11 · 5 分钟
基础

类即组件

到目前为止的项目

还在看代码。这里的 Player.cs 样式,就是你从第 06 课起要写的每个脚本的样式。

先记住一个词:GameObject。游戏里存在的一切 —— 地板、相机、角色、子弹 —— 都是一个 GameObject。

但 GameObject 本身只是一个空壳人偶。它有一个名字、有一个站着的位置,仅此而已:你看不见它、碰不到它,它什么也不做。

靠往上装零件,它才变成真正能用的东西。每个零件都叫一个 component。你接下来要写的 C# class,也只是再装上去的一个零件。

动态图解

看着四个零件依次装上去 —— 直到最后一个装好,角色才真的动起来。

四个零件,说人话

  • Transform —— 站在哪里、脸朝哪个方向、有多大。每个 GameObject 都一定有它,而且永远拆不掉。

  • Mesh Renderer —— 真正负责把它画到屏幕上的零件。拆掉这个,角色还在那儿,只是看不见了。

  • Collider —— 一个看不见的身躯。没有它,角色会直接穿过墙、漏过地板。

  • Player.cs —— 由你自己写的那个零件。它来定规则:玩家按 W,就往前走。

现在自己写第四个零件

前三个零件 Unity 已经替你写好了。第四个 —— 也就是大脑 —— 是一个 C# 文件。每个 Unity 脚本都是同一个模板,你只改花括号里面的东西。

Player.cs — the file name must match the class name
using UnityEngine;                          // gives you Vector3, Debug, ...

public class Player : MonoBehaviour         // ": MonoBehaviour" = attachable component
{
    public float speed = 5f;                // shows in the Inspector
    [SerializeField] private int hp = 100;
    private bool isDead;                    // pure code, no Inspector

    void Start()
    {
        Debug.Log(name + " ready, hp = " + hp);
    }
}

关键就在 ": MonoBehaviour" 这一行。有了它,一个普普通通的 C# class 才能变成可以装到 GameObject 上的零件。漏掉它,这个脚本就哪儿也挂不上了。

  • 文件必须叫 Player.cs —— Unity 会拿文件名和 class 名做比对,名字对不上就挂不上 component。

  • public = 别的脚本能读到它,而且它会出现在 Inspector 里。

  • [SerializeField] private = 最好的默认选择:在 Inspector 里看得到,但别的脚本碰不到。

动态图解

字段在代码里声明一次就好;之后你在 Inspector 里调它,游戏正在跑也能改。

创建并挂载脚本

  1. 1

    在 Project 窗口里 Right click▸Create▸MonoBehaviour Script(旧版 Unity 是 C# Script)。

  2. 2

    当场就把名字打出来 —— 之后只改文件名,里面的 class 名不会跟着变。

  3. 3

    在 Hierarchy 里选中一个 GameObject,再把脚本拖到 Inspector 上。

  4. 4

    点 Play,你用 Debug.Log 输出的东西都会出现在 Console 窗口里。

获取别的 component

C# 脚本
private Rigidbody rb;

void Awake()
{
    rb = GetComponent<Rigidbody>();   // on this same object
}