Mono生命周期小实验

Posted gameDesigner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

结果:

  

 

以上是关于Mono生命周期小实验的主要内容,如果未能解决你的问题,请参考以下文章

本周小贴士#101:返回值,引用和生命周期

关于片段生命周期

调用 replace() 时片段的生命周期是啥?

Android片段生命周期:onResume调用了两次

在不存在的片段上调用片段生命周期和 onCreate 的问题

导航上的片段生命周期重叠