日志标签:MonoBehaviour

MonoBehaviour类Invoke, Coroutine

时间:2014年02月18日作者:小侃评论次数:0

MonoBehaviour概述

MonoBehaviour 表示一个单一的行为。Unity中用户对游戏对象的操作被分割成若干个单一行为。每个单一行为都作为一个MonoBehaviour类来封装。再生成每个MonoBehaviour类的实例,并作为组件嵌入游戏对象。然后按照一定的顺序(从下到上)调用每个对象的重载方法来实现游戏对象的全部行为。

 

创建

在菜单Assets->create中选择javascript活C# script创建一个脚本类。Unity规定:这些类都必须继承自MonoBehaviour。javascript 的脚本类自动继承MonoBehaviour,c#脚本类必须显式继承这个类。

 

特别之处

继承自MonoBehaviour的类,不需要自己创建它的实例,也不能自己创建(如 new 类名)。因为所有从MonoBehaviour继承过来的类,unity都会自动创建实例,并且调用被重载的方法,如我们经常用到的Awake,Start, Update等。而普通类,就可以用new来创建实例了。

 

异步函数

在一个方法执行时调用另一个方法。而被调用的方法或者其中的某些语句不是立刻执行,而是过一段时间后才执行。

MonoBehaviour提供了两种异步方法

调用(Invoke)

协程(Coroutine)

 

 

调用(Invoke)

function Invoke (methodName: string, time : float) : void

functionInvokeRepeating (methodName : String,time : float, repeatRate : float) : void

function CancelInvoke () : void

function IsInvoking (methodName: string) : bool

 

协程(Coroutine)

function StartCoroutine (routine: IEnumerator) : Coroutine

function StartCoroutine (methodName: string, value : object = null) :

function StopCoroutine (methodName: string) : void

function StopAllCoroutines () : void

 

协程介绍

协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一 个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

 

Unity中协程

一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。StartCoroutine函数是立刻返回的,但是yield可以延迟结果。直到协同程序执行完毕。

 

function StartCoroutine (routine: IEnumerator) : Coroutine

参数表:IEnumerator

IEnumerator是枚举数接口。函数需要一个实现了这个接口的YieldInstruction对象。可以创建一个WaitForSeconds对象,在它的构造函数中传入挂起时间。

返回值:Coroutine

只用来表示一个协同程序实例的引用。没有任何暴露的变量和函数。一个coroutine是一个函数,它能在中断完成前挂起执行。

 

function StartCoroutine (methodName: string, value : object = null) : Coroutine

直接传入一函数名,开销大些。

 

比较

Invoke方法:执行没有被挂起,相当于设置完被调用函数的执行时间后即时向下执行。应用到没隔一段时间执行某个函数很方便。

Coroutine方法:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束。开销不大。当需要挂起当前执行时使用。比如Player死了一条命后消失,再过1.5秒后重新出现,就可以用将协同程序挂起。

gameObject.renderer.enabled= false;

yieldWaitForSeconds(1.5f);

gameObject.renderer.enabled= true;

Unity3d之MonoBehaviour的可重写函数整理

时间:2014年02月18日作者:小侃评论次数:0

Update

当MonoBehaviour启用时,其Update在每一帧被调用。

LateUpdate

当Behaviour启用时,其LateUpdate在每一帧被调用。

FixedUpdate

当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。

Awake

当一个脚本实例被载入时Awake被调用。

Start

Start仅在Update函数第一次被调用前调用。

Reset

重置为默认值。

OnMouseEnter

当鼠标进入到GUIElement(GUI元素)或Collider(碰撞体)中时调用OnMouseEnter。

OnMouseOver

当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver .

OnMouseExit

当鼠标移出GUIElement(GUI元素)或Collider(碰撞体)上时调用OnMouseExit。

OnMouseDown

当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用OnMouseDown。

OnMouseUp

当用户释放鼠标按钮时调用OnMouseUp。

OnMouseUpAsButton

OnMouseUpAsButton只有当鼠标在同一个GUIElement或Collider按下,在释放时调用。

OnMouseDrag

当用户鼠标拖拽GUIElement(GUI元素)或Collider(碰撞体)时调用 OnMouseDrag 。

OnTriggerEnter

当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。

OnTriggerExit

当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。

OnTriggerStay

当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。

OnCollisionEnter

当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将被调用。

OnCollisionExit

当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。

OnCollisionStay

当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。

OnControllerColliderHit

在移动的时,当controller碰撞到collider时OnControllerColliderHit被调用。

OnJointBreak

当附在同一对象上的关节被断开时调用。

OnParticleCollision

当粒子碰到collider时被调用。

OnBecameVisible

当renderer(渲染器)在任何相机上可见时调用OnBecameVisible。

OnBecameInvisible

当renderer(渲染器)在任何相机上都不可见时调用OnBecameInvisible。

OnLevelWasLoaded

当一个新关卡被载入时此函数被调用。

OnEnable

当对象变为可用或激活状态时此函数被调用。

OnDisable

当对象变为不可用或非激活状态时此函数被调用。

OnDestroy

当MonoBehaviour将被销毁时,这个函数被调用。

OnPreCull

在相机消隐场景之前被调用。

OnPreRender

在相机渲染场景之前被调用。

OnPostRender

在相机完成场景渲染之后被调用。

OnRenderObject

在相机场景渲染完成后被调用。

OnWillRenderObject

如果对象可见每个相机都会调用它。

OnGUI

渲染和处理GUI事件时调用。

OnRenderImage

当完成所有渲染图片后被调用,用来渲染图片后期效果。

OnDrawGizmosSelected

如果你想在物体被选中时绘制gizmos,执行这个函数。

OnDrawGizmos

如果你想绘制可被点选的gizmos,执行这个函数。

OnApplicationPause

当玩家暂停时发送到所有的游戏物体。

OnApplicationFocus

当玩家获得或失去焦点时发送给所有游戏物体。

OnApplicationQuit

在应用退出之前发送给所有的游戏物体。

OnPlayerConnected

当一个新玩家成功连接时在服务器上被调用。

OnServerInitialized

当Network.InitializeServer被调用并完成时,在服务器上调用这个函数。

OnConnectedToServer

当你成功连接到服务器时,在客户端调用。

OnPlayerDisconnected

当一个玩家从服务器上断开时在服务器端调用。

OnDisconnectedFromServer

当失去连接或从服务器端断开时在客户端调用。

OnFailedToConnect

当一个连接因为某些原因失败时在客户端调用。

OnFailedToConnectToMasterServer

当报告事件来自主服务器时在客户端或服务器端调用。

OnMasterServerEvent

当报告事件来自主服务器时在客户端或服务器端调用。

OnNetworkInstantiate

当一个物体使用Network.Instantiate进行网络初始化时调用。

OnSerializeNetworkView

在一个网络视图脚本中,用于自定义变量同步。