[转]关于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. void Awake()
  4. {
  5. print("--" + this.transform.name+ "-------Awake-----------------");
  6. }
  7. // Use this for initialization
  8. void Start()
  9. {
  10. print("----Start-" + this.transform.name);
  11. }
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. }
  16. void OnDestroy()
  17. {
  18. print("*******************"+ this.transform.name + "********Destroy!");
  19. }
  20. }</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. // Update is called once per frame
  7. void Update()
  8. {
  9. }
  10. void OnDestroy()
  11. {
  12. print("*******************"+ this.transform.name + "********Destroy!" + ",class:GroupData");
  13. }</span>

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

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

总结:

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

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

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

总结:

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

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

以下为销毁效果图:

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

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

以下是销毁的效果图:

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

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

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

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

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

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

时间: 2024-09-30 18:35:57

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

Unity3d 脚本相互调用

unity中三种调用其他脚本函数的方法 第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用…… 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型

Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例及配置文件具体解释

Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例 一.调用java程序脚本(默认已经搭建好了Java环境) 1.jdk 安装路径 /usr/jdk/jdk1.7/-- 2.java 程序路径 /usr/jdk 3.类名:Test.java(有主函数的类名) 4.调用java类的脚本,注意脚本的后缀是.sh 5.脚本内容: (1)#! /bin/bash // #! 特殊符号.说明这个脚本是由/bin 文件夹下的bash这个shell来解释并将解释后的内容给kernel来

Unity3D 之 C# 脚本

引用类型 :class ,interface, 数组 , delegate , object ,string (object 是C#中所有类型,包括所有的值类型和引用类型的根类,string 类型是一个从object类直接继承的密封类型(不能再被继承),其实例表示Unicode字符串) try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前答:会运行,并且在return 后运行. public static

python常用运维脚本实例【转】

file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建.但是更推荐使用内置函数open()来打开一个文件 . 首先open是内置函数,使用方式是open('file_name', mode, buffering),返回值也是一个file对象,同样,以写模式打开文件如果不存在也会被创建一个新的. f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,

JavaScript--基于对象的脚本语言学习笔记(一)

1.两种嵌入js的方式 使用javascript前缀构建url:<a href="javascript:alert('运行JavaScript..')">运行js</a> js脚本放在<style></style>之间: <style type="text/javascript"> alert("运行JavaScript..") </script> 2.如果没有声明变量直接使

扩展Unity3D编辑器的脚本模板

??最近在学习Shader时感觉Shader语言参数众多.语法诡异,如果每次都从头开始写Shader一定是一件痛苦的事情.如果可以在本地定义好一组标准的Shader模板,这样当我们需要实现某些效果类似的Shader时,就可以在这个Shader模板的基础上进行修改.因为Shader文件是一个文本文件,所以我们可以非常容易地创建这样一个模板,在这个模板中我们可以进一步完善相关的参数注释,这样就不用每次写Shader的时候都需要查文档了,从这个角度出发,就进入了这篇文章的正题:扩展Unity3D编辑器

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在祝方法调用,后者必须先实例化后用实例调用)

1 package lsg.ap.april4th2; 2 /* 3 知识点:1.Getter and Setter 的应用 4 2.局部变量与成员变量(也可叫做全局变量) 5 3.Static关键字的用法 6 a.成员变量被static修饰后的所有类的共享属性 7 b.方法被static修饰之后,在本类内调用的类名省略问题;以及不用Static,即使在本类内也必须先实例化 8 4.This关键字的用法 9 this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 10 11 注意:谁