脚本基础与生命周期

前置知识:本教程假设你已了解 C# 基本语法(变量、方法、类)。如需回顾,可参考系列中的 C# 学习笔记文章。

4.1 创建第一个脚本

在 Project 面板中:右键 → Create → C# Script,命名为 PlayerMovement

双击打开脚本,默认内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
void Start()
{

}

void Update()
{

}
}

所有 Unity 脚本都继承自 MonoBehaviour


4.2 MonoBehaviour 生命周期

Unity 按照固定顺序自动调用以下方法:

初始化阶段

1
Awake() → OnEnable() → Start()
方法 调用时机 用途
Awake() 对象加载时立即调用(无论脚本是否启用) 初始化引用、设置变量
OnEnable() 对象每次变为启用状态时 注册事件、订阅消息
Start() 第一次 Update 之前,且脚本已启用 初始化依赖其他对象的数据

更新阶段

1
FixedUpdate() → Update() → LateUpdate()
方法 调用频率 用途
FixedUpdate() 固定时间间隔(默认 0.02s) 物理更新(刚体、力)
Update() 每帧调用,频率不固定 常规逻辑(输入检测、状态更新)
LateUpdate() Update 之后每帧调用 摄像机跟随等需要在所有更新后执行的操作

销毁阶段

1
OnDisable() → OnDestroy()
方法 调用时机 用途
OnDisable() 对象被禁用时 取消订阅、释放资源
OnDestroy() 对象被销毁时 最终清理

4.3 Time 相关 API

1
2
3
4
5
6
7
8
9
10
11
12
// 上一帧到当前帧的时间(秒),Update 中使用
float delta = Time.deltaTime;

// FixedUpdate 的固定时间间隔
float fixedDelta = Time.fixedDeltaTime;

// 游戏开始后经过的总时间
float totalTime = Time.time;

// 时间缩放(可用于暂停/加速)
Time.timeScale = 0; // 暂停
Time.timeScale = 2; // 2 倍速

使用 Time.deltaTime 保证帧率独立

1
2
3
4
5
// 错误:移动速度依赖帧率(高帧率移动更快)
transform.Translate(0, 0, 1);

// 正确:每秒移动 1 米,帧率无关
transform.Translate(0, 0, 1 * Time.deltaTime);

4.4 Debug 与日志

1
2
3
4
5
6
7
8
9
10
Debug.Log("普通日志信息");          // 白色
Debug.LogWarning("警告信息"); // 黄色
Debug.LogError("错误信息"); // 红色

// 在场景中画线(仅编辑器)
Debug.DrawLine(startPos, endPos, Color.red);
Debug.DrawRay(origin, direction, Color.green);

// 断点调试
Debug.Break(); // 编辑器模式下暂停

4.5 公开变量的序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PlayerMovement : MonoBehaviour
{
// 在 Inspector 中可见可编辑
public float moveSpeed = 5f;

// [SerializeField] 让私有变量也在 Inspector 显示
[SerializeField] private int health = 100;

// [HideInInspector] 让公开变量在 Inspector 隐藏
[HideInInspector] public int score;

// 序列化范围
[Range(0, 10)] public float jumpForce = 5f;

// 添加说明
[Tooltip("角色的移动速度,单位:米/秒")]
public float speed = 5f;
}

4.6 本章小结

  • Unity 脚本继承 MonoBehaviour,有固定的生命周期调用顺序
  • AwakeStartUpdate/FixedUpdate/LateUpdateOnDestroy
  • Update 不固定帧率,需乘以 Time.deltaTime 保证一致性
  • FixedUpdate 固定间隔,适合物理运算
  • 使用 [SerializeField][Range][Tooltip] 属性美化 Inspector

练习题

  1. 创建一个脚本,在 Start 中输出 “Game Started”,在 Update 中每帧输出当前时间
  2. moveSpeed 设为 public 并在 Inspector 中修改数值
  3. 在 Update 中使用 transform.Translate 沿 Z 轴移动,观察是否乘以 Time.deltaTime 的区别
  4. 尝试使用 Time.timeScale = 0 实现暂停效果
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Unity3D开发基础教程 系列
第 4/20 篇
分享: