• Unity3D实践系列08, MonoBehaviour类的各种触发事件


    在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehaviour类的事件响应方法的一个子集。

    在MonoBehaviour类中,也可以分为"启动与刷新函数"和"交互函数"。

    我们可以把Reset,Awake, Start这3个启动方法,以及FixedUpdate, Update, LateUpdate这3个刷新方法划分到"启动与刷新函数"中。

    把以On开头的各种函数划分到"交互函数"中,具体包括:

    1、物理 Physic

        OnTriggerEnter()
        OnTriggerExit()
        OnTriggerStay()
        OnCollisionEnter()
        OnCollisisonExit()
        OnCollisionStay()
        OnControllerColliderHit()
        OnJointBreak()
        OnParticleCollision()

    2、输入 Input

        OnMouseEnter()
        OnMouseOver()
        OnMouseExit()
        OnMouseDown()
        OnMouseUp()
        OnMouseDrag()
        OnMouseUpAsButton()

    3、渲染 Rendering

        OnGUI()
        OnDrawGizmos()
        OnDrawGizmosSelected()
        OnPreCull()
        OnPreRender()
        OnPostRender()
        OnRenderObject()
        OnWillRenderObject()
        OnRenderImage()

    4、对象 Object

        OnEnable()
        OnDisable()
        OnDestroy()

    5、场景 Scene

        OnLevelWasLoaded()

    6、程序 Application
       
        OnApplicationPause()
        OnApplicationFocus()
        OnApplicationQuit()

    7、网络 Network

        OnPlayerConnected()
        OnServerInitialized()
        OnConnectedToServer()
        OnPlayerDisconnected()
        OnDisconnectedFromServer()
        OnFailedToConnect()
        OnFailedToConnectToMasterServer()
        OnMasterServerEvent()
        OnNetworkInstantiate()
        OnSerialzeNetworkView()

    8、动画 Animator

        OnAnimatorMove()
        OnAnimatorIK()

    9、声音 Audio

        OnAudioFilterRead()

    一个OnTriggerEnter响应事件的例子

     

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

    创建一个类型为"Cube"的GameObject,重命名为"Cube1"。

    创建一个类型为"Cube"的GameObject,重命名为"Cube2"。

    调整Cube1和Cube2的位置,让Cube2位于Cube1的正上方,接下来,会把Cube设置成触发器Trigger, Cube2会被设置为碰撞体Collider。

    把Cube1的"Box Collider"组件的"Is Trigger"勾选上,这样Cube1就不会产生物理的碰撞,也可以把Cube1理解成可以被触发的事件边框

    为Cube2加上一个"Rigibody"组件,并勾选上Cube2的"RigiBody"组件中"Use Gravity",让Cube2有一个自然向下的重力。

    在"Asserts"下的"_Scripts"文件夹下创建一个"SetTrigger"脚本,双击,并在Visual Studio中编辑如下:


    using UnityEngine;
    
    using System.Collections;
    
    public class SetTrigger : MonoBehaviour {
    
        void OnTriggerEnter(Collider other)
    
        {
    
            Debug.Log("OnTriggerEnter被触发~~");
    
        }
    
        // Use this for initialization
    
        void Start () {
    
        
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
        
    
        }
    
    }
    

    把"SetTrigger"脚本附加到Cube2上去。

    保存,运行游戏。

    26

    在OnTriggerEnter(Collider other)方法中,形参other代表被碰撞的物体。所以利用这个方法,还可以在碰撞发生时,让被碰撞物体做点事情,比如移动。修改"SetTrigger"脚本如下:

    using UnityEngine;
    
    using System.Collections;
    
    public class SetTrigger : MonoBehaviour {
    
        //other代表被撞到的物体
    
        void OnTriggerEnter(Collider other)
    
        {
    
            Debug.Log("OnTriggerEnter被触发~~");
    
            other.transform.position = new Vector3(0,2,0);
    
        }
    
        // Use this for initialization
    
        void Start () {
    
        
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
        
    
        }
    
    }
    

    保存,运行游戏。

    碰撞发生后,Cube1作为被碰撞物体,做了移动。

    一个OnTriggerStay响应事件的例子

     

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

     

    修改"SetTrigger"脚本如下:


    using UnityEngine;
    
    using System.Collections;
    
    public class SetTrigger : MonoBehaviour {
    
        //other代表被撞到的物体
    
        //void OnTriggerEnter(Collider other)
    
        //{
    
        //    Debug.Log("OnTriggerEnter被触发~~");
    
        //    other.transform.position = new Vector3(0,2,0);
    
        //}
    
        void OnTriggerStay(Collider other)
    
        {
    
            other.transform.position = new Vector3(0, other.transform.position.y + 0.01f,0);
    
        }
    
        // Use this for initialization
    
        void Start () {
    
        
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
        
    
        }
    
    }
    

    按代码,碰撞后Cube1会一直向上移动,但效果没出来,不知道为什么?


    参考资料:极客学院 Unity3D听课笔记

  • 相关阅读:
    MySQL索引的操作
    MySQL表的操作02
    MySQL表的操作01
    字典实现简单购物车程序
    python 中if和elif的区别
    格式化操作---%方法
    正则表达式相关知识
    实现 像网易云音乐 播放列表那样的弹出型Dialog
    为什么在非UI线程中操作UI的改变失不安全的
    模板方法模式-Template Method
  • 原文地址:https://www.cnblogs.com/darrenji/p/4599110.html
Copyright © 2020-2023  润新知