andyhebear 发表于 2018-8-14 15:57

[C#]【笔记】Unity3D中MonoBehaviour类整理

本帖最后由 andyhebear 于 2018-8-14 16:00 编辑

继承层次:Object->Component->Behaviour->MonoBehaviour
MonoBehaviour是所有脚本的基类,使用javascript的话,每个脚本都会自动继承自MonoBehaviour,但使用C#或Boo就必须显式从MonoBehaviour继承。

注意:复选框控件(在编辑中)仅仅会阻止Start、Awake、Update、FixedUpdate和OnGUI函数的执行,如果这些函数中没有一个出现,则复选框就不会显示。


变量:
bool useGUILayout;若为false,就可以跳过GUI布局阶段。仅仅在本次OnGUI调用中不使用GUI.Window和GUILayout时被使用。


函数:
定时器相关:
void CancelInvoke(); 取消在这个脚本上的所有调用
void CancelInvoke(string methodName); 取消在这个脚本上所有名字为methodName的调用

void Invoke(string methodName, float time); 在time时间内调用名字为methodName的函数

void InvokeRepeating(string methodName, float time, float repeatRate); 在time时间内调用名字为methodName的函数,此后每repeatRate秒就调用一次该函数
bool IsInvoking(); 该MonoBehaviour上是否有等候调用的函数
bool IsInvoking(string methodName); 名字为methodName的函数是否在等候调用

协程相关:
Coroutine StartCoroutine(IEnumerator routine); 开启一个协程,利用yield语句暂停在某点,yield返回值指定了什么时机协程恢复。对于多帧执行一次的行为非常适合用协程解决,它几乎没有什么性能开销。该函数总是会立即返回,然而可以yield结果,这样可以等到协程执行完成返回。使用javascript不需要显示调用该函数,因为编译器已经为你调用了,而C#中必须显示调用。
Coroutine StartCoroutine(string methodName, object value = null); 开启指定名字的协程。主要应用的场合是,当使用指定函数名字来开启协程时,就可以使用StopCoroutine来终止指定名字的函数。限制是仅能传递一个参数,而且有更高的运行时代价。
void StopAllCoroutines(); 终止运行在该MonoBehaviour上的所有协程。
void StopCoroutine(string methodName); 终止运行在该MonoBehaviour上的所有名字为methodName的协程。仅仅StartCoroutine的字符串版本开启的协程才可以使用该函数进行终止。


静态函数:static void print(object message); 在Unity Console上登记日志,功能等同于Debug.Log。


消息:
void Reset(); 当脚本第一次被挂到object上或用户点击Inspector视图中Reset按钮时,Reset函数被调用来初始化脚本属性。Reset函数仅可以在编辑模式下被调用,最常用于在Inspector视图中呈现好的默认值。
void OnValidate(); 当脚本被加载或Inspector中某个值被改变时,该函数被调用,仅能在编辑器状态下使用。用于确保在编辑器中修改数据,该数据可以保持在特定范围内。

void OnLevelWasLoaded(int level); 当一个新的level被加载之后调用该函数,可以做协程。可以在File->Build Settings中看到该level具体指的是哪个Scene。
void Awake(); 游戏启动之前用于初始化任何变量和游戏状态,在脚本实例生命周期中仅被调用一次,不能做协程。Awake函数是在所有objects实例化之后被调用的,因而可以安全地同其它objects通信或查询等;同时,Awake函数是在任何Start函数之前被调用的,因而我们可以规定脚本的初始化顺序。objects之间Awake函数的调用没有先后顺序规定,因而可以利用Awake函数建立脚本之间的引用,再使用Start函数来回传递信息。(对于C#、Boo用户,当构造时组件序列化状态没有定义,就应该使用Awake代替构造函数来初始化)。
void Enable(); 只有object是激活状态下才可被调用,在object可用之后被调用,这通常发生于MonoBehaviour实例被创建时,不能做协程。
void Start(); 如果脚本实例是enabled的,则Start函数在第一帧更新之前被调用,在脚本实例生命周期中仅被调用一次。不论脚本enabled与否,Awake函数都会调用;假如初始化期间脚本disabled,则Start函数就不会与Awake函数在同一帧中被调用。Awake函数和OnEnable函数一定是在Start函数之前调用(好处是:object A实例化代码依赖于object B实例化,B的实例化就应该在Awake阶段完成,A的实例化就在Start阶段完成)。注意:对于添加到场景中的objects,所有脚本的Start函数都会在任何脚本调用Update等函数之前被调用。但是,在gameplay期间实例化objects,就不能强制遵循这个规则了。
void OnDisable(); 当行为不可用或非激活时,该函数被调用。当对象被销毁时,或对于任何清理工作的代码,该函数同样可被调用。当编译完成之后重新加载脚本,该函数可被调用,脚本加载完成时调用OnEnable函数。该函数不可以做协程。

void OnDestroy(); 在对象存在的最后一帧中,OnDestroy这个函数在所有帧更新之后被调用,该函数仅仅会在那些先前状态为active的对象上被调用。对象被销毁来响应Object.Destroy或关闭一个场景,该函数不可以是协程。


void FixedUpdate(); 假如MonoBehaviour是enabled时,该函数在固定帧率的每帧中被调用一次。比Update函数的调用更频繁;当帧率比较低时,每帧可被多次调用,如果帧率比较高,就可能不会被调用;所有的物理计算和更新都在FixedUpdate函数之后立即发生;当在FixedUpdate函数中计算物体移动时,不需要乘以Time.deltaTime,因为FixedUpdate函数是基于可靠的定时器,与帧率无关。
void Update(); 假如MonoBehaviour是enabled时,该函数每帧被调用一次,是最主要最常用的帧更新函数。为了得到从上一帧调用Update函数到现在消耗的时间,需要使用Time.deltaTime。
void LateUpdate(); 假如MonoBehaviour是enabled时,该函数每帧被调用一次,在Update函数之后执行;LateUpdate函数最常应用于第三人称的相机跟随。(如果将角色的移动和旋转放在Update函数中,则可以把相机的移动和旋转都放在LateUpdate函数,从而在相机追踪到角色位置之前,确保角色已经完成了移动。
注意:协程在所有Update函数完成后执行;若在LateUpdate中开启了一个协程,它将在LateUpdate之后渲染之前也会被调用。


void OnAnimatorIK(int layerIndex);动画组件在更新它内部Inverse Kinematics(IK)系统之前调用该函数。可用于设置IK目标位置和他们各自的权重。
void OnAnimatorMove(); 用于修改根运动而处理动画移动时调用。在状态机和动画计算完,OnAnimationIK之前,每帧都会被调用。

void OnAppllicationFocus(bool); 当玩家获得或失去焦点时,该消息被发送到所有游戏对象。该函数可以是协程,假如其作为协程来执行,在初始化帧期间会被用到两次:第一次用作前期消息通知,第二次发生在正常的协程更新步骤中。
void OnApplicationPause(bool); 当玩家暂停游戏,该消息会被发送给所有游戏对象。若暂停被检测到,当前帧执行后就调用OnApplicationPause函数,在正常的帧更新之间调用是有效的。在OnApplicationPause函数被调用后,增加额外的一帧来显示图像表明暂停状态。OnApplicationPause函数可以是协程,假如其作为协程来执行,在初始化帧期间会被用到两次:第一次用作前期消息通知,第二次发生在正常的协程更新步骤中。
void OnApplicationQuit(); 在应用退出之前所有的游戏对象都会调用该函数。在编辑器中当用户停止播放时它将被调用;在webplayer中,当网页关闭时被调用。注意,IOS应用通常暂停并不会退出,所以应该在IOS播放器设置中勾选“Exit on Suspend”,这样会使游戏退出而不是暂停。如果没有勾选就会调用OnApplicationPause函数。
void OnBecameInvisible();void OnBecameVisible(); 当object在任何相机中变得可见/不可见时被调用,该消息被发送到任何挂在渲染器上的脚本。使用这两个函数可以避免不必要的计算,仅当object可见时才进行相应的计算。它们可以是协程。当在编辑器中运行时,场景视图摄像机也会导致它们被调用。

void OnCollisionEnter(Collision collision); 当该碰撞器/刚体开始接触到另一个刚体/碰撞器的时候,该函数被调用,可以做协程。和OnTriggerEnter函数相比,OnCollisionEnter的参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionEnter2D(Collision2D collision); 当传进来的Collider和对象的Collider有接触时该函数被调用(仅限于2D物理)。
void OnCollisionExit(Collision collision); 当该碰撞器/刚体停止碰撞另一个刚体/碰撞器时被调用,可以做协程。和TriggerExit函数相比,OnCollisionExit 参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionExit2D(Collision2D collision); 当传进来的Collider和对象的Collider停止接触时该函数被调用(仅限于2D物理)。
void OnCollisionStay(Collision collision); 对于每一个正在碰触其他刚体/碰撞器的碰撞器/刚体,该函数每帧都会被调用一次,可以做协程。和OnTriggerStay函数相比,OnCollisionStay参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionExitStay2D(Collision2D collision); 当一个对象的Collider和这个对象的Collider正在碰撞时该函数被调用(仅限于2D物理)。
void OnControllerColliderHit(ControllerColliderHit); 当控制器执行时移动时碰到一个Collider上,该函数被调用。当它们碰撞到角色上时被用于推开对象。
void OnParticleCollision(GameObject); 当一个粒子撞到碰撞器上时该函数被调用。用于游戏对象受粒子碰撞时的伤害计算。



void OnConnectedToServer(); 当成功连接到服务器时客户端调用该函数。
void OnDisconnectedFromServer(NetworkDisconnection); 当与服务器连接中断或终止连接时,该函数被调用。
void OnFailedToConnect(); 由于某些原因尝试连接失败时,客户端调用该函数。
void OnFailedToConnectToMasterServer(NetworkConnectionError); 连接到主服务器有问题时服务器端或客户端调用该函数。
void OnMasterServerEvent(MasterServerEvent); 当收到来自主服务器报告事件,该函数被客户端或服务器端调用。
void OnServerInitialized(); 不论何时Network.InitializeServer被触发并完成,服务器会调用该函数。
void OnSerializeNetworkView(BitStream, NetworkMessageInfo); 用于定制脚本中变量的同步,从网络的视角来看。自动决定是否序列化的变量应该被发送或接收。
void OnPlayerConnected(NetworkPlayer); 不论何时玩家成功连接到服务器时,服务器端调用该函数。
void OnPlayerDisconnected(NetworkPlayer); 不论何时玩家与服务器失去连接时,服务器端调用该函数。
void OnNetworkInstantiate(NetworkMessageInfo); 使用Network.Instantiate,对象被网络实例化时被调用。

void OnPreCull(); 在相机剔除场景前被调用,剔除确定了哪些物体在相机中是可见的。仅当脚本挂在相机上并且是enabled时,该函数才会被调用。假如要修改相机的可视化参数(比如FOV,Transform等),就应该在这个函数中进行修改,此后场景中objects的可见性就取决于相机的参数了。
void OnWillRenderObject(); 如果物体可见并且MonoBehaviour是enabled时,在渲染每个经过剔除操作之后的物体之前,它将为每个相机调用一次。
void OnPreRender(); 仅当脚本挂在相机上并且是enabled时,则在相机开始渲染场景之前被调用。假如在这个函数中修改了相机的可视化参数(比如FOV),那么这些参数只会在下一帧中起到作用。该函数可以是协程。
void OnPostRender(); 在相机完成场景的渲染后被调用。与OnRenderObject不同,仅当脚本挂在相机上并且是enabled时,该函数才会被调用。该函数可以做协程。假如想要在所有相机和GUI渲染之后做操作,使用WaitForEndOfFrame协程。
void OnRenderObject(); 在所有固定场景渲染之后被调用,此时你可以使用GL类函数或者Graphics.DrawMeshNow来画自定义的几何体。该函数和OnPostRender函数相似,除了一点:不论脚本挂在相机上与否,OnRenderObject函数都会在任何挂有定义了该函数的脚本的object上被调用。
void OnRenderImage(RenderTexture, RenderTexture); 在场景渲染完成后被调用,用于对屏幕的图像进行后处理,该消息被发送到挂到相机上的所有脚本。该函数允许利用基于shader的过滤器对最终图像进行处理,传入源渲染纹理,终止于目标渲染纹理;当相机有多个图像过滤器时,按照图像顺序进行处理,前一个过滤器的目标渲染纹理作为下一个过滤器的源渲染纹理。
void OnGUI(); 假如MonoBehaviour是disabled时,该函数不会被调用。为响应GUI事件,该函数每帧被调用多次,每个事件就调用一次;执行时先响应布局和重绘事件,随后是为每一次的输入事件执行布局和键盘/鼠标事件。
void OnDrawGizmos(); 为了可视化的目的,在场景视图中绘制小图标。该函数使用相对于Scene视图的鼠标的位置,允许快速挑选场景中重要的objects,当然假如组件在inspector中collapsed,则该函数就不会被调用。

void OnDrawGizmosSelected(); 同OnDrawGizmos,不过只有选中的物体执行。

void OnMouseEnter(); 当鼠标进入GUIElement或Collider时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseExit(); 当鼠标离开GUIElement或Collider时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseDown(); 当用户在GUIElement或Collider上按下鼠标时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseUp(); 当用户释放鼠标按键时,该函数被调用,即使鼠标已经不在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用。可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseUpAsButton(); 当用户释放鼠标按键时,该函数被调用,只在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用。可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseDrag(); 当用户在GUIElement或Collider上点击鼠标并一直按着时该函数被调用,按着鼠标的每一帧中该函数都会被调用,可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseOver(); 当鼠标在GUIElement或Collider上时该函数被调用,按着鼠标的每一帧中该函数都会被调用,可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。

void OnTriggerEnter(Collider); 当碰撞器进入触发器时该函数被调用。该消息被发送给触发器碰撞器和碰到触发器的刚体(假如没有刚体就是碰撞器),但只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerEnter2D(Collider2D); 当另一个对象碰到这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)。
void OnTriggerExit(Collider); 当另一个碰撞器停止碰撞该触发器时该函数被调用。该消息被发送给触发器和碰撞触发器的碰撞器。注意,只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerExit2D(Collider2D); 当另一个对象离开这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)。
void OnTriggerStay(Collider); 对于每一个正在碰撞该触发器的碰撞器,该函数每帧被调用一次。该消息会被发送给触发器和碰撞该触发器的碰撞器,注意,只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerStay2D(Collider2D); 当另一个对象在该对象的触发器碰撞器内时该函数每帧被都会被调用。(仅仅2D物理适用)

void OnJointBreak(float);当连接到同一游戏对象上的关节断裂时被调用。当外力高于关节的breakForce时,关节会断开。当关节断开时,该函数被调用,施加于关节处的断裂外力会被做为参数传入。当该函数完成后,关节会自动从游戏对象上移除。

小小学生 发表于 2018-8-14 16:24

加油 好好学习吧天天向上

Duolan 发表于 2018-8-14 23:42

支持一波LZ!:lol

wushaominkk 发表于 2018-8-15 10:11

一大堆黑麻麻的,麻烦整理下排版

gunxsword 发表于 2018-11-8 15:41

感谢分享,收下了,这个还是很有用的!
页: [1]
查看完整版本: [C#]【笔记】Unity3D中MonoBehaviour类整理