当前位置 博文首页 > unity工具人的博客:unity Toggle组件添加触发事件回调

    unity工具人的博客:unity Toggle组件添加触发事件回调

    作者:[db:作者] 时间:2021-07-20 09:35

    方式一:

    public class Demo : MonoBehaviour {
        
        private Toggle toggle;
    	// Use this for initialization
    	void Start () {
            toggle.onValueChanged.AddListener((bool isOn)=> { OnToggleClick(toggle,isOn); });
     
        }
    	
    	private void OnToggleClick(Toggle toggle,bool isOn)
        {
            //TODO
        }
    }
    

    我们想要在代码里给按钮绑定点击事件并将按钮自身传进去,代码如下:

    buttons = GetComponentsInChildren<Button>();
     
            foreach (var bt in buttons)
            {
                Button temp = bt;//这里一定要重新声明一个引用 不然就会把数组最后一个传进去了
                bt.onClick.AddListener(delegate () {  GroupContrl(temp); });
            }
    

    方式二:

    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.Events;
    
    public class Cube : MonoBehaviour
    {
        //获取自己的 EventTrigger 组件
        private EventTrigger _eventTrigger;
        public EventTrigger eventTrigger
        {
            get
            {
                if (_eventTrigger == null)
                {
                    _eventTrigger = this.GetComponent<EventTrigger>();
                }
                return _eventTrigger;
            }
        }
    
        void Start()
        {
            AddEventTrigger(EventTriggerType.PointerEnter, Do);
        }
    
        /// <summary>
        /// 给自己添加监听事件
        /// </summary>
        /// <param name="eventType">监听事件类型</param>
        /// <param name="unityAction">监听事件触发的函数</param>
        private void AddEventTrigger(EventTriggerType eventType, UnityAction<BaseEventData> unityAction)
        {
            //判断是否有 EventTrigger 组件,没有就添加
            if (eventTrigger == null)
            {
                this.gameObject.AddComponent<EventTrigger>();
            }
            //定义回掉函数,委托
            UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(unityAction);
            //判断 EventTrigger 组件上是否已经存在监听事件,如果有就查找是否存在eventType类型的监听事件
            //如果找到了,就赋值,并返回
            if (eventTrigger.triggers.Count != 0)
            {
                for (int i = 0; i < eventTrigger.triggers.Count; i++)
                {
                    if (eventTrigger.triggers[i].eventID == eventType)
                    {
                        eventTrigger.triggers[i].callback.AddListener(unityAction);
                        return;
                    }
                }
            }
            //定义所要绑定的事件类型
            EventTrigger.Entry entry = new EventTrigger.Entry();
            //设置事件类型
            entry.eventID = eventType;
            //设置回掉函数
            entry.callback.AddListener(action);
            //添加触发事件到EventTrigger组件上
            eventTrigger.triggers.Add(entry);
        }
        /// <summary>
        /// 触发事件需要执行的函数,由于UnityAction委托需要一个BaseEventData类型参数,所以需要设置一个BaseEventData类型的形参
        /// </summary>
        private void Do(BaseEventData baseEventData)
        {
            print(123);
        }
    }
    
    cs