Unity(二十八):事件、渗透事件、键盘事件

效果

Unity(二十八):事件、渗透事件、键盘事件

事件

事件在Canvas的GraphicRaycaster组件启用时生效
Unity(二十八):事件、渗透事件、键盘事件

1、2 的事件

Unity(二十八):事件、渗透事件、键盘事件

  • Assets/Scripts/Event_01_02.cs
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Event_01_02 : MonoBehaviour
    {
        public Image EventUI01;
    
        public Button EventUI02;
    
        private void Awake()
        {
            // EventUI01
            UGUIEventListener.Get(EventUI01.gameObject).OnClick = (go, eventData) => { Debug.Log($"{go.name}"); };
    
            // EventUI02
            EventUI02.onClick.AddListener(delegate { Debug.Log(EventUI02.name); });
        }
    }
    
  • Assets/Scripts/UGUIEventListener.cs
    using UnityEngine;
    using UnityEngine.Events;
    using UnityEngine.EventSystems;
    
    public class UGUIEventListener : EventTrigger
    {
        public UnityAction<GameObject, PointerEventData> OnClick;
    
        public override void OnPointerClick(PointerEventData eventData)
        {
            base.OnPointerClick(eventData);
            OnClick?.Invoke(gameObject, eventData);
        }
    
        public static UGUIEventListener Get(GameObject go)
        {
            return go.GetComponent<UGUIEventListener>() == null
                ? go.AddComponent<UGUIEventListener>()
                : go.GetComponent<UGUIEventListener>();
        }
    }
    

3 的事件

Unity(二十八):事件、渗透事件、键盘事件

  • Assets/Scripts/Event_03.cs
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class Event_03 : MonoBehaviour, IPointerClickHandler
    {
        public void OnPointerClick(PointerEventData eventData)
        {
            Debug.Log($"{gameObject.name}");
        }
    }
    

4 的事件(渗透事件)

Unity(二十八):事件、渗透事件、键盘事件

  • Assets/Scripts/Event_04.cs
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class Event_04 : MonoBehaviour, IPointerClickHandler
    {
        // 监听点击
        public void OnPointerClick(PointerEventData eventData)
        {
            Debug.Log($"★{gameObject.name}");
            PassEvent(eventData, ExecuteEvents.pointerClickHandler);
        }
    
        // 事件渗透
        private void PassEvent<T>(PointerEventData eventData, ExecuteEvents.EventFunction<T> function)
            where T : IEventSystemHandler
        {
            // 存储当前点击位置的射线投射结果
            List<RaycastResult> results = new List<RaycastResult>();
            EventSystem.current.RaycastAll(eventData, results);
            foreach (var result in results.Where(result => gameObject != result.gameObject))
            {
                ExecuteEvents.Execute(result.gameObject, eventData, function);
                // break; // RaycastAll后UGUI会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。
            }
        }
    }
    

键盘事件

Unity(二十八):事件、渗透事件、键盘事件

  • Assets/Scripts/KeyboardEvent.cs
    using UnityEngine;
    using UnityEngine.Events;
    
    public class KeyboardEvent : MonoBehaviour
    {
        private UnityAction<int, string> _uAction;
        private readonly UnityEvent<int, string> _uEvent = new UnityEvent<int, string>();
    
        private void Start()
        {
            _uAction = (num, str) => { Debug.Log($"{num} ---> {str}"); };
    
            _uEvent.AddListener(_uAction);
        }
    
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.A))
                _uAction.Invoke(0, "Lee");
            if (Input.GetKeyDown(KeyCode.B))
                _uEvent.Invoke(1, "AaA");
        }
    }
    
上一篇:Unity打包安卓项目问题汇总(持续更新)


下一篇:Unity 改变发布好exe的位置大小