基於UGUI的點選拖拽(2D和3D)
阿新 • • 發佈:2018-12-14
在UGUI的點選以及拖拽實現都有介面,在unity中有封裝好的類EventTrigger,在這個類中 封裝好了我們常用的一些方法,為了操作方便我對這個類進行了延伸:
在這裡插入程式碼片 using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect; public VoidDelegate onBeginDrag; public VoidDelegate onCancel; public VoidDelegate onDeselect; public VoidDelegate onDrag; public VoidDelegate onDrop; public VoidDelegate onEndDrag; public VoidDelegate onInitializePoteneialDrag; static public EventTriggerListener Get(GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; } public override void OnBeginDrag(PointerEventData eventData) { Debug.Log("**OnBeginDrag**"); if (onBeginDrag != null) onBeginDrag(gameObject); } public override void OnCancel(BaseEventData eventData) { Debug.Log("**OnCancel**"); if (onCancel != null) onCancel(gameObject); } public override void OnDeselect(BaseEventData eventData) { Debug.Log("**OnDeselect**"); if (onDeselect != null) onDeselect(gameObject); } public override void OnDrag(PointerEventData eventData) { Debug.Log("**OnDrag**"); if (onDrag != null) onDrag(gameObject); } public override void OnDrop(PointerEventData eventData) { Debug.Log("**OnDrop**"); if (onDrop != null) onDrop(gameObject); } public override void OnEndDrag(PointerEventData eventData) { Debug.Log("**OnEndDrag**"); if (onEndDrag != null) onEndDrag(gameObject); } public override void OnInitializePotentialDrag(PointerEventData eventData) { Debug.Log("**OnInitializePotentialDrag**"); if (onInitializePoteneialDrag != null) onInitializePoteneialDrag(gameObject); } public override void OnPointerClick(PointerEventData eventData) { Debug.Log("**OnPointerClick**"); if (onClick != null) onClick(gameObject); } public override void OnPointerDown(PointerEventData eventData) { Debug.Log("**OnPointerDown**"); if (onDown != null) onDown(gameObject); } public override void OnPointerEnter(PointerEventData eventData) { Debug.Log("**OnPointerEnter**"); if (onEnter != null) onEnter(gameObject); } public override void OnPointerExit(PointerEventData eventData) { Debug.Log("**OnPointerExit**"); if (onExit != null) onExit(gameObject); } public override void OnPointerUp(PointerEventData eventData) { Debug.Log("**OnPointerUp**"); if (onUp != null) onUp(gameObject); } public override void OnSelect(BaseEventData eventData) { Debug.Log("**OnSelect**"); if (onSelect != null) onSelect(gameObject); } public override void OnUpdateSelected(BaseEventData eventData) { Debug.Log("**OnUpdateSelected**"); if (onUpdateSelect != null) onUpdateSelect(gameObject); } }
當需要給按鈕或者物體新增點選或者拖拽委託的時候只需要:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; public class Drag : MonoBehaviour { void Start() { EventTriggerListener.Get(gameObject).onClick = OnButtonClick; } public void OnButtonClick(GameObject go) { //在這裡監聽按鈕的點選事件 Debug.Log("DoSomeThings"); } }
只需要呼叫EventTriggerListener進行相應委託事件的註冊就可以了
2D和3D物體的區別: 2D物體上 在UGUI的2D物體中主要把上述Drag指令碼掛在對應的物體上就可以了。 場景中需要一個EventSystem
3D物體上 需要在攝像機上加入 Physics RayCaster 元件 另外物體上需要有Collider 場景中需要一個EventSystem 將上面指令碼拖到需要拖動的物體物件上即可
上述委託的執行順序: