位置: 编程技术 - 正文

Unity3D中脚本的执行顺序和编译顺序(unity3d脚本怎么用)

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

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

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

事件函数的执行顺序

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

我们可以做一个小实验来测试一下: 在Hierarchy视图中创建三个游戏对象,在Project视图中创建三条脚本,如下图所示,然后按照顺序将脚本绑定到对应的游戏对象上: 三条脚本的代码完全一样,只是做了一点名称上的区分:

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

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

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

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

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

脚本的执行顺序然后我们来看看这样一种情况:在脚本0的Awake方法中创建一个立方体对象,然后在脚本2的Awake方法中去获取这个立方体对象。代码如下:

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

那么实际项目中的脚本会非常多,它们的先后执行顺序我们谁也不知道(有人说是按照栈结构来执行的,即后绑定到游戏对象上的脚本先执行。这一点可以从上面的例子中得到,但官方并没有这么说,还得进一步深入研究)。但一般的,建议在Awake方法中创建游戏对象或Resources.Load(Prefab)对象,然后在Start方法中去获取游戏对象或者组件,因为事件函数的执行顺序是固定的,这样就可以确保万无一失了。另外,Unity也提供了一个方法来设置脚本的执行顺序,在Edit -> Project Settings -> Script Execution Order菜单项中,可以在Inspector面板中看到如下图所示:

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

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

Unity3D中脚本的执行顺序和编译顺序(unity3d脚本怎么用)

脚本的编译顺序

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

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

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

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

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

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

如果项目中这三种脚本都存在,那么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间存在的依赖关系所决定的。

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

关于Unity协同程序的全面解析 1.什么是协调程序unity协程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。它类一个子线程单独出来处理一些问题,性能开

Unity中使用UGUI与ScrollView的练习 一、相关组件ScrollRectMaskGridLayoutGroupScrollbar二、步骤1、创建一个Panel,命名为ScrollRect,添加ScrollRect组件2、在ScrollRect下创建一个子Panel,命名为Grid,添加Gri

Unity的安卓上的移动C#脚本 usingUnityEngine;usingSystem.Collections;publicclassMobileMove:MonoBehaviour{publicfloatspeed=0.3F;voidUpdate(){if(Input.touchCount0Input.GetTouch(0).phase==TouchPhase.Moved){Vector2touchDeltaPosition

标签: unity3d脚本怎么用

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

上一篇:Unity中利用UGUI添加滑动页面和滑动条(unity怎么添加ui界面图片)

下一篇:关于Unity协同程序的全面解析(unity协程的工作原理)

  • 增值税留抵抵欠情况说明怎么写
  • 增值税进项税额转出是什么意思
  • 企业收到投资者投入的生产设备,其账务处理
  • 返利应计入什么科目
  • 总资产报酬率的公式
  • 税收滞纳金计入营业外支出的哪一项
  • 没申报可以开票嘛
  • 生鲜配送公司财务制度
  • 商誉转销会计分录
  • 上个月普通发票怎么作废
  • 微信手续费发票可以抵扣吗?
  • 投资支付的现金增加说明什么
  • 对供应商罚款通知单怎么写
  • 一般纳税人预交税款算法
  • 营改增后小规模纳税人
  • 电信宽带费发票专票
  • 处理固定资产如何开票
  • 核定征收是不是不需要发票了
  • 纳税人拒不缴滞纳金是否可单独强制执行
  • 收到的会费计入什么会计科目
  • 少计提增值税0.01计入营业外
  • 1697511215
  • 香港公司可以给个人打款吗
  • 什么是应收
  • 设计费和勘察费的会计科目
  • PHP:curl_share_close()的用法_cURL函数
  • 关于农产品的法律
  • 税法的构成要素中,()是税法最基本的要素
  • 企业收回应收账款会计分录
  • 补交上年度增值税附加税,怎么做账
  • php发送qq邮箱
  • 混合销售与兼营行为的区别
  • 应交税金应交增值税科目设置
  • 花卉苗木栽培技术
  • 房地产企业出售房产增值税
  • 法人可以开个人票会怎么样
  • wordpress site
  • 免费学电脑网站
  • 全国通用机打销售票真伪
  • 总公司签合同开票分公司做业务分公司如何确认收入?
  • 资产负债表日后事项是指资产负债表日之后至审计报告
  • 招待客人有什么讲究
  • 委托加工物资的成本包括
  • 管理费用算营业外支出吗
  • 清算中的资产损失
  • 应缴财政专户款年末有余额吗
  • 股东撤资如何退还资金,用途写什么
  • 账外房屋按评估值入账怎么进行会计处理
  • 注册资本及构成
  • 滞纳金冲留底税额怎么算
  • 员工拿发票报销怎么做账
  • 保险公司收车船税返还手续费犯罪
  • 应收票据和应付票据可以对冲吗
  • 购入原材料结转成本怎么算
  • 免税发票可以抵扣税收农产品吗
  • 什么叫残保金减免
  • Fedora Core 5.0 安装教程,菜鸟图文教程(linux text)
  • ubuntu顶部菜单栏
  • swimsuitnetwork.exe - swimsuitnetwork是什么进程 有何作用
  • centos7手册
  • win xp系统安装
  • win10系统无法安装ie11
  • win10每周更新
  • win8.1最流畅
  • cocos2d怎么用
  • cocos做游戏
  • ExtJS4 表格的嵌套 rowExpander应用
  • unity3d spine
  • jquery mobile demo
  • 新手入门常用代词有哪些
  • androidstudio和idea
  • 已申报的纳税申报表怎么修改
  • 国家税务局申请电子发票怎么申请
  • 重庆市电子税务局官网登录入口注册
  • 发票机怎么测试打印
  • 发货确认收入还是以开票确认收入
  • 供热用地规划指标
  • 什么是美国注册商标
  • 扣缴个人所得税客户端操作流程
  • 商品房开超市
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设