今天有朋友问我,在ScrollRect 中 使用了 EventTrigger ,然后发现 鼠标按住 物体 的情况下不能拖着滚动了,但是鼠标按在空白处是可以拖动的。
这个问题是因为 EventTrigger把所有的事件都接管了,查看 EventTrigger 代码就会发现它 实现了所有的事件接口
然后当我们点击到 上层物体 的时候,Drag 事件被 上层物体 中的 EventTrigger 接管了,但是我们又没有对 Drag 事件进行处理,相当于抛弃了。所以鼠标按住上层物体的时候是不能拖动的。
转自http://www.thisisgame.com.cn http://blog.csdn.net/huutu
在之前的笔记
Mono2.0 对C#闭包 与 donet 不同的实现导致Unity的Bug 及解决方案
中有说道,因为 Coroutine 的问题,所以用 EventTrigger 这种形势来写按钮点击处理。
而我当时候就是直接 继承了 EventTrigger 来写 按钮点击处理的。
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go,object data); public VoidDelegate onClick; private object m_Param=null; public static EventTriggerListener Get(GameObject go) { EventTriggerListener listener=go.GetComponent<EventTriggerListener>(); if(listener==null) { listener=go.AddComponent<EventTriggerListener>(); } return listener; } public void SetParam(object data) { m_Param=data; } public override void OnPointerClick (PointerEventData eventData) { base.OnPointerClick (eventData); if(onClick!=null) { onClick(gameObject,m_Param); } } }
其实我们要处理点击事件的话,只要实现 点击事件的接口就可以了。
修改如下 PointerClickListener:
using UnityEngine; using System.Collections; using UnityEngine.Events; using UnityEngine.EventSystems; public class PointerClickListener : MonoBehaviour,IPointerClickHandler { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public object parameter; public object parameter1; static public PointerClickListener Get(GameObject go) { PointerClickListener listener = go.GetComponent<PointerClickListener>(); if (listener == null) listener = go.AddComponent<PointerClickListener>(); return listener; } public void OnPointerClick(PointerEventData eventData) { if (onClick != null) { onClick(gameObject); } } }