Mono生命周期小实验

今天在写代码的时候,遇到一个初始化顺序问题,于是做了一个实验,下面记录结果:

情景:

  1.在 脚本A中实例化 一个预制体,该预制体挂有脚本B

  2.在 脚本A中,获取实例化物体 身上的 脚本B,并且设置 B中的变量

  问题:脚本B中的变量在哪个阶段被设置成功?

答案:

  注意:实例化出的物体,无论身上的脚本B 是否 enable,都会首先调用 Awake()方法,这个Awake()调用,在A脚本的赋值操作之前。

  实际操作中,在脚本B中,需要在OnEnable()之后,才能获得 A脚本设置的值。

代码:

  脚本B,挂载在预制体上:

 1 public class PlayerControllerTest : MonoBehaviour {
 2     public TestLife life;
 3     bool hasCallUpdate = false;
 4     private void Awake()
 5     {
 6         Debug.Log("执行Awake,  life 设置成功:"+(life!=null).ToString());
 7     }
 8 
 9     private void Start()
10     {
11         Debug.Log("执行Start,   life 设置成功:" + (life != null).ToString());
12     }
13 
14     private void OnEnable()
15     {
16         Debug.Log("执行Enable, life 设置成功:"+(life != null).ToString());
17     }
18 
19     private void Update()
20     {
21         if (!hasCallUpdate)
22         {
23             Debug.Log("执行Update");
24             hasCallUpdate = true;
25         }
26     }
27 }

  脚本A,挂载在主摄像机上: 

 1 public class TestLife : MonoBehaviour {
 2 
 3     PlayerControllerTest test;
 4     private void Awake()
 5     {
 6         var go = Resources.Load("Cube") as GameObject;
 7 
 8         var temp = Instantiate(go);
 9 
10         var sp = temp.GetComponent<PlayerControllerTest>();
11 
12         test = sp;
13 
14         test.life = this;
15       
16     }
17 }

结果:

  

原文地址:https://www.cnblogs.com/leiGameDesigner/p/9146264.html