首页 > 代码库 > [转]关于Unity3D对象和脚本实例调用的顺序探究

[转]关于Unity3D对象和脚本实例调用的顺序探究

http://blog.csdn.net/liangzg_2011/article/details/8150844

关于Unity3D对象和脚本实例调用的顺序探究

我们先来看一些有趣Unity实例顺序的小实验。有图有真相!!

 

 

注:以上打印的代码语句如下:

 

[csharp] view plaincopy
 
  1. <span style="font-size:18px;">    void Start () {  
  2.        print("-----" + this.transform.name);  
  3.     }</span>  

   

 

从以上的打印我们至少可以得出的实验结果!

 

总结:Unity从树形目录的最底端的最深层开始实例化对象,然后逐个向上实例!

 

 

 

 

 

我们再来实验下关于脚本生命周期的小实验:

 

关于脚本的生命周期网上和官方都有很多资源,这里主要实验是关于对象的实例顺序及对象依附脚本的执行顺序!

 

脚本代码:

 

[csharp] view plaincopy
 
  1. <span style="font-size:18px;">public class GroupData : MonoBehaviour  
  2. {  
  3.    
  4.     void Awake()  
  5.     {  
  6.        print("--" + this.transform.name+ "-------Awake-----------------");  
  7.     }  
  8.    
  9.     // Use this for initialization  
  10.     void Start()  
  11.     {  
  12.        print("----Start-" + this.transform.name);  
  13.     }  
  14.    
  15.     // Update is called once per frame  
  16.     void Update()  
  17.     {  
  18.    
  19.     }  
  20.    
  21.     void OnDestroy()  
  22.     {  
  23.        print("*******************"+ this.transform.name + "********Destroy!");  
  24.     }  
  25. }</span>  



 

 

运行效果图:

          初始化的状态

由以上的打印可以看出,在初始对象以及脚本的调用上,Unity的实例始终是按照树形结构从最底层开始加载调用,然后逐层向上!

终止状态:

 

 

奇妙的事情发生啦!  哈~ 在对象销毁的时候,Unity是优先Destroy上层的对象,再操作它的子对象(从上于下的顺序)销毁!

 

 

 

 

 

最后我们关注下,一个对象关联多个脚本时的输出情况,这里也关注初始化和销毁两个行为!

 

每个对象的脚本绑定形式:

 

三个脚本的打印形式如:

    

[csharp] view plaincopy
 
  1. <span style="font-size:18px;">// Use this for initialization  
  2.       voidStart()  
  3.     {  
  4.        print("----Start-" + this.transform.name + ",class:GroupData");  
  5.     }  
  6.    
  7.     // Update is called once per frame  
  8.     void Update()  
  9.     {  
  10.    
  11.     }  
  12.    
  13.     void OnDestroy()  
  14.     {  
  15.        print("*******************"+ this.transform.name + "********Destroy!" + ",class:GroupData");  
  16.     }</span>  

 

 

我们先从当个脚本的执行情况看看:

 

 

我们再交换下三个脚本的顺序,看看打印的情况:

 

 

总结:

初始化:对于同一对象绑定多个脚本,初始化加载总会从目录的最底层开始,再逐级向上!

销毁:也许是因为同级目录,所以销毁的顺序按目录层,从上到下依次执行!

 

最后我们看看多层多脚本的执行情况:

 

 

  总结:

    对于对象视图,依然从最底开始,再到单一对象的脚本视图,又从底部开始!

  个人来说这里有点小意外这里!!哈哈~~

以下为销毁效果图:

 

销毁的顺序跟我们上面的实验结果没有多大的相差!

假如:我们把Group20和Group210的脚本都减少一个,只放置一个脚本,看看脚本的执行情况!

 

以下是销毁的效果图:

 

 

我们试着按代码的思路去写的话我猜有可能是这样子的:

 

1.查找对象的脚本绑定,记录最大的脚本绑定层数

2.查找对象的分布层数,建立树形层级

3.对于加载过程,从脚本层数开始的最底端开始遍历整个对象分布的树形层

4.对于销毁过程,则反过来由对象视图的树形层开始,依然销毁对象的脚本,并且优先销毁最底层的父节点,依次向上!

 

仅为记录工作中的一些疑问,有不对的地方,欢迎大家指正,交流!谢谢理解!

[转]关于Unity3D对象和脚本实例调用的顺序探究