1. Awake()
作用:
Awake()
是 Unity 脚本中的一个生命周期方法,在脚本实例化时被调用。它通常用于进行初始化操作,比如设置初始状态、引用其他组件等。
调用时机:
Awake()
在对象激活的时刻调用,并且它会在场景中的所有对象的Start()
方法之前执行。Awake()
只会在脚本或物体第一次被加载时调用一次。- 这意味着
Awake()
适合用来做一些 不依赖于其他对象或场景 的初始化操作。
典型用法:
- 初始化字段或引用。
- 设置初始值。
private void Awake()
{
anim = GetComponentInChildren<Animator>();//获取组件
rb = GetComponent<Rigidbody2D>();
cd = GetComponent<CircleCollider2D>();
}
GetComponentInChildren<Animator>()
、GetComponent<Rigidbody2D>()
和GetComponent<CircleCollider2D>()
是用来获取组件的,它们的调用依赖于组件的存在。如果你将这些调用放在Start()
中,且其他组件或对象(例如,父对象)还没有准备好,可能会导致找不到这些组件,从而抛出错误。- 在
Awake()
中,所有附加到对象上的组件都会在脚本实例化时进行初始化。Awake()
会在Start()
之前被调用,这样你就能确保获取组件时它们已经被初始化并且可以正确访问。因此,如果你需要确保组件已经存在并准备好,那么最好将GetComponent
相关的代码放在Awake()
中。
2. Start()
作用:
Start()
也是一个生命周期方法,它主要用于初始化逻辑,和Awake()
的区别在于,Start()
在场景中的所有Awake()
被调用之后才会被调用。Start()
在脚本或物体第一次被启用时调用,但它只会在脚本启用后 第一次 调用一次。
调用时机:
Start()
会在对象激活并且脚本启用时调用,但它是在所有Awake()
完成之后。- 如果该对象在场景加载时处于启用状态,
Start()
会在第一次更新前调用。如果对象在场景加载时被禁用,则只有当对象被激活时才会调用。
典型用法:
- 进行对象之间的依赖关系初始化(比如引用其他脚本)。
- 启动需要场景中其他对象或系统初始化完成之后的逻辑。
void Start()
{
// 例初始化其他对象的引用或执行游戏逻辑
gameManager = FindObjectOfType<GameManager>();
}
3. Update()
作用:
Update()
是 Unity 中 每一帧 被调用的方法。它通常用于 每一帧 需要执行的逻辑,比如处理输入、更新物体位置、检测碰撞等。- 如果你需要让某些逻辑根据时间持续变化或基于用户输入来进行反应,这就是使用
Update()
的地方。
调用时机:
Update()
在每一帧的 开始 被调用。- 如果你运行的是一个游戏,
Update()
会在每一帧渲染之前被执行,通常它会随着游戏的帧率变化,每秒执行多次。 - 注意,
Update()
只在脚本启用并且物体被激活时才会调用。如果脚本禁用或物体被禁用,Update()
不会被调用。
典型用法:
- 处理输入(例如键盘、鼠标或触摸输入)。
- 更新物体的位置或状态。
- 调用一些持续的行为,如 AI 控制、物理计算等。
void Update()
{
// 检查输入或每帧更新物体的位置
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Time.deltaTime);
}
}
关键区别:
方法 | 调用时机 | 常见用途 |
---|---|---|
Awake() | 在脚本实例化时(在场景加载时)调用一次。 | 初始化组件、设置初始状态,引用其他对象。 |
Start() | 在 Awake() 后、第一帧更新之前调用一次。 | 进行依赖关系初始化,启动游戏逻辑。 |
Update() | 每帧调用一次。 | 每帧更新位置、检测输入、处理游戏行为。 |