Unity中鼠标的交互事件

来源:互联网 发布:武汉工程大学 知乎 编辑:程序博客网 时间:2024/05/29 15:11

事件响应函数


          Unity中函数基本是大写开头的,以下仅介绍部分API,其余可以在unity官网查找。

          Awake :初始化,一开始(脚本实例化时)执行。

          Start : 在Awake之后执行,第一次Update之前执行,用于准备工作。

          Update :每一帧执行,它一般而言并不是稳定的,因为每次绘制耗时都不同。也就是我们常说的游戏的FPS。

          FixedUpdate :固定时间执行,在做一些动画效果计算时需要精确的时间间隔,比如要考虑时间的物理仿真计算,如果在opengl中这个还需要自己手动写一个特定时间间隔执行的控制器,嵌入到update中,在u3d中就方便多了。

          LateUpdate:所有Update之后调用。那为什么不直接写在Update之后呢,因为场景中有很多脚本,它们都要执行一边update,这个LateUpdate就是等它们都执行完了才去做。经常写异步语言的人都知道,在异步语言中做同步控制是很重要的,也就是保证多个事件执行的拓扑顺序,这个LateUpdate就有种同步控制的意思。

          Reset:点击reset按钮时调用。


          关于LateUpdate,Unity官网给了一个相机的例子,也就是要在所有物体都Update之后才移动相机,保证画面上物体都已显示。

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class ExampleClass : MonoBehaviour  
  5. {  
  6.     void LateUpdate()  
  7.     {  
  8.         transform.Translate(0, Time.deltaTime, 0);  
  9.     }  
  10. }  



          OnMouseOver :鼠标位于物体之上时调用。

          OnMouseEnter:鼠标进入物体时调用。

          OnMouseExit:鼠标离开物体时调用。

          OnMouseUp:鼠标抬起时调用.

          OnMouseDown :鼠标在物体上按下时调用。

          OnMouseDrag:鼠标拖动物体时调用。

          

          Unity官网给出的关于OnMouseOver和OnMouseEnter的例子:

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class ExampleClass : MonoBehaviour {  
  5.     public Renderer rend;  
  6.     void Start() {  
  7.         rend = GetComponent<Renderer>();  
  8.     }  
  9.     void OnMouseEnter() {  
  10.         rend.material.color = Color.red;  
  11.     }  
  12.     void OnMouseOver() {  
  13.         rend.material.color -= new Color(0.1F, 0, 0) * Time.deltaTime;  
  14.     }  
  15.     void OnMouseExit() {  
  16.         rend.material.color = Color.white;  
  17.     }  
  18. }  

        将鼠标放在物体上,物体会变成红色,然后随着鼠标停留在物体上,红色慢慢变慢,离开后变成白色。

          

        OnApplicationFocus:应用程序失去焦点时调用。经常写GUI的人应该很清楚焦点是个什么东西,在桌面平台上就是当你点击了某个窗口,窗口处在顶层且呈现激活态时。对于一些游戏,可以利用这个函数在玩家不再聚焦于游戏窗口时,暂停一些功能。

        OnApplicationPause:应用程序暂停时调用。这个可以联想一下安卓开发,也有类似的几个API,当你离开游戏进入别的界面时,游戏虽然没有关闭,但是已经不是当前栈顶的项目了,如果你重新回到游戏界面,但是你的应用程序没有做状态保存(存档)操作的话,那么界面将会到初始化的状态。

        OnApplicationQuit:应用程序退出时调用,这个应该不用多说了。


        Unity官网样例:当程序暂停或失去焦点时,显示游戏暂停。

[csharp] view plain copy
  1. using UnityEngine;  
  2.   
  3. public class AppPaused : MonoBehaviour  
  4. {  
  5.     bool isPaused = false;  
  6.   
  7.     void OnGUI()  
  8.     {  
  9.         if (isPaused)  
  10.             GUI.Label(new Rect(100, 100, 50, 30), "Game paused");  
  11.     }  
  12.   
  13.     void OnApplicationFocus(bool hasFocus)  
  14.     {  
  15.         isPaused = !hasFocus;  
  16.     }  
  17.   
  18.     void OnApplicationPause(bool pauseStatus)  
  19.     {  
  20.         isPaused = pauseStatus;  
  21.     }  
  22. }  


         OnGUI : 绘制游戏界面时调用,也是比较常用的了,GUI这部分也有很多可以研究的,前面的例子正好就使用了GUI来画一个标签。


         OnCollistionEnter:两个碰撞体/刚体开始重叠时调用。

         OnCollisionExit :两个碰撞体/刚体不再重叠时调用。

         OnCollisionStay:两个碰撞体/刚体保持重叠状态时调用(每帧)。

         OnParticleCollision:粒子碰到碰撞体时调用。

         OnTriggerEnter:碰撞体进入触发区域时调用。

         OnTriggerExit:碰撞体离开触发区域时调用。

         OnTriggerStay:碰撞体停留在触发区域时调用(每帧)。

        (同时有2D版本的,直接在后面加上2D作为函数名即可)


         Unity官网样例:碰撞后绘制接触点和法线,相对速度达到一定值播放声音。

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class ExampleClass : MonoBehaviour  
  5. {  
  6.     AudioSource audio;  
  7.   
  8.     void Start()  
  9.     {  
  10.         audio = GetComponent<AudioSource>();  
  11.     }  
  12.   
  13.     void OnCollisionEnter(Collision collision)  
  14.     {  
  15.         foreach (ContactPoint contact in collision.contacts)  
  16.         {  
  17.             Debug.DrawRay(contact.point, contact.normal, Color.white);  
  18.         }  
  19.   
  20.         if (collision.relativeVelocity.magnitude > 2)  
  21.             audio.Play();  
  22.     }  
  23. }  


        OnBecomeInvisible:物体不被摄像机显示时调用。

        OnBecomeVisible:物体被摄像机显示时调用。


        OnPreRender:作用于摄像机,范围内开始渲染时调用。

        OnPostRender:作用于摄像机,范围内渲染完成后调用。

        OnPreCull:作用于摄像机,剔除场景后调用。


        以下是部分网络模块:

        OnConnectedToServer:连接到服务器时调用。

        OnDisconnectedFromServer:从服务器断开时调用。

        OnFailedToConnect / OnFailedToConnectToMasterServer:连接失败时调用。

        OnPlayerConnected:玩家成功连接服务器调用。

        OnPlayerDisConnected:玩家掉线时调用。


        Unity官网的例子,也就是打印一下连线的玩家:

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class ExampleClass : MonoBehaviour {  
  5.     private int playerCount = 0;  
  6.     void OnPlayerConnected(NetworkPlayer player) {  
  7.         Debug.Log("Player " + playerCount + " connected from " + player.ipAddress + ":" + player.port);  
  8.     }  
  9. }  
原创粉丝点击