玄高从小就很聪明,出家后学习十分刻苦,进步很快,15岁时便能为山僧说法。后来,他又来到麦积山,收徒授学,教习禅道。但太子拓跋晃却笃信佛教,奉玄高为师。本对佛教成见很深的拓拨焘听闻此言大怒,立即下令逮捕玄高。太平真君五年九月十五日,两人同时遇害,玄高时年43岁。......
2023-12-05
Unity面向组件开发,游戏物体想要实现什么样的功能,只需要添加相对应的组件就可以了,此时会在属性面板上显示出来。可以像添加组件一样把脚本添加到游戏物体上。而MonoBehaviour是Unity中所有脚本的基类,如果使用JS的话,脚本会自动继承MonoBehaviour。如果使用C#的话,需要显式继承MonoBehaviour。
在使用MonoBehaviour的时候,需要注意有哪些可重写函数,这些可重写函数会在游戏中发生某些事件的时候被调用。在Unity中最常用到的几个可重写函数是这几个:
(1)Awake:当一个脚本实例被载入时Awake被调用。我们大多在这个类中完成成员变量的初始化
(2)OnEnable:当对象变为可用或激活状态时此函数被调用。
(3)Start:仅在Update函数第一次被调用前调用。因为它是在Awake之后被调用的,我们可以把一些需要依赖Awake的变量放在Start里面初始化。同时我们还大多在这个类中执行StartCoroutine进行一些协程的触发。要注意在用C#写脚本时,必须使用StartCoroutine开始一个协程,但是如果使用的是JavaScript,则不需要这么做。
(4)Update:当MonoBehaviour启用时,其Update在每一帧被调用。
(5)FixedUpdate:当MonoBehaviour启用时,其FixedUpdate在每一固定帧被调用。
(6)LateUpdat方法:是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
(7)OnGUI方法:渲染和处理GUI事件时调用(注意:这里不是每帧都调用)
(8)OnDisable:当对象变为不可用或非激活状态时此函数被调用。
(9)OnDestroy:当MonoBehaviour将被销毁时,这个函数被调用。
接下来,先看一下,关于MonoBehavior这个类的继承关系(见图7-55)。
从图7-55可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的角色,当我们需要将一个自定义脚本以组件的形式添加到对应的GameObject时,该脚本是必须要继承MonoBehaviour。所以综上MonoBehaviour的作用就是开发者可以自定义自己的组件类。
当我们拥有自己的组件类时,我们会对类的生命周期,和一些重要的接口感兴趣,以便在使用过程中,不那么疑惑。图7-56就是MonoBehaviour的生命周期流程。
图7-55 关于MonoBehavior这个类的继承关系
首先我们可以将这张图分成两种状态:
(1)编辑器下的状态:可以单击设置,Reset函数,将脚本恢复默认状态。
(2)运行状态(真正的生命周期):除Reset函数外,其余函数都在运行状态执行(加特殊字段,该脚本也可已在编辑器运行)。
图7-56 MonoBehaviour的生命周期流程
我们主要关心的是在运行状态,因为此时脚本的生命周期真正开始,如图7-57所示。
图7-57 运行模式状态
当单击Unity3D的Play按钮时,脚本会从编辑器模式进入运行模式,会先走Initialization步骤,从名字可以看出,该步骤做的是初始化操作,且确定了三个函数的调用时序。那么三个函数有什么区别呢:
(1)Awake。调用条件:gameObj is Active(场景开始时当前obj的Active是true)或者在Instantiate一个Prefab之后。(www.chuimin.cn)
注意:总是在所有脚本调用Start之前调用,如7-58所示。
图7-58 Awake调用
Awake函数只调用一次。
(2)OnEnable。调用条件:当执行完Active时。
注意事项:将enable=false,会在执行完OnEnable后,直接执行OnDisable,在OnDisable设置enable=true就会跳到OnEnable(切记不要出现死循环)。
(3)Start。调用条件:OnEnable执行完。
注意事项:Start只会执行一次,无论下次第几次调用到OnEnable,均不会在执行(适合初始化)。
上述是生命周期的开始,这里暂时不讲生命周期运行,直接将生命周期的结束,如图7-59所示。
图7-59 生命周期的结束
OnApplicationQuit:当应用程序退出时,会先调用OnApplicationQuit(可以在此时来save你的数据)。
OnDisable:除在OnApplicationQuit调用时会调用,还会再设置enable=false或active=false调用。
OnDestory:除在OnApplicationQuit调用时会调用,还有在手动的Destory gameObject时。
讲完了生命周期的开始和结束,接下来介绍最重要的部分,如图7-60所示。
图7-60 生命周期的中间部分
上述有很多Update和很多yield,可以从上述看到三个Update调用的顺序,FixedUpdate→Update→LateUpdate,如图7-61所示。
由此可见,Unity是调用完所有脚本的FixedUpdate,在调用所有脚本的Update,在调用所有脚本的LateUpdate。
关于协程中的yield其实很好理解,如图7-62所示。
图7-61 Update调用的顺序
图7-62 协程中的yield
比如yield null,表示当函数运行到此处时,会挂起(中断),等下一帧,所有的脚本Update运行完后,会继续执行此函数。所以上图的意思是回去检测所有因yield null挂起的协程并恢复。
有关虚拟现实理论基础与应用开发实践的文章
玄高从小就很聪明,出家后学习十分刻苦,进步很快,15岁时便能为山僧说法。后来,他又来到麦积山,收徒授学,教习禅道。但太子拓跋晃却笃信佛教,奉玄高为师。本对佛教成见很深的拓拨焘听闻此言大怒,立即下令逮捕玄高。太平真君五年九月十五日,两人同时遇害,玄高时年43岁。......
2023-12-05
尝试添加一个刚体到刚创建的物体上。选择该物体并从菜单中选择Component→physics→Rigidbody。它们使用一个粒子发射器,粒子动画和粒子渲染器来创建一组移动的粒子。音频剪辑是一个引用属性。移除组件如果你想移除一个组件,在检视面板的头部使用option-或右击然后选择移除组件。例如,如果你想访问变换组件的变换功能,你只需要使用transform.Translate()或gameObject.transform.Translate()。使用GetComponent()有许多组件不能成为一个游戏物体类的成员。通过调用GetComponent并存储一个引用到结果中。......
2023-10-17
首先创建一个文件夹Animation用来存放GameController文件,在文件夹内右击新建一个Animator Controller。图8-163发现新Tab将PlayerController放到主角身上的Animator组件里面的Controller。图8-173加入函数到Update()图8-174主角移动,播放Move动画又一个bug出现,主角停下来时,还是播放Move动画,因为刚刚的Animator并没有设计从Move状态转为Idle状态的条件。图8-175主动停止,仍在播放Move动画isMoving设置false,再运行游戏,主角就正常的Move和Idle了。......
2023-10-17
图8-177CameraFollow脚本offset是相机初始时与主角之间的距离,speed是相机移动的速度,target设置为public,待会直接拖动主角挂到这里。Lerp是插值的概念,简单来说就是使相机平滑地移动而不是瞬间移位。图8-178脚本挂到相机将游戏场景中的物体加入BoxColider。图8-179加入BoxColider单击Window→Navigation自动寻路组件,Unity只对静止的物体计算,选中所有的场景物体,选择static项。图8-183加入NavMeshAgent组件图8-184添加Player标签图8-185怪物出生点设置图8-186新建脚本EnemyManager将这个脚本挂在一个空物体上。......
2023-10-17
图8-199制作主角血条主角血条的制作:选择Create→UI→Image选项单击SourceImage,选中爱心的图形。右击Canvas→UI→Slider按钮,选择Background选项。图8-200选中爱心图形图8-201选中锚点图8-202调整Image的位置及大小图8-203选中Background图8-204更改SourceImage图8-205删去白色小球Slider上的白色小球是不需要的,整个删去。图8-206血条属性更改血条的大小位置自行调整,做完大概如图8-207所示。图8-208PlayerHealth脚本最后一步,将刚刚做好的血条赋给PlayerHealth里的血条变量。......
2023-10-17
移动VR一般受到一些设备的限制,操作方式比较有限。现在需要添加移动VR专属的角色控制脚本。运行游戏,检测移动VR的编辑器模拟模式。角色可以顺利跟随导航标识移动到目标位置。图9-121确定Mouse Control是否勾选图9-122检测移动VR的编辑器模拟模式在VRUIPanel中有这么一段代码:主要就是为了Cardboard而实现的Cardboard输入操作就是通过这个Input.GetTouch来实现的。......
2023-10-17
图5-15结构表示意图3)过渡运动构建运动图的核心思想就是在不同运动之间寻找过渡点,在相似帧之间构造过渡运动,把初始的运动集组织成一个图结构。......
2023-10-17
打开任意一个场景,创建一个新的游戏物体,选择他并查看检视面板。当一物体是另外一些物体的父物体时,这个物体的旋转将影响所有的子物体。这将在两个物体之间创建父子关系。需要指出的是所有子物体的变换值都是相对于父物体的,这个被称为局部坐标。例如键入transform等同于gameObject.transform。前面的gameObject是编译器自动加入的,除非你要指定一个不同的物体。使用this.gameObject可以访问该脚本所依附的游戏物体,当然你可以简单的使用gameObject来访问此游戏物体。......
2023-10-17
相关推荐