Unity MonoBehaviour 生命周期:对于 Update() 中创建的实例,何时调用 Start() 和 Update()?

问题描述 投票:0回答:1

当你在另一个MonoBehaviour的Update()方法中实例化一个新的MonoBehaviour时,根据Unity的执行顺序,什么时候会调用新的MonoBehaviour的生命周期方法?

例如,如果在 A 帧中实例化,则 Start() 将在 B 帧中调用,而 Update() 将从 C 帧开始。

unity-game-engine lifecycle
1个回答
0
投票

说实话,你可以很容易地找到自己:

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

    实例化后在下一帧首先调用

© www.soinside.com 2019 - 2024. All rights reserved.