Unity3D的事件函数

       当我们打开unity3D自带的案例AngryBots时,会发现没有像常见程序那样的入口函数(比如,C的main函数,unity3D底层已经做好了吧)。取而代之,脚本中会有很多事件函数,用于响应游戏中消息,每个脚本都会有涉及Start、update等之类的函数负责初始化、更新等事件的处理,更像是一种分布式控制方式。脚本都是继承自MonoBehaviour内建类,以此与Unity内部工作机制相联系,它是一种组件可以挂接到GameObject上,可以改变GameObject的属性。

        Unity的脚本不像常规程序那样,会在一个循环中不断执行知道任务结束,它会通过调用一些事先声明好的事件函数,断断续续地将控制权传给一个脚本。在事件函数执行完毕后,控制权又交回给Unity,只要游戏运行过程中触发了事件,相应的事件函数就会被调用。MonoBehaviour类中定义了很多事件函数,可以自己查看,比较常见的是Awake、Start、FixedUpdate、Update、LateUpdate、OnDestroy、OnDisable、OnEnable、OnGUI等。

        在场景加载时,场景中的所有物体都会调用Awake函数。注意,不管有多少物体的Awake与Start函数被按任意顺序调用。在第一个Start函数调用前,所有的Awake函数都已执行。所以,可以在Start函数中调用任意在Awake函数中初始化过的信息。如果脚本实例化被启用,则Start函数在第一帧更新之前被调用。

        更新函数主要是放置处理GameObject的位置、方向、状态及行为等代码逻辑的地方,我们以此来追踪游戏逻辑、交互、动画、相机位置等。而FixedUpdate、Update、LateUpdate比较如下:

    1.   FixedUpdate:比Update调用更频繁;当帧率比较低时,每帧可被多次调用,如果帧率比较高,就可能不会被调用;所有的物理计算和更新都在FixedUpdate之后立即发生;当在FixedUpdate中计算物体移动时,不需要乘以Time.deltaTime,因为FixedUpdate是基于可靠的定时器的,与帧率无关。
    2. Update:每帧调用一次;帧更新的主要函数。
    3. LateUpdate:每帧调用一次,在Update之后执行;LateUpdate最常应用于第三人称控制器的相机跟随。(如果将角色的移动和旋转放在Update中,则可以把所有相机的移动旋转放在LateUpdate,从而在相机追踪到角色位置之前,确保角色已经完成了移动。

        Unity有个系统,用来渲染并响应GUI控件,这类代码不像普通的帧更新代码一样,必须放在周期性调用的OnGUI函数里。也可以检测场景中一个物体的鼠标事件,可用于实现指向性武器与展示鼠标下角色信息之类的需求。有个OnMouseXXX 事件函数集(OnMouseOver,OnMouseDown), 它们专门用于反馈用户鼠标行为。例如,鼠标点击一个物体时,这个物体挂的脚本的OnMouseDown函数就会被调用(如果有的话)。 

        物理引擎通过物体挂的脚本中的事件函数,来通知它发生了碰撞。OnCollisionEnter, OnCollisionStay, OnCollisionExit 函数分别在碰撞开始,持续与结束时调用。如果碰撞体设置成了触发器(用于只需要检测碰撞,而不需要对此碰撞进行物理反应的情况),那么会调用对应的OnTriggerEnter,OnTriggerStay,OnTriggerExit函数。如果一次物理更新中发生了多次碰撞,这些函数可能会被调用多次。这些函数会被传入一些碰撞的信息(碰撞位置,撞得物体是谁,等等)。

        MonoBehaviour类的详细事件函数列表可参考Unity3D的Documentation

            



你可能感兴趣的:(游戏开发,游戏,unity3d,事件函数)