类即组件
还在看代码。这里的 Player.cs 样式,就是你从第 06 课起要写的每个脚本的样式。
先记住一个词:GameObject。游戏里存在的一切 —— 地板、相机、角色、子弹 —— 都是一个 GameObject。
但 GameObject 本身只是一个空壳人偶。它有一个名字、有一个站着的位置,仅此而已:你看不见它、碰不到它,它什么也不做。
靠往上装零件,它才变成真正能用的东西。每个零件都叫一个 component。你接下来要写的 C# class,也只是再装上去的一个零件。
看着四个零件依次装上去 —— 直到最后一个装好,角色才真的动起来。
四个零件,说人话
Transform —— 站在哪里、脸朝哪个方向、有多大。每个 GameObject 都一定有它,而且永远拆不掉。
Mesh Renderer —— 真正负责把它画到屏幕上的零件。拆掉这个,角色还在那儿,只是看不见了。
Collider —— 一个看不见的身躯。没有它,角色会直接穿过墙、漏过地板。
Player.cs —— 由你自己写的那个零件。它来定规则:玩家按 W,就往前走。
现在自己写第四个零件
前三个零件 Unity 已经替你写好了。第四个 —— 也就是大脑 —— 是一个 C# 文件。每个 Unity 脚本都是同一个模板,你只改花括号里面的东西。
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
在 Project 窗口里 (旧版 Unity 是 C# Script)。
- 2
当场就把名字打出来 —— 之后只改文件名,里面的 class 名不会跟着变。
- 3
在 Hierarchy 里选中一个 GameObject,再把脚本拖到 Inspector 上。
- 4
点 Play,你用 Debug.Log 输出的东西都会出现在 Console 窗口里。
获取别的 component
private Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>(); // on this same object
}