Unity-生命周期函数

目录

生命周期函数是什么?

生命周期函数有哪些?

Awake()

OnEnable()

Start()

FixedUpdate()

Update()

Late Update()

OnDisable()

OnDestroy()

Unity中生命周期函数支持继承多态吗?


生命周期函数是什么?

在Unity中,生命周期函数(Lifecycle Function)是指一组特定的函数,它们会在游戏对象或脚本组件的生命周期中被自动调用。这些函数可以让我们在游戏运行的不同阶段做出相应的响应和处理,例如初始化、更新、销毁等。

生命周期函数有哪些?

下面是一些常见的生命周期函数及其作用:

1. `Awake()`:该函数在游戏对象或脚本组件被创建时调用,用于进行初始化操作。通常在该函数中获取组件引用、设置默认值等。

2.`OnEnable()`:该函数用于在对象被启用时执行。具体来说,当一个脚本组件被添加到一个游戏对象上,或者该游戏对象被激活时,都会触发该组件的OnEnable函数。

3. `Start()`:该函数在游戏对象或脚本组件第一次被启用时调用,用于进行一些初始化操作。通常在该函数中进行游戏开始前的准备工作、设置初始状态等。

4. `FixedUpdate()`:该函数在一定时间间隔后(通常为0.02秒)调用,用于更新游戏对象或脚本组件的物理属性。通常在该函数中进行物理模拟、刚体操作等。

5. `Update()`:该函数在每一帧更新时调用,用于更新游戏对象或脚本组件的状态。通常在该函数中进行游戏逻辑的处理、数据的更新等。

6.LateUpdate():LateUpdate()是一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。

6. `OnDisable()`:在Unity中,OnDisable() 是游戏对象的生命周期函数之一,用于处理对象失活时的逻辑。当游戏对象失活时,Unity会自动调用 OnDisable() 函数。

7. `OnDestroy()`:该函数在游戏对象或脚本组件被销毁时调用,用于进行资源释放、清理等。通常在该函数中释放内存、关闭文件句柄等。

生命周期函数让我们可以方便地在游戏运行的不同阶段进行处理和响应,从而实现更加灵活的游戏逻辑。需要注意的是,如果我们不继承自MonoBehaviour类,则无法使用Unity的生命周期函数。

还有,生命周期函数一般被定义为protected或private,而不是public。

Awake()

关键字:初始化

当对象(自己这个类对象被创建时),才会调用该周期函数。

具体来说,当你在Unity中创建一个新的对象,例如一个游戏物体或是一个脚本挂载的组件,该对象会在内存中被实例化。在实例化过程中,对象的构造函数会被调用,然后在构造函数之后,Awake()函数会被自动调用。

Awake()函数的作用是在对象被创建后,但在场景中启用和激活之前进行必要的初始化和设置。可以在Awake()函数中执行一些需要提前完成的操作,例如变量的初始化、注册事件监听器、获取其他组件的引用等。这样,在Start()函数和Update()函数等后续的生命周期函数中,就可以使用已经初始化好的数据了。

总结起来,Awake()函数是用来在对象被创建时进行初始化的生命周期函数,它在构造函数之后被调用,用于准备对象在场景中使用所需的数据和状态。

OnEnable()

关键字:激活

在Unity游戏引擎中,OnEnable()是一个生命周期函数,用于在对象被启用时执行特定的操作。

当一个对象从非激活状态变为激活状态时(例如,在对象被创建、场景加载、禁用后重新启用等情况下),Unity会自动调用OnEnable()函数。

当一个对象被启用时,它会先调用Awake()函数进行初始化,然后调用OnEnable()函数进行进一步的准备工作。

通常,OnEnable()函数用于注册事件监听器、进行资源加载、启动协程、打开文件或网络连接等需要在对象激活时进行的操作。

与Awake()函数不同,OnEnable()函数每次对象激活时都会被调用,可以用来处理需要在对象每次激活时执行的逻辑。这样,在对象被禁用再重新启用时,可以确保所需的操作得到正确执行。

需要注意的是,OnEnable()函数在对象第一次被创建时也会被调用,因此在编写代码时应该注意处理好初始化和重复执行的逻辑。

总结,OnEnable()是Unity中的一个生命周期函数,用于在对象被启用时进行特定的操作。它可以用来执行在对象激活时需要执行的逻辑,如注册事件、加载资源等。

Start()

关键字:一次

Start()是一个生命周期函数,用于在对象被启用后的第一次帧开始时执行初始化操作。一个对象只能调用一次

当对象被启用后,首先会调用Awake()函数进行基本的初始化,然后在下一帧开始时调用Start()函数,进行进一步的初始化操作。

通常,我们将在Start()函数中进行一些需要在对象第一次启动时进行的操作,例如设置初始状态、初始化变量、获取其他组件的引用等。

Start()函数只在对象第一次启动时被调用,它不会被再次触发。这意味着,在对象重新激活时(例如场景切换回来或对象被禁用再启用),Start()函数不会再次执行。如果需要每次对象激活时都执行一些逻辑,应该使用OnEnable()函数。

需要注意的是,Start()函数的执行顺序是根据对象在场景中的顺序决定的。如果存在多个对象挂载了相同的脚本,并且这些对象在场景中的顺序不同,它们的Start()函数将按照场景中的顺序依次执行。

总结起来,Start()是Unity中的一个生命周期函数,用于在对象被激活后的第一帧开始时进行初始化操作。它用于执行需要在对象第一次启动时进行的逻辑,只会在对象第一次激活时被调用。

Start()和OnEnable()是Unity中常用的两个生命周期函数,它们在对象激活时分别执行不同的操作,有以下区别和联系:

1. 触发时机:
   - Start():在对象第一次被激活后的下一帧开始时调用,只会执行一次。
   - OnEnable():在对象被启用时调用,包括对象第一次被创建、场景加载、禁用后重新启用等情况,每次对象激活时都会被调用。

2. 执行顺序:
   - Start():根据对象在场景中的顺序决定执行顺序。如果存在多个对象挂载了相同的脚本,并且这些对象在场景中的顺序不同,它们的Start()函数将按照场景中的顺序依次执行。
   - OnEnable():按照对象被启用的顺序依次执行。通常情况下,与对象在场景中的顺序无关。

3. 功能:
   - Start():用于进行对象的初始化操作,例如设置初始状态、初始化变量、获取其他组件的引用等。适合处理在对象第一次启动时需要执行的逻辑。
   - OnEnable():用于在对象每次激活时执行特定的操作,例如注册事件监听器、进行资源加载、启动协程、打开文件或网络连接等。适合处理需要在对象激活时执行的逻辑。

需要注意的是,如果对象在Awake()函数中被禁用了,那么在对象重新启用时,只会调用OnEnable()函数而不会调用Start()函数。因此,如果需要确保在对象第一次启用和每次启用时都执行一些逻辑,应该将相应的代码放在OnEnable()函数中。

FixedUpdate()

关键字:物理

在Unity中,FixedUpdate()是一个生命周期函数,用于在固定的时间间隔(可以在project setting-Time里)内执行物理相关的更新操作。它会在每一帧渲染之前被调用,而不受帧率的影响。因此,FixedUpdate()适用于需要与物理引擎交互或进行精确计算的场景。

Update()

关键字:更新

在Unity中,Update()是一个常用的生命周期函数,它会在每一帧中被调用,用于更新游戏对象的核心逻辑和状态。

1. 触发时机:
   Update()函数在每一帧渲染之前被调用,因此它的执行频率与帧率相关。默认情况下,每秒调用次数与当前帧率一致,即每秒60次(或其他帧率)。

2. 功能:
   - 游戏逻辑更新:Update()函数是实现游戏逻辑的主要场所。例如,处理玩家输入、移动游戏对象、检测碰撞、进行游戏状态切换等都可以放在Update()函数中。
   - 动画更新:如果游戏对象具有动画组件,Update()函数也可以用于更新动画状态。通过修改动画的播放速度、切换动画片段等操作来控制动画的播放。

3. 注意事项:
   - 避免在Update()中使用过多的计算,以防止性能问题。如果需要进行复杂的计算,可以考虑将计算操作放在FixedUpdate()函数中,以固定时间间隔执行。
   - 对于需要在固定间隔内执行的物理相关操作,应该使用FixedUpdate()而不是Update()函数。

