在ugui中創建一個canvas 之后會自動創建一個EventSystem,用來處理UI上的時間響應。(可以通過UI>EventSystem創建EventSystem)
EventSystem
有三個組件:EventSystem、StandaloneInputModule、TouchInputModule,后面兩個組件都繼承自BaseInputModule。
EventSystem組件主要負責處理輸入、射線投射以及發送事件。一個場景中只能有一個EventSystem組件,並且需要BaseInputModule類型組件的協助才能工作。EventSystem在一開始的時候會把自己所屬對象下的BaseInputModule類型組件加到一個內部列表,並且在每個Update周期通過接口UpdateModules接口調用這些基本輸入模塊的UpdateModule接口,然后BaseInputModule會在UpdateModule接口中將自己的狀態修改成'Updated',之后BaseInputModule的Process接口才會被調用。
BaseInputModule是一個基類模塊,負責發送輸入事件(點擊、拖拽、選中等)到具體對象。EventSystem下的所有輸入模塊都必須繼承自BaseInputModule組件。StandaloneInputModule和TouchInputModule組件是系統提供的標准輸入模塊和觸摸輸入模塊,我們可以通過繼承BaseInputModule實現自己的輸入模塊。
除了以上兩個組件,還有一個很重要的組件通過EventSystem對象我們看不到,它是BaseRaycaster組件。BaseRaycaster也是一個基類,前面說的輸入模塊要檢測到鼠標事件必須有射線投射組件才能確定目標對象。系統實現的射線投射類組件有PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster。這個模塊也是可以自己繼承BaseRaycaster實現個性化定制。
總的來說,EventSystem負責管理,BaseInputModule負責輸入,BaseRaycaster負責確定目標對象,目標對象負責接收事件並處理,然后一個完整的事件系統就有.
上邊是從別的地方復制的...
下邊是場景中的3D物體怎么用EventSystem響應事件
1.首先確保場景中有一個EventSystem,添加方式最開始有提到。
2.因為3d物體上沒有canvas上邊的GraphicRaycaster所以要Main Camera上添加Physics Raycaster,就相當於UI上的GraphicRaycaster
3.創建一個Cube(或者其他什么隨便你,但是確保物體上有collion組件,因為沒有碰撞器無法檢測射線),作為事件觸發的3d物體
4.在3D物體上(你創建的那個cube或者什么)掛上EventTrigger,然后指定怎么觸發,指定要觸發的方法,如下。
5.在要觸發事件的物體上(你創建的Cube或者其他什么),掛上如下腳本
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class CubeClickTest : MonoBehaviour//, IPointerDownHandler { // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { Debug.Log(Input.mousePosition); } } public void PointDownHandler()//在cube上掛上EventTrigger並指定該方法 { transform.position += new Vector3(1,1,1); } //public void OnPointerDown(PointerEventData eventData)//實現接口調用該方法 //{ // Debug.Log(eventData.button);//這里如果用鼠標左鍵觸發就打印life,右鍵觸發就打印right // Debug.Log(eventData);//你可以通過eventData獲取更多信息,這里是打印鼠標的位置(跟Input.mousePosition輸出結果是一樣的)以及delta(0.0,0.0),不知道是啥... // Debug.Log(Input.mousePosition); //Debug.Log(eventData.pointerPressRaycast.gameObject.name); // Debug.Log("press"); //} }
當然也可以不掛EventTrigger,直接實現接口,返回第三步。
4.引用接口(你想用什么方式觸發就實現對應的接口,這里以鼠標按下為例),要引用UnityEngine.EventSystems然后實現接口方法。
5.同樣掛上上邊腳本,將腳本中紅色部分的注釋取消,cube移除EventTrigger組件,然后就可以了。