在脚本的生命周期中,有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上去。

保存,运行游戏。

在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听课笔记

Unity3D实践系列08, MonoBehaviour类的各种触发事件的更多相关文章

  1. Unity3D实践系列04, 脚本的生命周期

    Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...

  2. Unity3D实践系列05,为GameObject添加额外属性

    在Unity中,通常通过脚本为GameObject添加额外的属性.具体有2种方式:一种是通过硬编码为脚本字段赋值,另一种是通过反射在运行时给脚本字段赋值. 脚本通过字段硬编码为GameObject添加 ...

  3. jQuery-1.9.1源码分析系列(十) 事件系统——主动触发事件和模拟冒泡处理

    发现一个小点,先前没有注意的 stopPropagation: function() { var e = this.originalEvent; ... if ( e.stopPropagation ...

  4. Unity3D实践系列09, 物理引擎与碰撞检测

    在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...

  5. Unity3D实践系列03,使用Visual Studio编写脚本与调试

    在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...

  6. Unity3D实践系列11, 组件的添加和访问

    当把一个脚本附加到一个GameObject上的时候,这个GameObject就有了脚本组件. 通过GameObject的属性获取组件 比如如下: [RequireComponent(typeof(Ri ...

  7. Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件

    创建一个Unity项目. 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹. 点击"File&q ...

  8. Unity3D实践系列06,球体撞击物体游戏

    本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...

  9. Unity3D实践系列10, Canvas画布的创建和使用

    Canvas是所有ui元素的父物体. 当添加一个Button类型的GameObject后,在"Hierarch"窗口中自动添加了一个Canvas,以及EventSystem. 在C ...

随机推荐

  1. 直接读取修改exe文件

    1. 前言 配置器的编写有很多的方式,主要是直接修改原始的受控端的程序,有的方式是把受控端和配置信息都放到控制端程序的内部,在需要配置受控端的时候直接输入配置信息,生成受控端:也有的方式是在外部直接修 ...

  2. 电容充放电时间常数RC计算方法

    进入正题前,我们先来回顾下电容的充放电时间计算公式,假设有电源Vu通过电阻R给电容C充电,V0为电容上的初始电压值,Vu为电容充满电后的电压值,Vt为任意时刻t时电容上的电压值,那么便可以得到如下的计 ...

  3. Android 中关于 【Cursor】 类的介绍

    转自(http://www.cnblogs.com/TerryBlog/archive/2010/07/05/1771459.html) 使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生 ...

  4. 使用Python编写简单的端口扫描器的实例分享【转】

    转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...

  5. 公共语言运行库(CLR)开发系列课程(2):Pinvoke 进阶 学习笔记

    上一章地址 API版本 具有字符串参数的API通常有两种版本 GetWindowText GetWindowTextA GetWindowTextW 缺省情况下CLR会自动寻找合适的匹配 CharSe ...

  6. OS X 10.11:如何完全停用Time Machine。

    家里的2010年21.5英寸iMac越来越慢,用HFS+分区的1.5TB外置硬盘进行备份时,100G数据经常两三个小时还不能备份完.Time Machine虽然方便,但效率太低,不得不停用. 1. 要 ...

  7. testng执行用例失败,再次执行

    我们通过重写testng的retry方法和transform方法来实现用例失败重跑的功能. 首先添加两个文件 TestngRetry.java public class TestngRetry imp ...

  8. vuex 的使用

    用于多组件共享状态,如果不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的.确实是如此——如果应用够简单,您最好不要使用 Vuex.可使用简单Bus总线的方式来管理共享的数据详见(http:// ...

  9. #Plugin 环形loading插件

    CircleLoader 环形loading插件 1.原生JS,不依赖jquery,zepto 2.前端学习交流群:814798690 案例展示 下载地址 https://github.com/cha ...

  10. Java对epub电子书类型切割

    Epub电子书切割 引言:由于公司存储电子书的格式是.epub.一本电子书加载的时候,如果电子书大的话,全部加载该电子书会非常的消耗时间和资源.非常的不合理.那么现在,将所有电子书按章切分.将拆分的电 ...