总结起来,Update()是Unity中的一个生命周期函数,用于在每一帧中更新游戏对象的逻辑和状态。它适用于处理游戏逻辑、玩家输入、移动游戏对象、检测碰撞等操作。需要注意避免过多的计算,并对于物理相关操作应该使用FixedUpdate()函数。

Late Update()

关键字:摄像机

在Unity中,LateUpdate()是一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。

1. 触发时机:
   LateUpdate()函数在每一帧渲染之后被调用,因此它会在所有Update()函数执行完毕后执行。这样可以确保在更新游戏对象之前,所有的Update()函数都已经执行完毕。

2. 功能:
  跟随相机:如果游戏对象需要跟随相机移动,可以将跟随相机的代码放在LateUpdate()中执行。这样可以确保相机移动后游戏对象的位置也更新了。

总结起来,LateUpdate()是Unity中的一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。它适用于进行碰撞检测、跟随相机等操作。

FixedUpdate()、Update()、Late Update()都是会不停地被调用的帧循环函数这些帧循环函数通过按照固定的顺序被调用,使得游戏对象能够在每一帧中更新并保持正确的状态。

OnDisable()

关键字:失活

在Unity中,OnDisable() 是游戏对象的生命周期函数之一,用于处理对象失活时的逻辑。每次对象失活时,Unity都会自动调用 OnDisable() 函数。

OnDestroy()

关键字:销毁

OnDestroy() 是游戏对象的生命周期函数之一,用于处理对象即将销毁时的逻辑。当游戏对象被销毁删除时,Unity会自动调用 OnDestroy() 函数。

OnDestroy() 函数常用于以下情况:
1. 清理资源:在游戏对象即将销毁时,可以使用 OnDestroy() 函数释放或清理该对象使用的资源。这包括关闭文件句柄、取消订阅事件、销毁其他对象的引用等。通过在 OnDestroy() 中进行资源清理,可以确保在对象销毁时不会出现资源泄漏或无效引用。

2. 停止协程和计时器:如果在游戏对象上启动了协程或计时器,需要在对象销毁时停止它们的执行。可以在 OnDestroy() 中调用 StopCoroutine() 或 CancelInvoke() 来停止协程或计时器,以避免在对象销毁后仍然执行相关代码。

3. 取消注册监听器:如果游戏对象注册了监听器(例如事件监听器、输入监听器等),可以在 OnDestroy() 中取消注册以避免对象销毁后仍然接收到事件或输入。这是为了确保对象在销毁状态下不会响应或处理任何事件。

需要注意的是,OnDestroy() 在对象被销毁时会被调用,但当对象再次创建时并不会自动调用任何生命周期函数。如果需要在对象重新创建时执行特定的逻辑,可以使用 Awake() 或 Start() 函数。

总之,OnDestroy() 是 Unity 中一个重要的生命周期函数,用于在游戏对象即将销毁时处理资源释放、协程停止和监听器取消注册等操作。它是确保对象在销毁前执行必要清理的关键函数。

Awake()、Start()、OnDestroy()都是只会调用一次的函数。

FixedUpdate()、Update()、Late Update()都是会不停地被调用的帧循环函数

OnEnable()、OnDisable()是激活/失活的时候都会被调用。

Unity中生命周期函数支持继承多态吗?

在Unity中,生命周期函数(如Awake()、Start()、Update()等)是通过组件脚本来实现的,而组件脚本是可以继承的。因此,生命周期函数在继承关系中也会支持多态性。

当一个游戏对象上添加了多个组件脚本时,每个组件都可以重写生命周期函数。

如果子类重写了父类的生命周期函数,那么在运行时,Unity会根据组件的实际类型调用正确的生命周期函数。

例如,如果一个游戏对象上有一个父类组件脚本和一个子类组件脚本,并且它们都重写了 Start() 函数,那么在游戏对象启动时,Unity会首先调用子类组件的 Start() 函数,然后再调用父类组件的 Start() 函数。

这种继承多态的特性使得在Unity中可以方便地实现组件的复用和定制化。你可以在子类中添加特定的逻辑,同时保留父类的共同功能。通过重写生命周期函数,你可以自定义游戏对象的行为,并根据实际需求进行灵活的扩展和定制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值