• 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 }

    结果:

      

  • 相关阅读:
    高级软件工程--第八次作业
    高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
    Bate测试报告
    版本发布说明
    Beta版本展示博客
    Beta阶段总结分析报告
    Bate敏捷冲刺每日报告--day5
    Bate敏捷冲刺每日报告--day4
    Bate敏捷冲刺每日报告--day3
    Kettle中通过触发器方式实现数据 增量更新
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/9146264.html
Copyright © 2020-2023  润新知