[组件笔记]7.UnityEngine.MonoBehaviour
public class MonoBehaviour : Behaviour{}
MonoBehaviour
是一个基类继承自UnityEngine.Behaviour
,我们所有Unity组件脚本都继承自该类。
- 附加到GameObject的脚本必须继承自该类,通过
AddComponent
方式进行添加或者在编辑器中拖拽到指定GameObject。 - 当我们的组件脚本中以下函数都不存在时,不会显示我们的激活复选框:
- Start()
- Update()
- FixedUpdate()
- LateUpdate()
- OnGUI()
- OnDisable()
- OnEnable()
- 一般情况下我们会减少继承使用MonoBehaviour脚本,特别是涉及更新体系的函数,我们可以通过C#事件
event
对我们的Unity的消息函数进行分发。
脚本的生命周期
更多信息查看Unity官方文档
变量
runInEditMode
public bool useGUILayout { get; set; }
允许 MonoBehaviour 的实例在编辑模式下运行(仅可在 Editor 中使用)
- 默认情况下,仅在播放模式下执行脚本组件。 通过设置该属性,MonoBehaviour的回调函数都将在Editor未处于播放模式时执行。
- 我们一般不会对其更改,而使用
[ExecuteInEditMode]
或[ExecuteAlways]
类特性。
useGUILayout
public bool useGUILayout { get; set; }
禁用该属性可跳过 GUI 布局阶段。
- 如果为
false
,OnGUI中GUI.Window()
将不会绘制而GUILayout
相关函数则会抛出异常;但是不会影响GUI相关绘制函数。
公共函数
Invoke
public void Invoke(string methodName, float time);
在
time
秒后调用methodName
方法。
- 如果
time
为0并且在第一帧更新前调用Invoke,则会在下一帧调用。如果time
为负数则和0一样。 - 其他情况下,方法的执行顺序取决于调用的时机。
- 如果需要使用有参函数,请改用协程
Coroutine
。协程提供更好的性能优化。 - 函数受
Time.timeScale
影响。 - 通常实际开发这个函数体系比较冷门。
CancelInvoke
public void CancelInvoke(string methodName);
public void CancelInvoke();
取消该 MonoBehaviour 上的Invoke调用。
methodName
为目标方法名,无参则取消全部Invoke调用。
InvokeRepeating
public void InvokeRepeating(string methodName, float time, float repeatRate);
在
time
秒后调用methodName
方法,然后每repeatRate
秒调用一次。
- 函数受
Time.timeScale
影响。 - 建议使用协程
Coroutine
。
IsInvoking
public bool IsInvoking(string methodName);
public bool IsInvoking();
是否有任何待处理的 methodName 调用?
methodName
为目标方法名,无参则是否任何待处理的调用。
StartCoroutine
public Coroutine StartCoroutine(string methodName);
public Coroutine StartCoroutine(IEnumerator routine);
public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value);
启动协程。
methodName
参数的协程相对开销较大不太推荐使用,并且仅能传递一个参数。- 已创建的协程可以启动另一个协程。这两个协程能按多种方式共同运行。包括并行运行两个协程,或者一个协程可以让另一协程停止,而自己继续运行。
- 可以使用 yield 语句,随时暂停协程的执行。使用 yield 语句时,协程会暂停执行,并在下一帧自动恢复。
- WaitForSeconds:等待指定时间,以s为单位。
- WaitForFixedUpdate:等待一个固定更新帧。
- Coroutine:等待一个协程,可以是其它协程方法也可以是自定义协程程序。关于自定义协程程序可以通过继承Unity的
CustomYieldInstruction
类,也可以自己实现System.Collections.IEnumerator
接口来实现。 - null:等待一帧。
- 多个协程在同一帧中完成,也不能保证它们按照与启动相同的顺序结束。
- 销毁MonoBehaviour组件时,或是如果MonoBehaviour组件所附加到的GameObject已禁用,会停止协程,但禁用 MonoBehaviour组件时,不会停止协程。
- 如果MonoBehaviour组件所附加到的GameObject被禁用,重新激活协程不会恢复启动。特别是在协程中做周期循环的逻辑时,应当注意。
StopAllCoroutines
public void StopAllCoroutines();
停止在该行为上运行的所有协程。
MonoBehaviour
可以执行零个或多个协程。- 仅对其附加到此脚本的协程有效。
StopCoroutine
public void StopCoroutine(IEnumerator routine);
public void StopCoroutine(Coroutine routine);
public void StopCoroutine(string methodName);
停止在该脚本上运行的指定协程。
- 如果使用了
methodName
作为StartCoroutine
的参数,请在StopCoroutine
中使用methodName
进行停止。 StopCoroutine()
方法的使用应该和StartCoroutine()
的启动方式相对应。- 使用
IEnumerator routine
这里停止的是对应对象而不是对应方法,需要注意下。 - 使用
Coroutine routine
的参数是StartCoroutine()
对应的返回值。 - 协程停止后不会向下继续执行。
- 协程不会像多线程需要线程锁。
静态函数
public static void print(object message);
将消息打印到 Unity 控制台。
- 与
Debug.Log
相同。 - 仅在继承
MonoBehaviour
的脚本中可用。
消息函数
常用项
Awake
private void Awake(){}
Awake 在脚本实例时将会调用,且在此实例整个生命周期中只调用一次。
- 在加载场景时初始化包含脚本的活跃的GameObject时,或者在将先前非活跃的GameObject设置为活跃时,或者在初始化使用 Object.Instantiate创建的GameObject之后,都将调用 Awake。
- 可在应用程序启动前使用Awake来初始化变量或组建缓存等操作。
- 在脚本实例的生命周期内,Unity 仅调用 Awake 一次,持续到包含它的场景被卸载为止或者对象被完全卸载,如果使用
GameObject.DontDestroyOnLoad()
则场景被卸载也不会终止脚本实例的生命,如果你设置了gameObject.hideFlags
也要注意其卸载情况。 - 如果重新加载场景,Unity会再次加载脚本实例,因此会再次调用
Awake
每个实例一次)。 Awake
可以安全地使用GameObject.FindWithTag
等方法查询其他GameObject。- Unity调用每个GameObject的
Awake
的顺序是不确定的,因此在其它Awake的初始化进度未必是完成的,在进行其它操作可以放在Start
中未尝不是个好主意。 - 当前组件如果被禁用Unity也会调用
Awake
,但是如果是GameObject处于非活跃状态,不会调用Awake
直到你的GameObject处于活跃状态。
Start
private void Start(){}
private IEnumerator Start() { yield return null;}
在首次调用任何
Update
函数之前Awake
之后,可以是协程函数。
- Start 在脚本生命周期内仅调用一次。
- 在调用任何对象的
Start
函数之前,将在场景中的所有对象上调用Awake
函数。 - 当脚本组件未激活状态不会调用
Start
函数,直到激活这个组件。同样GameObject处于非活跃状态也不会调用,直到你的GameObject处于活跃状态。
Update
private void Update(){}
Unity每帧都会调用
Update
。
- 当脚本组件未激活状态不会调用
Update
函数,当激活则每帧调用。 - 并非所有
MonoBehaviour
脚本都需要Update
函数,建议全局有限的Update
函数,其余可以通过C#event
进行分发。 Update
函数在Start
函数后运行。
FixedUpdate
private void FixedUpdate(){}
用于物理计算且独立于帧率的更新函数。
FixedUpdate
函数具有物理系统的更新频率。- 每个固定帧率帧调用该函数。在
FixedUpdate
之后,进行Physics系统计算。 - 调用间隔的默认时间为0.02秒(50 次调用/秒)。使用
Time.fixedDeltaTime
来获取该值。此数值可以通过Edit->Settings->Time->Fixed Timestep
设置。 - 使用物理系统时使用
FixedUpdate
函数进行操作。 FixedUpdate
频率高于或低于Update
。
LateUpdate
private void LateUpdate(){}
Update
函数更新后的更新函数
- 当脚本组件未激活状态不会调用
LateUpdate
函数,当激活则每帧调用。 LateUpdate
函数在调用所有Update
函数后调用。- 并非所有
MonoBehaviour
脚本都需要LateUpdate
函数。建议全局有限的LateUpdate
函数,其余可以通过C#event
进行分发。 LateUpdate
函数通常用于摄像机操作或者Update
操作后的处理。
OnDestroy
private void OnDestroy(){}
当此甲苯组件被销毁时,Unity会调用此函数。
- 场景销毁以及场景跳转或游戏结束时,会触发
OnDestroy
函数,如果使用GameObject.DontDestroyOnLoad()
则场景被卸载也不会终止脚本实例的生命,如果你设置了gameObject.hideFlags
也要注意其卸载情况。 - 只有GameObject处于活动状态的游戏对象上才会调用
OnDestroy
,脚本组件是否激活不会对其造成影响。 - 在移动平台上暂停应用程序,操作系统强制退出应用程序释放资源,这种情况下,Unity可能无法调用这个函数,这将取决于操作系统。
- 如果你想用这个函数作为应用离开的数据存储回调,是完全不建议的。你可以尝试使用
MonoBehaviour.OnApplicationFocus
,用于应用销毁的处理,此函数代表应用是否失去焦点。 OnDestroy
不能使用协程或者异步处理。
OnEnable
private void OnEnable(){}
当脚本组件被激活时并且GameObject被设置为活跃时,Unity会调用此函数。
- 此函数每次激活时都会调用。
OnDisable
private void OnDisable(){}
当脚本组件被禁用时或者GameObject被设置为非活跃时,Unity会调用此函数。
- 当对象销毁时也会调用该函数,可用于任何代码释放。
- 此函数被调用的前提是
OnEnable
被执行过。
OnGUI
private void OnGUI(){}
OnGUI
用来来渲染和处理GUI事件。
OnGUI
是Unity唯一可以实现“即时模式GUI” (IMGUI) 系统来渲染和处理 GUI 事件的函数。IMGUI是一个完全独立由代码驱动的功能系统。OnGUI
一般用于:- 创建游戏内调试显示和工具。
- 为脚本组件创建自定义检视面板。
- 创建新的编辑器窗口和工具以扩展 Unity 本身。
OnGUI
实现可以每帧调用多次(每个事件调用一次)。- 脚本组件没有激活或者GameObject非活跃不会调用此函数。
编辑器相关
OnDrawGizmos
private void OnDrawGizmos(){}
当需要在场景中绘制一些小玩意可以在此函数里。
- 受GameObject是否活跃影响不受脚本是否激活影响。
- 绘制仅在编辑器环境下有效果。
- 通常使用
Gizmos
相关api进行绘制任务。如Gizmos.DrawSphere(transform.position, 1);
将会在对象位置的场景里绘制一个球。
OnDrawGizmosSelected
private void OnDrawGizmosSelected(){}
如果需要选择了对象,在场景中绘制一些小玩意可以在此函数里。
- 受GameObject是否活跃影响不受脚本是否激活影响。
- 绘制仅在编辑器环境下有效果。
- 与
OnDrawGizmos
不同此函数必须在层级视图选择这个对象,才开始绘制。 - 通常使用
Gizmos
相关api进行绘制任务。如Gizmos.DrawSphere(transform.position, 1);
将会在选择状态的对象位置的场景里绘制一个球。
Reset
private void Reset(){}
重置为默认值,Unity会调用此函数。
- 当用户点击属性面板上下文菜单中的Reset按钮或第一次添加组件时,将调用
Reset
函数。 - 此函数只能在编辑器模式下调用。
- 通常你可以在这个函数里对你挂载的GameObject进行一些 特殊化处理或者脚本组建的一些默认处理。
动画相关
OnAnimatorIK
private void OnAnimatorIK(int layerIndex){}
用于设置动画 IK(反向运动学)的回调。
- 在即将更新其内部反向动力学系统前由动画器组件调用。
- 该回调可用于设置反向动力学目标的位置及其各自的权重。
- 详情请看
Animator
IK相关。 - 该回调可用于设置反向动力学目标的位置及其各自的权重。
Animator.SetIKPosition
、Animator.SetIKPositionWeight
、Animator.SetIKRotation
、Animator.SetIKRotationWeight
。 - 需要在对应
Animator
layer开启IK设置。
OnAnimatorMove
private void OnAnimatorMove(){}
用于处理动画移动以修改根运动的回调。
- 该回调函数在处理完状态机和动画后,在
OnAnimatorIK
之前的每个帧中调用。 - 一般用于无动画位移或者取消了动画位移,而进行程序位移的操作。
应用项
OnApplicationFocus
private void OnApplicationFocus(bool focus){}
当应用获得或失去焦点时,发送给所有
GameObject
上脚本组件的此函数。
- 使用 Alt + Tab 或 Cmd + Tab 可以将焦点从应用程序转移到另一个桌面应用程序。这会触发此函数
focus=false
。当用户切换回应用程序时,会触发此函数focus=true
。 - 在Android上,启用屏幕键盘时,会让
focus=false
。如果在启用键盘时按Home键,将调用OnApplicationPause
,而不是OnApplicationFocus
函数。 - 如果编辑器处于播放模式,则当游戏视图失去或获得焦点时,将调用OnApplicationFocus。如果外部应用程序(Unity以外的应用程序)具有焦点,并且您单击了其他编辑器选项卡,
OnApplicationFocus
在一个帧中被调用两次。第一次调用OnApplicationFocus
时,focus
设置为true,因为当Unity重新获得焦点时,游戏视图将重新获得焦点。第二次调用OnApplicationFocus
时,focus
设置为false,因为游戏视图的焦点会丢失到单击的编辑器选项卡上。
OnApplicationPause
private void OnApplicationPause(bool pause){}
当应用程序暂停时,发送给所有
GameObject
上脚本组件的此函数。
OnApplicationPause
消息返回false
值。 这意味着游戏正在 Editor 中正常运行。 如果选择了某个 Editor 窗口(例如 Inspector窗口), 游戏将暂停并且OnApplicationPause
返回true
,当选中并激活游戏窗口时,OnApplicationPause
将再次返回false
。- 如果应用被其他应用程序(全部或部分)遮挡,
OnApplicationPause
将返回true
。 当游戏重新变为当前窗口时,它将取消暂停状态, 并且OnApplicationPause
返回false
。 - 在 Android 上,按Home会调用此函数。
- Player Settings中的 Resolution and Presentation设置
Run in Background
和Visible in Background
,会影响此函数。 - 通常情况下推荐使用
OnApplicationFocus
函数。
OnApplicationQuit
private void OnApplicationQuit(){}
当应用退出后会调用此函数。
- 在编辑器中,Unity在play mode停止时调用此消息。
- 对于iOS应用,通常会暂停,不会退出。如果需要回调,请在Player Settings中启用
Exit on Suspend
属性,使应用程序退出而不挂起,如果未启用Exit on Suspend
属性,则会看到OnApplicationPause
的函数调用。 - 在Windows应用商店程序和Windows Phone 8.1上,没有应用程序退出事件。可以使用
OnApplicationFocus
函数。 - 在WebGL上,由于浏览器选项卡的关闭方式,无法实现
OnApplicationQuit
。有关解决方法,请参阅有关在WebGL中与浏览器脚本交互的Unity用户手册文档。 - 如果在移动平台上挂起应用程序,操作系统可以退出应用程序以释放资源。在这种情况下,根据操作系统的不同,Unity可能无法调用此函数。在移动平台上,最好不要依赖此方法来保存应用程序的状态。相反,将每次失去应用程序焦点视为应用程序的退出,使用
OnApplicationFocus
上保存退出数据。 - 通常情况下推荐使用
OnApplicationFocus
函数。
物理和触发相关
OnCollisionEnter
private void OnCollisionEnter(Collision collision){ }
private void OnCollisionEnter(){ }
private IEnumerator OnCollisionEnter(){ yield return null; }
private IEnumerator OnCollisionEnter(Collision collision){ yield return null; }
当该碰撞体/刚体已开始接触另一个刚体/碰撞体时,调用此函数。
OnCollisionEnter
被传入Collision
类,Collision
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的刚体,才会发送
OnCollisionEnter
事件。 OnCollisionEnter
事件会发送到已禁用的MonoBehaviour
脚本,从而响应碰撞。OnCollisionEnter
可以作为协程使用
OnCollisionEnter2D
private void OnCollisionEnter2D(Collision2D collision) { }
private void OnCollisionEnter2D() { }
private IEnumerator OnCollisionEnter2D() { yield return null; }
private IEnumerator OnCollisionEnter2D(Collision2D collision) { yield return null; }
当该碰撞体/刚体已开始接触另一个刚体/碰撞体时,调用此函数。
- 与
OnCollisionEnter
几乎相同,不过应用于2D物理。 OnCollisionEnter2D
被传入Collision2D
类,Collision2D
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的2D刚体,才会发送
OnCollisionEnter2D
事件。 OnCollisionEnter2D
事件会发送到已禁用的MonoBehaviour
脚本,从而响应碰撞。OnCollisionEnter2D
可以作为协程使用
OnCollisionExit
private void OnCollisionExit(Collision collision){ }
private void OnCollisionExit(){ }
private IEnumerator OnCollisionExit(){ yield return null; }
private IEnumerator OnCollisionExit(Collision collision){ yield return null; }
当该碰撞体/刚体已停止接触另一个刚体/碰撞体时,调用此函数。
OnCollisionExit
被传入Collision
类,Collision
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的刚体,才会发送此事件。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。
OnCollisionExit2D
private void OnCollisionExit2D(Collision2D collision) { }
private void OnCollisionExit2D() { }
private IEnumerator OnCollisionExit2D() { yield return null; }
private IEnumerator OnCollisionExit2D(Collision2D collision) { yield return null; }
当该碰撞体/刚体已停止接触另一个刚体/碰撞体时,调用此函数。
OnCollisionExit2D
被传入Collision
类,Collision
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的2D刚体,才会发送此事件。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。
OnCollisionStay
private void OnCollisionStay(Collision collision){ }
private void OnCollisionStay(){ }
private IEnumerator OnCollisionStay(){ yield return null; }
private IEnumerator OnCollisionStay(Collision collision){ yield return null; }
当碰撞器或刚体接触到另一个碰撞器或刚体时,每帧被调用一次此函数。
OnCollisionStay
被传入Collision
类,Collision
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的刚体,才会发送此事件。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 当刚体处于休眠状态不会调用此函数。
OnCollisionStay2D
private void OnCollisionStay2D(Collision2D collision) { }
private void OnCollisionStay2D() { }
private IEnumerator OnCollisionStay2D() { yield return null; }
private IEnumerator OnCollisionStay2D(Collision2D collision) { yield return null; }
当碰撞器或刚体接触到另一个碰撞器或刚体时,每帧被调用一次此函数。
OnCollisionStay2D
被传入Collision
类,Collision
类包含有关接触点、冲击速度等的信息。- 如果在该函数中没有使用
collision
,则不考虑collision
参数,这样可避免不必要的计算。 - 至少有一个碰撞体附加了非运动学的2D刚体,才会发送此事件。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 当2D刚体处于休眠状态不会调用此函数。
OnControllerColliderHit
private void OnControllerColliderHit(ControllerColliderHit hit){}
private void OnControllerColliderHit()
private IEnumerator OnControllerColliderHit(){yield return null;}
private IEnumerator OnControllerColliderHit(ControllerColliderHit hit){yield return null;}
当此角色控制器在执行Move时撞到碰撞体时调用此函数。
- 如果在该函数中没有使用
hit
,则不考虑hit
参数,这样可避免不必要的计算。 - 触发条件必须使用
CharacterController.Move()
或者CharacterController.SimpleMove()
。 - 此函数可以为协程函数。
OnJointBreak
private void OnJointBreak(float breakForce){}
private void OnJointBreak(){}
private IEnumerator OnJointBreak(float breakForce){ yield return null;}
private IEnumerator OnJointBreak(){ yield return null;}
当游戏对象的关节断开时调用此函数。
- 回调函数的脚本必须挂在Joint相关物理组件上,并且
Break Force
或Break Torque
不能为Infinity
。 - 调用
OnJointBreak
之后,Joint物理组件会自动从游戏对象中移除。
OnJointBreak2D
private void OnJointBreak2D(Joint2D joint){}
private void OnJointBreak2D(){}
private IEnumerator OnJointBreak2D(Joint2D joint){ yield return null;}
private IEnumerator OnJointBreak2D(){ yield return null;}
当游戏对象的Joint2D关节断开时调用此函数。
- 回调函数的脚本必须挂在Joint2D相关物理组件上,并且
Break Force
或Break Torque
不能为Infinity
。 - 调用
OnJointBreak2D
之后,Joint物理组件会自动从游戏对象中移除。 - Joint2D 返回自身的Joint2D组件。
OnMouseDown
private void OnMouseDown(){}
private IEnumerator OnMouseDown(){}
当用户在
Collider
上按下鼠标按钮时,将调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 建议使用物理射线方式和3D对象做触发。
- 支持是协程函数。
OnMouseDrag
private void OnMouseDrag(){}
private IEnumerator OnMouseDrag(){}
当用户在
Collider
上按下鼠标按钮时,每帧调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnMouseEnter
private void OnMouseEnter(){}
private IEnumerator OnMouseEnter(){}
当鼠标进入
Collider
时,调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnMouseExit
private void OnMouseExit(){}
private IEnumerator OnMouseExit(){}
当鼠标离开
Collider
时,调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnMouseOver
private void OnMouseOver(){}
private IEnumerator OnMouseOver(){}
当鼠标在
Collider
里,每帧调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnMouseUp
private void OnMouseUp(){}
private IEnumerator OnMouseUp(){}
当鼠标在
Collider
上抬起时,调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnMouseUpAsButton
private void OnMouseUpAsButton(){}
private IEnumerator OnMouseUpAsButton(){}
当鼠标在
Collider
上按下并在此对象上抬起时,调用此函数。
- 此脚本挂在对象必须有Collider,支持Collider2D。
- 此事件只适用本身Collider或者Collider2D,子对象和父对象不会触发。
- 属于
Ignore Raycast
的层上对象不触发。 - 当且仅当
Physics.queriesHitTriggers
为 true时,才在标记为触发器的碰撞体上调用该函数。 - 支持是协程函数。
OnTriggerEnter
private void OnTriggerEnter(Collider other){}
private void OnTriggerEnter(){}
private IEnumerator OnTriggerEnter(){yield return null;}
private IEnumerator OnTriggerEnter(Collider other){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象,会触发双方的此函数。
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
OnTriggerEnter2D
private void OnTriggerEnter2D(Collider2D collision){}
private void OnTriggerEnter2D(){}
private IEnumerator OnTriggerEnter2D(){yield return null;}
private IEnumerator OnTriggerEnter2D(Collider2D collision){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象接触时,会触发双方的此函数。(2D物理)
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
OnTriggerExit
private void OnTriggerExit(Collider other){}
private void OnTriggerExit(){}
private IEnumerator OnTriggerExit(){yield return null;}
private IEnumerator OnTriggerExit(Collider other){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象离开接触时,会触发双方的此函数。
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
OnTriggerExit2D
private void OnTriggerExit(Collider2D collision){}
private void OnTriggerExit(){}
private IEnumerator OnTriggerExit(){yield return null;}
private IEnumerator OnTriggerExit(Collider2D collision){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象离开接触时,会触发双方的此函数。(2D物理)
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
OnTriggerStay
private void OnTriggerStay(Collider other){}
private void OnTriggerStay(){}
private IEnumerator OnTriggerStay(){yield return null;}
private IEnumerator OnTriggerStay(Collider other){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象正在接触时,每帧会触发双方的此函数。
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
OnTriggerStay2D
private void OnTriggerStay2D(Collider2D collision){}
private void OnTriggerStay2D(){}
private IEnumerator OnTriggerStay2D(){yield return null;}
private IEnumerator OnTriggerStay2D(Collider2D collision){yield return null;}
当其中一个具有Trigger的碰撞体且其中一个具有刚体的游戏对象正在接触时,每帧会触发双方的此函数。(2D物理)
- 双方都有碰撞体且任一一方有刚体并且任一一方有碰撞体具有Trigger,就可以触发。
- 会触发双方此函数,哪怕另一方不是Trigger的碰撞体。
- 此事件会发送到已禁用的
MonoBehaviour
脚本,从而响应碰撞。 - 此函数可作为协程函数。
其它
OnValidate
private void OnValidate(){}
Unity在加载脚本或 Inspector视图中的值更改时调用此函数。
- 此函数仅编辑器中有效。
- 此函数中不建议创建对象或调用其他非线程安全的Unity API。
- 此函数中不应执行摄影机渲染操作。
OnAudioFilterRead
private void OnAudioFilterRead(float[] data, int channels){}
将在音频 DSP 链中插入一个自定义滤波器。
- 如果有多个声道,则以交错方式处理声道数据,意味着数组中的每个连续数据样本都来自不同的声道,直到声道结束并循环回第一个声道。
data.Length
数据的总大小,每个声道的样本数(可以用用 data.Length 除以 channels)。- 如果实现了 OnAudioFilterRead,则检视面板中会出现一个 VU 计量表,以显示传出样本级别。
- 系统还会测量过滤器的处理时间,并在 VU 计量表旁边显示花费的毫秒数。如果过滤器占用过多时间,数字将变为红色,表示混合器需要等待音频数据。
OnAudioFilterRead
是在音频线程上调用的,注意主线程的调用。- 每次将音频块发送到过滤器时,都会调用OnAudioFilterRead(根据采样率和平台的不同,大约每20毫秒一次)。
- 音频数据是从[-1.0f,1.0f]的浮点数组,包含来自上一个滤波器的音频或音频源上的音频片段。
OnTransformChildrenChanged
private void OnTransformChildrenChanged(){}
当
GameObject
的子项列表发生更改时,将调用该函数。
- 仅限层级发生更改回调此函数。
OnTransformParentChanged
private void OnTransformParentChanged(){}
当
GameObject
的父项或者父项以上发生更改时,将调用该函数。
- 仅限自身父节点发生更改或者父节点及以上节点发生父节点更改回调此函数,父节点增删其它子节点不会回调。
粒子相关
OnParticleCollision
private void OnParticleCollision(GameObject other){}
private IEnumerator OnParticleCollision(GameObject other){yield return null;}
private void OnParticleCollision(){}
private IEnumerator OnParticleCollision(){yield return null;}
当粒子击中碰撞器时回调此函数。
- 粒子的
Collision
模块必须开启Send Collision Messages
才会接受回调。 - 此脚本GameObject必须包含
Particle System
组件或者受击方必须包含Collider
。 - 这个函数可用于粒子本身也可以用于被碰撞的目标对象。
- 只会作用本身的GameObject上,子粒子碰撞无法回调。
- 可以使用
ParticlePhysicsExtensions.GetCollisionEvents
来检索GameObject
上的所有碰撞事件 - 每个被粒子击中的
Collider
或者击中目标的粒子系统,ParticleSystem
或者Collider
只会收到一条回调。
OnParticleSystemStopped
private void OnParticleSystemStopped(){}
private IEnumerator OnParticleSystemStopped(){ yield return null;}
所有粒子都死亡时,便会调用
OnParticleSystemStopped
函数,并不再产生新粒子。在调用 Stop之后,或者非循环的粒子超过 Duration 属性时,将停止产生新的粒子。
- 此脚本GameObject必须包含
Particle System
组件并且将ParticleSystem.MainModule.stopAction
属性设置为Callback
。 - 脚本是否激活不影响此函数回调。
- 循环粒子不会回调此函数,直到调用
ParticleSystem.Stop()
。 - 此函数的停止代表的是最有一颗粒子死亡,也就是立刻调用
ParticleSystem.Stop()
不会立刻回调。 - 适用于组合粒子结构,给根粒子挂载此组件会保证此粒子和其子粒子都销毁后执行此回调。
OnParticleTrigger
private void OnParticleTrigger(){}
private IEnumerator OnParticleTrigger(){ yield return null;}
粒子系统中的任何粒子满足触发模块中的条件时,将调用
OnParticleTrigger
函数。
- 此脚本GameObject必须包含
Particle System
组件。 - 当激活粒子系统的
Triggers
模块,持续调用此函数。 - 此函数不是在发生触发时调用。
- 要获取
ParticleSystem
造成的所有碰撞的详细信息,必须使用ParticlePhysicsExtensions.GetTriggerParticles
检索Particle
的数组。 - 需要指定对应的Transform列表,否则
Triggers
模块触发将会失效。 - 脚本是否激活不影响此函数回调。
ParticlePhysicsExtensions.GetTriggerParticles
需要在Triggers
模块指定事件设置为Callback
,才可获取到。
OnParticleUpdateJobScheduled
private void OnParticleUpdateJobScheduled(){}
private IEnumerator OnParticleUpdateJobScheduled(){ yield return null;}
当粒子系统正在更新作业是调用此函数。
- 当粒子播放时每帧调用。
- 可以使用
IJobParticleSystem
接口对粒子定制化作业,可以制作基于数学模型或者物理模型的粒子轨迹。
渲染相关
- 渲染相关大部分函数在SRP中是无法使用,Unity未来主流是SRP,高端主机影视可以使用HDRP,手机及相对较低性能平台可以使用URP。
OnBecameInvisible
private void OnBecameInvisible(){}
private IEnumerator OnBecameInvisible(){yield return null;}
当次GameObject对相机不可见时候回调此函数。
- 在 Editor 中运行时,Scene 视图摄像机也会导致调用该函数。
- 此脚本GameObject必须包含渲染器
Renderer
,才会触发此函数。 - 脚本是否激活不影响此函数。
- 此函数对UI无效
- 可用作协程函数。
OnBecameVisible
private IEnumerator OnBecameVisible(){}
private IEnumerator OnBecameVisible(){yield return null;}
当次GameObject对相机可见时候回调此函数。
- 在 Editor 中运行时,Scene 视图摄像机也会导致调用该函数。
- 此脚本GameObject必须包含渲染器
Renderer
,才会触发此函数。 - 脚本是否激活不影响此函数。
- 此函数对UI无效
- 可用作协程函数。
OnPostRender
private void OnPostRender(){}
private IEnumerator OnPostRender(){ yield return null;}
相机完成场景渲染完后调用此函数
- 此脚本所在GameObject必须包含
Camera
组件。 - 可以作为协程函数。
- 仅适用
build-in
渲染管线。SRP请参阅RenderPipelineManager
; - 如果要在Unity渲染所有相机和GUI后执行代码,请使用协程函数并在
WaitForEndOfFrame
执行或适用CommandBuffer
执行代码。
OnPreCull
private void OnPreCull(){}
private IEnumerator OnPreCull(){ yield return null;}
相机在对场景进行剔除操作之前调用此函数。
- 此脚本所在GameObject必须包含
Camera
组件。 - 只针对当前相机所渲染的内容。
- 可以作为协程函数。
- 仅适用
build-in
渲染管线。SRP请参阅RenderPipelineManager
;
OnPreRender
private void OnPreRender(){}
private IEnumerator OnPreRender(){ yield return null;}
摄影机渲染场景之前调用的事件函数。
- 此脚本所在GameObject必须包含
Camera
组件。 - 此函数在
OnPreCull
之后调用。 - 可以作为协程函数。
- 仅适用
build-in
渲染管线。SRP请参阅RenderPipelineManager
; - Unity调用
OnPreRender
时,相机的渲染目标和深度纹理还没设置。如果需要访问这些信息,可以稍后在循环渲染中使用CommandBuffer
执行代码。
OnRenderImage
private void OnRenderImage(RenderTexture source, RenderTexture destination){}
private IEnumerator OnRenderImage(RenderTexture source, RenderTexture destination){ yield return null;}
完成所有渲染后回调此函数,可以对图像进行最终处理。
source
包含源图像的渲染纹理。destination
更新修改后的图像数据。- 可以作为协程函数。
- 只针对当前相机所渲染的内容。
- 仅适用
build-in
渲染管线。SRP请参阅ScriptableRenderPass API
; - 通常用于全屏后处理。
- 在Android上,避免在全屏效果中使用banding,要使用alpha,请在
PlayerSettings
设置32BitDisplayBuffer
设置为true
。 - 如果同一个摄影机有多个脚本实现了OnRenderImage,Unity将按照它们在摄影机属性窗口中出现的顺序从顶部开始调用它们。
OnRenderObject
private void OnRenderObject(){}
在摄像机渲染场景后,将调用
OnRenderObject
函数。
- 可以通过
Graphics.DrawMeshNow
或其他函数渲染自己的对象。 - 类似于
OnPostRender
,但OnRenderObject
不必再此脚本的GameObject上包含Camera
组件。 - 此函数可能会影响性能,因为它会对使用此函数脚本的每个
GameObject
运行。 - 此函数会在
OnPostRender
,OnRenderImage
之前调用,在OnPreCull
,OnWillRenderObject
,OnPreRender
之后调用。
OnWillRenderObject
private void OnWillRenderObject(){}
如果对象可见并且不是 UI 元素,则为每个摄像机调用
OnWillRenderObject
函数。
- 如果禁用了 MonoBehaviour,则不会调用该函数。
- 在编辑环境下运行,Scene视图显示此渲染对象也会调用此函数。
- 调用前提是必须是可见的。
- 每帧可能会调用多次,跟渲染此渲染对象相机数量有关以及编辑器下场景视图是否能渲染此对象有关。
UNet网络相关
- 由于Unity在 2018.2+ 版本中删除了旧的网络系统,在这里仅说明下函数翻译,不在进行过多概述。
- 替代品1:Mirror:https://assetstore.unity.com/packages/tools/network/mirror-129321,可配合NAT实现互联网多人游戏。
- 替代品2:Photon:https://assetstore.unity.com/packages/tools/network/pun-2-free-119922,互联网的多人游戏套件。
- 官方替代品HLAPI:https://docs.unity3d.com/cn/2020.3/Manual/UNetUsingHLAPI.html,可配合Unity Multiplayer服务实现基于互联网的多人游戏。
OnConnectedToServer
成功连接到服务器后在客户端上调用。
OnDisconnectedFromServer
当连接丢失或与服务器断开连接时,在客户端上调用。
OnFailedToConnect
出于某种原因连接尝试失败时,在客户端上调用。
OnFailedToConnectToMasterServer
在连接到 MasterServer 时发生问题的情况下,在客户端或服务器上调用。
OnMasterServerEvent
在从 MasterServer 报告事件时,在客户端或服务器上调用。
OnNetworkInstantiate
在已通过 Network.Instantiate 进行网络实例化的对象上调用。
OnPlayerConnected
每当有新玩家成功连接,就在服务器上调用。
OnPlayerDisconnected
每当有玩家与服务器断开连接,就在服务器上调用。
OnSerializeNetworkView
用于在网络视图监视的脚本中自定义变量同步。
OnServerInitialized
每当调用 Network.InitializeServer 并且完成时,对该服务器调用该函数。
[组件笔记]7.UnityEngine.MonoBehaviour相关推荐
- yolov5组件笔记
深度学习模型组件 ------ 深度可分离卷积.瓶颈层Bottleneck.CSP瓶颈层BottleneckCSP.ResNet模块.SPP空间金字塔池化模块 目录 1.标准卷积: Conv + BN ...
- react父子组件,兄弟组件,爷爷到孙子组件笔记
import React from 'react' import App from './App' // 1.父传子. // 2.子传父 class ComCent extends React.Com ...
- 大数据组件笔记 -- ZooKeeper
文章目录 一.入门 1.1 基本理解 1.2 应用场景 二.单节点安装 三.内部原理 3.1 选举机制 3.2 节点类型 3.3 结构体 3.4 监听器 3.5 写数据流程 3.6 权限控制 四.开发 ...
- bootstrap组件--笔记(2)
图标:<span class="glyphicon glyphicon-search" aria-hidden="true"><span> ...
- uni-app+uview 购物车模块组件(笔记)
<template><!-- 商品列表 --><view class="wee-cart"><view class="bg&qu ...
- 大数据组件笔记 -- Hive
文章目录 一.基本概念 1.1 Hive和数据库比较 1.2 Hive 安装 1.3 Hive 启动 1.4 Hive 使用 1.4.1 shell beeline 1.4.2 DBeaver 二.数 ...
- bootstrap基础和部份组件 -- (笔记一)
bootstrap: 打开网页: https://v2.bootcss.com/getting-started.html 或 其它网站 点击下载bootstrap, 即可得到bootstrap.zip ...
- onSenUI 常用UI组件 笔记
1.carousel 轮播图的用法总结 界面方法: 1.用于满屏 <ons-carousel fullscreen swipeable overscrollable auto-scroll> ...
- 深蓝学院古月居第四讲——ros常用组件笔记
目录 1.Launch启动文件 2.TF坐标变换(默认保存10s之内的所有坐标系关系) 3.可视化显示与仿真工具 1.Launch启动文件 Launch启动文件:通过XML文件实现多节点的配置和启动( ...
最新文章
- 官网的Ext direct包中.NET版的问题
- window.location.reload() 刷新页面时,如何不弹出提示框
- 如何用最傻的办法查看tensorflow-yolov3模型测试VOC数据集时预测值(图框)与真实值(图框)的对比效果?
- 控制是否展示_非线性控制(四)描述函数法
- 史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
- 你所不知道的mybatis居然也有拦截器
- (56)UART外设驱动协议(一)(第12天)
- Tomcat与JDK版本对应关系
- 梅州市2021普通高考成绩查询,梅州高考成绩查询入口
- MathType中公式不对齐怎么办
- Nginx的入门详解
- 软件开发部分文档说明
- 2018的锅让2019来悲
- 深入理解Java类加载器(2):线程上下文类加载器
- 易基因|Science:宏基因组测序揭示病原菌介导植物内生菌群抑病功能激活
- 网页版邮箱提取/采集软件
- 在阿里,我们如何管理测试环境?
- Like What You Like: Knowledge Distill via Neuron Selectivity Transfer论文初读
- 微信小程序项目从app.js中获取数据
- 商品详情页系统架构-笔记4-商品详情页多级缓存
热门文章
- linux 误删除根分区的pv,如何安全的删除Linux LVM中的PV物理卷(硬盘或分区)(4)
- 僵尸网络检测和抑制方法
- matlab判断星期几的语句,计算某一天是星期几的matlab程序
- JS实现视频录制-以Cesium为例
- 获取洞口边界及在墙上开洞(Revit二次开发)
- 扑克玩法:9点半--数据分析
- 编译 /home/nzm/dvsdk_3_00_02_44/codec_engine_2_24/examples/ti/sdo/ce/examples/apps/video_copy 【part2】
- 数据科学导论实验:基于Twitter的网络结构和社会群体演化
- 目前巨型计算机应用最主要的领域是,A.10%-15%.
- 股市学习稳扎稳打(四)当宏观经济出现复苏时,不同的行业分别以什么顺序进行轮动上涨