目的
FixedUpdate 在不同的 GameObject 互相之间是没有执行顺序的,我们并不能知道哪个 GameObject 先执行 FixedUpdate。
但是,有的时候我们仍然希望某个 GameObject 在其他所有 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 = 0; 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"
(图2)
4、执行脚本,我们得到了如下结果。可见,成功实现了我们的目的
(图3)