位置: 编程技术 - 正文

Unity3D中脚本的执行顺序和编译顺序(unity 3d脚本编程)

编辑:rootadmin

推荐整理分享Unity3D中脚本的执行顺序和编译顺序(unity 3d脚本编程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity3d脚本怎么用,unity脚本模板,unity3d4个脚本,unity3d的脚本语言,unity3d的脚本语言,unity3d4个脚本,unity3d4个脚本,unity3d脚本参考手册,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity3D中脚本的执行顺序和编译顺序

【狗刨学习网】

在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行。与脚本有关的也就是编译和执行啦,本文就来研究一下Unity中脚本的编译和执行顺序的问题。

事件函数的执行顺序

先说一下执行顺序吧。 官方给出的脚本中事件函数的执行顺序如下图:

我们可以做一个小实验来测试一下: 在Hierarchy视图中创建三个游戏对象,在Project视图中创建三条脚本,如下图所示,然后按照顺序将脚本绑定到对应的游戏对象上:

三条脚本的代码完全一样,只是做了一点名称上的区分:

using UnityEngine;using System.Collections;public class Scring0 : MonoBehaviour{ void Awake() { Debug.Log("Script0 ======= Awake"); } bool isUpdate = false; void Update() { if(!isUpdate) { Debug.Log("Script0 ======= Update"); isUpdate = true; } } bool isLateUpdate = false; void LateUpdate() { if(!isLateUpdate) { Debug.Log("Script0 ======= LateUpdate"); isLateUpdate = true; } }}

播放游戏,看看它们的执行顺序。如下图所示,Awake、Update、LateUpdate,无论运行游戏多少次,它们的执行顺序是完全一样的。

接着我们再做一个测试,把Script0的Update方法注释掉!!

using UnityEngine;using System.Collections;public class Script0 : MonoBehaviour { void Awake () { Debug.Log("Script0 ========= Awake"); } // bool isUpdate = false;// void Update () // {// if(!isUpdate)// {// Debug.Log("Script0 ========= Update");// isUpdate = true;// }// } bool isLateUpdate = false; void LateUpdate() { if(!isLateUpdate) { Debug.Log("Script0 ========= LateUpdate"); isLateUpdate = true; } }}

再次运行游戏,看看它的结果。脚本的执行顺序和以前完全一样,Script0即便删除掉了Update方法,但是它也不会直接执行LateUpdate方法,而是等待Script1和Script2中的Update方法都执行完毕以后,再去执行所有的LateUpdate方法。

通过这两个例子,我们就可以很清楚地断定,Unity后台是如何执行脚本的了。每个脚本的Awake、Start、Update、LateUpdate、FixedUpdate等等,所有的方法在后台都会被汇总到一起:

后台的Awake(){ // 这里暂时按照上图中的脚本执行顺序,后面会谈到其实可以自定义该顺序的 脚本2中的Awake(); 脚本1中的Awake(); 脚本0中的Awake();}

后台的方法Awake、Update、LateUpdate等等,都是按照顺序,等所有游戏对象上脚本中的Awake执行完毕之后,再去执行Start、Update、LateUpdate等方法的。

后台的Update(){ // 这里暂时按照上图中的脚本执行顺序,后面会谈到其实可以自定义该顺序的 脚本2中的Update(); 脚本1中的Update(); 脚本0中的Update();}脚本的执行顺序然后我们来看看这样一种情况:在脚本0的Awake方法中创建一个立方体对象,然后在脚本2的Awake方法中去获取这个立方体对象。代码如下: // Script0.csusing UnityEngine;using System.Collections;public class Script0 : MonoBehaviour { void Awake () { GameObject.CreatePrimitive(PrimitiveType.Cube); }}// Script2.csusing UnityEngine;using System.Collections;public class Script2 : MonoBehaviour { void Awake () { GameObject go = GameObject.Find("Cube"); Debug.Log(go.name); }}

如果脚本的执行顺序是先执行Script0,然后再执行Script2,那么Script2中的Awake就可以正确地获取到该立方体对象;可是如果脚本的执行顺序是先执行Script2,然后是Script0,那么Script2肯定会报空指针错误的。

那么实际项目中的脚本会非常多,它们的先后执行顺序我们谁也不知道(有人说是按照栈结构来执行的,即后绑定到游戏对象上的脚本先执行。这一点可以从上面的例子中得到,但官方并没有这么说,还得进一步深入研究)。但一般的,建议在Awake方法中创建游戏对象或

Resources.Load(Prefab)对象,然后在Start方法中去获取游戏对象或者组件,因为事件函数的执行顺序是固定的,这样就可以确保万无一失了。 另外,Unity也提供了一个方法来设置脚本的执行顺序,在Edit -> Project Settings -> Script Execution Order菜单项中,可以在Inspector面板中看到如下图所示:

点击右下角的"&#;"将弹出下拉窗口,包括游戏中的所有脚本。脚本添加完毕后,可以用鼠标拖动脚本来为脚本排序,脚本名后面的数字也越小,脚本越靠上,也就越先执行。其中的Default Time表示没有设置脚本的执行顺序的那些脚本的执行顺序。

Unity3D中脚本的执行顺序和编译顺序(unity 3d脚本编程)

按照上面这张图的设置,我们再来看一下控制台的输出结果,来确认一下我们的设置是否起作用(注意:把Script0脚本中的Update方法取消注释):

脚本的编译顺序

关于脚本的编译顺序很是头疼,官方的说法有点模糊,请看官方的解释:

由于脚本的编译顺序会涉及到特殊文件夹,比如上面提到的Plugins、Editor还有Standard Assets等标准的资源文件夹,所以脚本的放置位置就非常重要了。下面用一个例子来说明不同文件夹中的脚本的编译顺序:

实际上,如果你细心的话会发现,如果在你的项目中建立如上图所示的文件夹层次结构时,编译项目之后会在项目文件夹中生成一些文件名中包含Editor、firstpass这些字样的项目文件。比如按照上图的文件夹结构,我们打开项目文件夹来看一下产生的项目文件是什么样的?

下面就来详细探讨一下这些个字样是什么意思?它们与脚本的编译顺序有着怎样的联系?

1、首先从脚本语言类型来看,Unity3d支持3种脚本语言,都会被编译成CLI的DLL

如果项目中包含有C#脚本,那么Unity3d会产生以Assembly-CSharp为前缀的工程,名字中包含”vs”的是产生给Vistual Studio使用的,不包含”vs”的是产生给MonoDevelop使用的。

项目中的脚本语言工程前缀工程后缀C#Assembly-CSharpcsprojUnityScriptAssembly-UnityScriptunityprojBooAssembly-Boobooproj

如果项目中这三种脚本都存在,那么Unity将会生成3种前缀类型的工程。

2、对于每一种脚本语言,根据脚本放置的位置(其实也部分根据脚本的作用,比如编辑器扩展脚本,就必须放在Editor文件夹下),Unity会生成4中后缀的工程。其中的firstpass表示先编译,Editor表示放在Editor文件夹下的脚本。

在上面的示例中,我们得到了两套项目工程文件:分别被Virtual Studio和MonoDevelop使用(后缀包不包含vs),为简单起见,我们只分析vs项目。得到的文件列表如下:

Assembly-CSharp-filepass-vs.csproj Assembly-CSharp-Editor-filepass-vs.csproj Assembly-CSharp-vs.csproj Assembly-CSharp-Editor-vs.csproj

根据官方的解释,它们的编译顺序如下:

(1)所有在Standard Assets、Pro Standard Assets或者Plugins文件夹中的脚本会产生一个Assembly-CSharp-filepass-vs.csproj文件,并且先编译;

(2)所有在Standard Assets/Editor、Pro Standard Assets/Editor或者Plugins/Editor文件夹中的脚本产生Assembly-CSharp-Editor-filepass-vs.csproj工程文件,接着编译;

(3)所有在Assets/Editor外面的,并且不在(1),(2)中的脚本文件(一般这些脚本就是我们自己写的非编辑器扩展脚本)会产生Assembly-CSharp-vs.csproj工程文件,被编译;

(4)所有在Assets/Editor中的脚本产生一个Assembly-CSharp-Editor-vs.csproj工程文件,被编译。

之所以按照这样建立工程并按此顺序编译,也是因为DLL间存在的依赖关系所决定的。

好了,到此为止,我们可以很容易地判断出上面举的实例中,脚本的编译顺序(实际上,我已经把顺序写在了脚本的文件名中了)

更多精彩内容:www.gopedu.com

unity3d游戏开发之UV贴图教程 一、理解UV贴图UVs是驻留在多边形网顶点上的两维纹理坐标点,它们定义了一个两维纹理坐标系统,称为UV纹理空间,这个空间用U和V两个字母定义坐标

Unity3D游戏开发之委托(Delegate) Unity3D游戏开发之委托(Delegate)1、定义delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一

数独算法 最近迷上了玩数独。每次我玩上了什么游戏,总想自己也做一个。于是就自己写了一个数独的生成算法。最终的成果是这样的:程序能很快速的生成各

标签: unity 3d脚本编程

本文链接地址:https://www.jiuchutong.com/biancheng/373028.html 转载请保留说明!

上一篇:unity游戏之羊刀与Pendragon复盘:DotA做对了什么

下一篇:unity3d游戏开发之UV贴图教程(Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社)

  • 等线支付给劳务派遣单位的工资怎么做账
  • 房租雇东不开发票只有收据怎么处理?
  • 兼职劳务报酬需要发票吗
  • 购货方收到红字发票
  • 短期借款属于经营性资产吗
  • 小规模纳税人零申报要报哪些税
  • 转让财产收入征税吗
  • 员工内部跑步活动费用怎么做分录?
  • 企业基本保险
  • 销售商品确认收入的时间
  • 应税销售额是指
  • 小规模企业申请破产流程
  • 承包承租经营单位是什么意思
  • 行政事业单位会计基础工作规范
  • 分公司可以单独签协议吗
  • 土地税返还的会计分录
  • 高新企业申报指南
  • 企业所得税汇算清缴网上申报流程
  • 社保费现金收缴管理制度
  • 技术服务的大类包括
  • 境内单位和个人将船舶出租到境外的,不征收车船税
  • 购买一台电脑会计分录
  • win10远程连接提示身份验证错误
  • 误删的文件怎么撤回
  • 撤销与恢复快捷键分别是什么
  • zhp.exe是什么进程
  • nginx静态文件服务器
  • php gd gd2
  • php pdo和mysqli
  • php数组查询
  • 对方开了红字信息表我们开发票怎么做账
  • vue cannot set property
  • iis搭建网站教程win10
  • 【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练
  • 安装cuda和cudnn
  • ps调整边缘在哪里快捷键
  • 发票跨月发现开错该怎么办?
  • 什么情况下开劳务费发票
  • 工商年报资产状况纳税总额怎么填
  • element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选
  • c语言缺省值
  • 出口企业为什么免税又退税
  • 清算汇缴报表填写范本
  • 有限公司分公司属于什么类型
  • mysql显示数据库中的表
  • mysql查询语句慢怎么优化
  • 应付职工薪酬的会计科目
  • 会计人员未参加继续教育
  • 建筑施工企业增值税税率调整时间
  • 公司开发新产品时,由管理层任命的
  • 设计部工资计入哪个科目
  • 利润分配未分配利润在报表里怎么体现
  • 现金日记账要如何做账
  • 合同权利义务包含债务吗
  • 税控盘全额抵减如何填写申报表
  • 银行收到货款会计分录怎么做
  • 为什么要把工资说的好高呢
  • 物资采购是
  • 本期盈余结转会亏损吗
  • 差旅费政策
  • 内账外账用一个云盘可以吗
  • 长期股权投资损益调整怎么回事
  • 公司支付质保金怎么做账
  • 成本会计和管理会计哪个好
  • 企业代购是什么意思
  • ubuntu磁盘空间突然满了
  • 2015年win10共发布135个安全补丁 创历年之最
  • find命令支持哪些查找方式
  • linux备份的文件bak如何恢复
  • linux计划任务每天执行一次
  • 使用jquery插件的好处
  • javascript标题
  • 很不错的词语
  • 魅蓝notezol
  • eclipse运用
  • 广东省社保局打印参保缴费凭证
  • 税务稽查预警指标
  • 企业医院和事业医院的区别
  • 福建省运会2022年
  • 中国有没有豁免权
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设