文档章节

【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生

王选易
 王选易
发布于 2014/05/30 15:18
字数 872
阅读 362
收藏 0

<p>作者:<a href="http://weibo.com/wangxuanyihaha">王选易</a>,出处:<a href="http://www.cnblogs.com/neverdie/">http://www.cnblogs.com/neverdie/</a> <strong>欢迎转载</strong>,也请保留这段声明。如果你喜欢这篇文章,请点<strong>推荐</strong>。谢谢!</p> <blockquote> <p><a href="http://static.oschina.net/uploads/img/201405/30151827_wwKU.jpg"><img title="QQ图片20140529123319" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="QQ图片20140529123319" src="http://static.oschina.net/uploads/img/201405/30151827_snhv.jpg" width="254" height="120" /></a></p> </blockquote> <h3>引子</h3> <p>上一次我们讲了<a href="http://www.cnblogs.com/neverdie/p/3758829.html">GameObject,Compoent,Time,Input,Physics</a>,其中Time,Input,Physics都是Unity中的全局变量。GameObject是游戏中的基本物件。GameObject是由Component组合而成的,GameObject本身必须有Transform的Component,这也加深了我们对GameObject的理解,即GameObject是游戏场景中真实存在,而且有位置的一个物件。</p> <p>但是我们怎么操纵这个GameObject呢?这就需要引入脚本组件了,也就是今天讲的MonoBehaviour</p> <h3>MonoBehaviour的生命周期</h3> <p>MonoBehaviour是Unity中所有脚本的基类,如果你使用JS的话,脚本会自动继承MonoBehaviour。如果使用C#的话,你需要显式继承MonoBehaviour。</p> <p>在我们使用MonoBehaviour的时候,尤其需要注意的是它有哪些可重写函数,这些可重写函数会在游戏中发生某些事件的时候被调用。我们在Unity中最常用到的几个可重写函数是这几个:</p> <ul> <li>Awake:当一个脚本实例被载入时Awake被调用。我们大多在这个类中完成成员变量的初始化 </li> <li>Start:仅在Update函数第一次被调用前调用。因为它是在Awake之后被调用的,我们可以把一些需要依赖Awake的变量放在Start里面初始化。 同时我们还大多在这个类中执行StartCoroutine进行一些协程的触发。要注意在用C#写脚本时,必须使用StartCoroutine开始一个协程,但是如果使用的是JavaScript,则不需要这么做。 </li> <li>Update:当MonoBehaviour启用时,其Update在每一帧被调用。 </li> <li>FixedUpdate:当MonoBehaviour启用时,其 <a href="http://game.ceeger.com/Script/MonoBehaviour/MonoBehaviour.FixedUpdate.html">FixedUpdate </a>在每一<strong>固定帧</strong>被调用。 </li> <li>OnEnable:当对象变为可用或激活状态时此函数被调用。 </li> <li>OnDisable:当对象变为不可用或非激活状态时此函数被调用。 </li> <li>OnDestroy:当MonoBehaviour将被销毁时,这个函数被调用。 </li> </ul> <p>下面用一张图来更形象地说明一下这几个类的在MonoBehaviour的生命周期中是如何被调用的:</p> <p><a href="http://static.oschina.net/uploads/img/201405/30151828_IGCq.png"><img title="lifecycle" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="lifecycle" src="http://static.oschina.net/uploads/img/201405/30151830_8F0h.png" width="804" height="1088" /></a></p> <p>在上面这个图里,比较难以理解的就是Coroutine究竟是怎么回事?别着急,之后我们会单独写一篇博客来讲这件事。</p> <p>&#160;</p> <h3>MonoBehaviour的那些坑</h3> <ul> <li>私有(private)和保护(protected)变量只能在专家模式中显示.属性不被序列化或显示在检视面板. </li> <li>不要使用命名空间(namespace) </li> <li>记得使用 <strong>缓存组件查找, </strong>即在MonoBehaviour的长远方法中经常被访问的组件最好在把它当作一个私有成员变量存储起来。 </li> <li>在游戏里经常出现需要检测敌人和我方距离的问题,这时如果要寻找所有的敌人,显然要消耗的运算量太大了,所以最好的办法是将攻击范围使用Collider表示,然后将Collider的isTrigger设置为True。最后使用OnTriggerEnter来做攻击范围内的距离检测,这样会极大提升程序性能。 </li> </ul> <h3>总结</h3> <p>在MonoBehaviour中最难理解的是Coroutine是如何实现的,但是如果在一篇博客里面写Coroutine的话,未免显得太长,我会在下一篇博客中写有关Coroutine的内容。</p>

© 著作权归作者所有

王选易

王选易

粉丝 99
博文 20
码字总数 20066
作品 3
南京
程序员
私信 提问
加载中

评论(0)

Unity网络多玩家游戏开发教程第1章Unity自带网络功能

Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持。但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说...

大学霸
2014/10/30
1.2K
1
Unity MMORPG游戏开发教程(一)——初识Unity

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑。本系列文章以C#为介绍语言,基于Unity2017.4.x。 一、环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己搜资料,步骤差不多...

五邑隐侠
2019/03/06
0
0
C#脚本实践(二): Unity脚本机制分析

目前我了解到使用Mono做脚本的只有Unity和SecondLife, SpringEngine也有个扩展实现. 当然, 最成熟的还是Unity 于是下载了一个看看它的脚本是怎么应用的 它的编辑器界面很简洁, 实际操作了一下...

长平狐
2012/11/12
888
1
C#开发Unity游戏教程之游戏对象的属性变量

C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性——变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象。上...

大学霸
2015/07/07
1.2K
0
【Unity3D基础概念】给初学者看的Unity概览(一):GameObject,Compoent,Time,Input,Physics

点击进入我的新博客 作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢! Unity3D重要模块的类图 最近刚刚完成了一个...

王选易
2014/05/29
1.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java BigDecimal 如何去掉末尾多余的 0

Java BigDecimal 如何去掉末尾多余的 0 呢? /** * To StripTrailingZeros */ @Test public void bigDecimalStripTrailingZerosTest() { BigDecimal bi......

honeymoose
今天
43
0
衡水哪里可以开发票-中国新闻网

衡水哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种连...

457192
今天
60
0
张家口哪里可以开发票-中国新闻网

张家口哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种...

253878
今天
66
0
黑龙江哪里可以开发票-中国新闻网

黑龙江哪里可以开发票【1.3.2 - 2.9.3.0 - 0.5.6.8.】李生,adb的全称为Android Debug Bridge,是Android手机通用的一个USB端口。百度CarLife的部分车机采用了该种...

富大范
今天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部