Unity - A计划(一年有效期) 扫二维码继续学习 二维码时效为半小时

(61评价)
价格: 2190.00元
MonoBehaviour生命周期疑问
ten999发起了问答2019-04-19
5
回复
345
浏览

假设prefab挂载了一个A MonoBehavior,有一个public void Test() 方法。使用GameObject.Instantiate这个prefab,
A a = instPanleGO.GetComponent<A>(); a.Test(); 为什么执行顺序是Awake->Test->Start?有点不明白。

所有回复
  • 老师_Trigger 2019-04-20

    同学你好,看同学Test方法的调用位置,如果是在Awake里调用的,那么就是TestAwake->prefabAwake,如果是Start里,那么就是TestAwake->TestStart->prefabAwak->prefabStart,其实总结就是方法调用的前后顺序关系。它肯定是严格按生命周期函数的表来走的。

    • ten999 2019-04-20

      老师,您好!可能我的问题没有描述清楚。我把问题重新描述了一下。由于操作失误,重新描述的内容在“楼下”。

      (0) 回复
    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • ten999 2019-04-20

    老师您好!可能我的问题没有描述清楚。我把代码和日志贴一下吧。

    public void CreateGameObjgect() {
        string prefabPath = "UIPanel/SystemPanel";
        GameObject go = GameObject.Instantiate(Resources.Load(prefabPath)) as GameObject;
        go.transform.SetParent(parentTransform, false);
        //这里添加一个组件,会触发声明周期Awake。能理解Awake优先于其它方法调用
        TestComponet testComponet = go.AddComponent<TestComponet>();
        //为什么Test会优先于Start调用
        testComponet.Test();
    }
    
    public class TestComponet : MonoBehaviour
    {
        private void Awake() {
            print("TestComponet#Awake");
        }
    
        private void Start() {
            print("TestComponet#Start");
        }
    
        public void Test() {
    
            print("TestComponet#Test");
        }
    }

    // 打印日志

    TestComponet#Awake--》TestComponet#Test--》TestComponet#Start

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
  • 老师_Trigger 2019-04-20

    同学可以做一个实验,它是有这个机制的,就是如果出现实例化与外部调用出现在同一个方法的时候,它会先调用Awake,再调用我们调用的其他方法,这个方法不是在类内进行调用的,所以叫外部调用,那么就是Awake->外部调用->Start。老师在保卫萝卜535-536里有一个实验,如果同学对这个方面有兴趣可以去看看,这个都是踩坑使用的。

    还有-4条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!