当你在另一个MonoBehaviour的Update()方法中实例化一个新的MonoBehaviour时,根据Unity的执行顺序,什么时候会调用新的MonoBehaviour的生命周期方法?
例如,如果在 A 帧中实例化,则 Start() 将在 B 帧中调用,而 Update() 将从 C 帧开始。
说实话,你可以很容易地找到自己:
public class Test : MonoBehaviour
{
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
var x = new GameObject("X");
x.AddComponent<SubTest>();
var y = new GameObject("Y");
y.AddComponent<SubTest>();
}
}
private class SubTest : MonoBehaviour
{
private void Awake()
{
Debug.Log($"{name} Awake: {Time.frameCount}");
}
private void Start()
{
Debug.Log($"{name} Start: {Time.frameCount}");
}
private bool firstUpdate;
private void Update()
{
if (firstUpdate)
{
Destroy(gameObject);
return;
}
firstUpdate = true;
Debug.Log($"{name} First Update: {Time.frameCount}");
}
}
}
=>
X Awake: 3
Y Awake: 3
X Start: 3
Y Start: 3
X First Update: 4
Y First Update: 4
如你所见
Awake
马上就被叫到了
Start
延迟到当前帧结束
这非常有用,可以让您例如在使用之前调整公共字段和属性
Start
Update
实例化后在下一帧首先调用