Unity笔记-事件函数

更多事件参考: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 ==比较两个对象引用,判断它们是否引用同一个对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值