Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

时间:2023-03-09 09:20:48
Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

目的

FixedUpdate 在不同的 GameObject 互相之间是没有执行顺序的,我们并不能知道哪个 GameObject 先执行 FixedUpdate。

但是,有的时候我们仍然希望某个 GameObject 在其他所有 GameObject 执行 FixedUpdate 之后能执行一个指定的函数。

思路

Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

(图1)

观察上图 Unity 生命周期(片段)中 Physics 部分。FixedUpdate 后,执行了 yield WaitForFixedUpdate,然后进行物理更新。

我们发现,可以尝试用协程实现。

实现 AfterFixedUpdate

1、创建一个 C# 脚本,命名为 TryAfterFixedUpdate,代码如下

using UnityEngine;
using System.Collections; public class TryAfterFixedUpdate : MonoBehaviour
{
[SerializeField]
string text; int a = ; void FixedUpdate ()
{
a++;
Debug.Log (string.Format ("FixedUpdate {0} {1}", a, text));
StartCoroutine (AfterFixedUpdate ());
} IEnumerator AfterFixedUpdate ()
{
Debug.Log (string.Format ("AfterFixedUpdate {0} {1}", a, text));
yield return new WaitForFixedUpdate ();
Debug.Log (string.Format ("AfterYield {0} {1}", a, text));
} }

2、创建两个空的 GameObject,分别命名为 A B

3、将 TryAfterFixedUpdate 脚本分别拖放到 A 和 B 上,并设置 text 分别为 "a" 和 "b"

Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

(图2)

4、执行脚本,我们得到了如下结果。可见,成功实现了我们的目的

Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

(图3)