欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity 自定义UI时应使用UI事件接口实现不是EventTrigger

程序员文章站 2022-03-31 20:53:42
...

EventTrigger很方便,但是如果我们在scroll view下的滚动栏里添加子物体的时候,使用了EventTrigger,会导致scroll view的滚动和拖拽在鼠标移入按钮内时被屏蔽,如果使用接口则一切正常
上代码:

    public EventTrigger Trigger;

    private void Start()
    {
        AddTriggersListener(Trigger, EventTriggerType.PointerEnter, PointerEnter);
    }

    public void PointerEnter(BaseEventData data) {
        Debug.Log("鼠标移入游戏物体");    
    }
    public static void AddTriggersListener(EventTrigger target, EventTriggerType eventTriggerType, Action<BaseEventData> action)
    {        
        if (target.triggers.Count == 0)
        {
            target.triggers = new List<EventTrigger.Entry>();
        }
        UnityAction<BaseEventData> callBack = new UnityAction<BaseEventData>(action);
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = eventTriggerType;
        entry.callback.AddListener(callBack);
        target.triggers.Add(entry);
    }

这样的操作会导致父物体scroll view的拖拽和滚动在鼠标点击在当前按钮上的时候失效,因为TriggerEvent会自动捕捉当前物体的所有UI事件,会导致屏蔽父物体的UI事件, 正确的做法应该是使用Unity UI事件的接口:

IPointerEnterHandler
  public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("鼠标移入游戏物体");
    }

这样就不会导致除实现接口外的UI事件被屏蔽,父scroll view可以正确的滚动

其他UI事件接口参考:
https://docs.unity3d.com/2018.4/Documentation/ScriptReference/EventSystems.IBeginDragHandler.html