更多事件参考:https://docs.unity3d.com/cn/2019.4/ScriptReference/MonoBehaviour.html
事件函数 | 调用时间 |
---|---|
更新事件 | |
Awake 函数 | 在场景加载时调用所有object的Awake函数(无序)。 |
Start 函数 | 在对象的第一次帧更新之前立即调用。 |
Update 函数 | 在帧更新发生之前调用。例如:渲染每帧之前改变游戏对象的位置、状态和行为。 |
FixedUpdate函数 | 物理更新之前调用,物理更新和帧更新不会以相同频率进行,所以如果将物理代码放在 FixedUpdate 函数而不是 Update 中,此代码将产生更准确的结果。 |
LateUpdate函数 | 后更新,在帧更新和物理更新后对某一点做额外的更改,例如:对特定object的Camera的更改。脚本代码应该覆盖动画的效果,例如:让角色的头朝向场景中的目标对象。 |
GUI事件 | |
OnGUI函数 | Unity有一个系统,用于渲染场景中主要操作的GUI控件,并响应对这些控件的点击。这段代码的处理方式与普通的帧更新有些不同,因此它应该被放置在OnGUI函数中,该函数将定期被调用。 |
OnMouseEnter函数 | 在鼠标处于该对象上方的第一帧调用。 |
OnMouseOver函数 | 当鼠标悬停在 GUIElement 或 Collider 上时,每帧调用一次。在属于 Ignore Raycast 层的对象上,不调用该函数。当且仅当 Physics.queriesHitTriggers 为 true 时,才在标记为触发器的碰撞体上调用该函数。 |
OnMouseDown函数 | 当用户在 GUIElement 或 Collider 上按下鼠标按钮时调用。该事件将发送到 Collider 或 GUIElement 的所有脚本。 |
OnMouseExit函数 | 移开鼠标时调用。 |
物理事件 | 物理引擎将通过调用该对象的脚本上的事件函数来报告对象的碰撞情况。 |
OnCollisionEnter函数 | 当该碰撞体/刚体已开始接触另一个刚体/碰撞体时调用。 |
更新事件
void Update() {
float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * distance);
}
void FixedUpdate() {
Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
rigidbody.AddForce(force);
}
void LateUpdate() {
Camera.main.transform.LookAt(target.transform);
}
GUI事件
void OnGUI() {
GUI.Label(labelRect, "Game Over");
}
//Attach this script to a GameObject to have it output messages when your mouse hovers over it.
using UnityEngine;
public class OnMouseOverExample : MonoBehaviour
{
void OnMouseOver()
{
//If your mouse hovers over the GameObject with the script attached, output this message
Debug.Log("Mouse is over GameObject.");
}
void OnMouseExit()
{
//The mouse is no longer hovering over the GameObject so output this message each frame
Debug.Log("Mouse is no longer on GameObject.");
}
}
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class ExampleClass : MonoBehaviour
{
void OnMouseDown()
{
// load a new scene
SceneManager.LoadScene("OtherSceneName");
}
}
物理事件
Collision
Unity手册:https://docs.unity3d.com/cn/current/ScriptReference/Collision.html
描述碰撞。
碰撞信息会传递到 Collider.OnCollisionEnter、Collider.OnCollisionStay 和 Collider.OnCollisionExit 事件。
变量 | 含义 |
---|---|
collider | 我们撞击的 Collider(只读)。 |
contacts | 物理引擎生成的接触点。应避免使用它,因为它会产生内存垃圾。改用 GetContact 或 GetContacts。 |
gameObject | 您正在碰撞其碰撞体的 GameObject。(只读)。 |
impulse | 为解析此碰撞而施加于该接触对的总冲量。 |
relativeVelocity | 这两个碰撞对象的相对线性速度(只读)。 |
rigidbody | 我们撞击的 Rigidbody(只读)。如果我们撞击的对象未附加刚体,则这是 /null/。 |
transform | 我们撞击的对象的 Transform(只读)。 |
//与 OnTriggerEnter 相反,OnCollisionEnter 被传入 Collision 类,而不是 Collider。
// Collision 类包含有关接触点、冲击速度等的信息。 如果在该函数中没有使用 collisionInfo,则不考虑 collisionInfo 参数,这样可避免不必要的计算。
//如果其中一个碰撞体还附加了非运动学刚体,则仅发送 Collision 事件。Collision 事件将发送到已禁用的 MonoBehaviour,以便允许启用 Behaviour,从而响应碰撞。
//OnCollisionEnter 可以作为协同程序使用 - 在函数中使用 yield 语句即可。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
void OnCollisionEnter(Collision collision)
{
foreach (ContactPoint contact in collision.contacts)
{
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
if (collision.relativeVelocity.magnitude > 2)
audioSource.Play();
}
}
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
void OnCollisionStay(Collision collisionInfo)
{
// Debug-draw all contact points and normals
foreach (ContactPoint contact in collisionInfo.contacts)
{
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
}
}
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour
{
void OnCollisionExit(Collision other)
{
print("No longer in contact with " + other.transform.name);
}
}
Collider
Unity手册:https://docs.unity3d.com/cn/current/ScriptReference/Collider.html
所有碰撞体的基类。例如:BoxCollider、SphereCollider、CapsuleCollider、MeshCollider、PhysicMaterial、Rigidbody。
如果在游戏过程中需要移动具有 Collider 的对象,还应将 Rigidbody 组件附加到该对象。如果不想使该对象与其他对象进行物理交互,可将 Rigidbody 设置为运动刚体。
变量 | 含义 |
---|---|
attachedRigidbody | 碰撞体附加到的刚体。 |
bounds | 碰撞体的世界空间包围体积(只读)。 |
contactOffset | 该碰撞体的接触偏移值。 |
enabled | 启用的 Collider 将与其他 Collider 碰撞,禁用的 Collider 不会这样。 |
isTrigger | 碰撞体是不是触发器? |
material | 碰撞体使用的材质。 |
sharedMaterial | 该碰撞体的共享物理材质。 |
公共函数 | |
ClosestPoint | 返回碰撞体上最接近给定位置的一个点。 |
ClosestPointOnBounds | 与附加碰撞体的包围盒最接近的点。 |
Raycast | 投射除这一个外忽略其他所有 Colliders 的 Ray。 |
消息 | |
OnCollisionEnter | 当该碰撞体/刚体已开始接触另一个刚体/碰撞体时,调用 OnCollisionEnter。 |
OnCollisionExit | 当该碰撞体/刚体已停止接触另一个刚体/碰撞体时,调用 OnCollisionExit。 |
OnCollisionStay | 对应正在接触刚体/碰撞体的每一个碰撞体/刚体,每帧调用一次 OnCollisionStay。 |
OnTriggerEnter | 当 Collider other 事件进入该触发器时调用 OnTriggerEnter。 |
OnTriggerExit | 当 Collider other 已停止接触该触发器时调用 OnTriggerExit。 |
OnTriggerStay | 对于正在接触该触发器的每个其他 Collider,“几乎”所有帧都调用 OnTriggerStay。此函数位于物理计时器上,因此它不必运行每个帧。 |
继承的成员
变量 | 含义 |
---|---|
gameObject | 此组件附加到的游戏对象。始终将组件附加到游戏对象。 |
tag | 此游戏对象的标签。 |
transform | 附加到此 GameObject 的 Transform。 |
hideFlags | 该对象应该隐藏、随场景一起保存还是由用户修改? |
name | 对象的名称。 |
公共函数 | |
BroadcastMessage | 调用此游戏对象或其任何子项中的每个 MonoBehaviour 上名为 methodName 的方法。 |
CompareTag | 此游戏对象是否使用 tag 进行了标记? |
GetComponent | 如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null。 |
GetComponentInChildren | 使用深度首次搜索返回 GameObject 或其任何子项中类型为 type 的组件。 |
GetComponentInParent | 返回 GameObject 或其任何父项中类型为 type 的组件。 |
GetComponents | 返回 GameObject 中类型为 type 的所有组件。 |
GetComponentsInChildren | 返回 GameObject 或其任何子项中类型为 type 的所有组件。 |
GetComponentsInParent | 返回 GameObject 或其任何父项中类型为 type 的所有组件。 |
SendMessage | 调用此游戏对象中的每个 MonoBehaviour 上名为 methodName 的方法。 |
SendMessageUpwards | 调用此游戏对象中的每个 MonoBehaviour 上或此行为的每个父级上名为 methodName 的方法。 |
GetInstanceID | 返回对象的实例 ID。 |
ToString | 返回 GameObject 的名称。 |
静态函数 | |
Destroy | 删除 GameObject、组件或资源。 |
DestroyImmediate | 立即销毁对象 /obj/。强烈建议您改用 Destroy。 |
DontDestroyOnLoad | 在加载新的 Scene 时,请勿销毁 Object。 |
FindObjectOfType | 返回第一个类型为 type 的已加载的激活对象。 |
FindObjectsOfType | 返回所有类型为 type 的已加载的激活对象的列表。 |
Instantiate | 克隆 original 对象并返回克隆对象。 |
运算符 | |
bool | 该对象是否存在? |
operator != | 比较两个对象是否引用不同的对象。 |
operator == | 比较两个对象引用,判断它们是否引用同一个对象。 |