EventTrigger接管所有事件导致 在ScrollRect中,点击不能滚动

今天有朋友问我,在ScrollRect 中 使用了 EventTrigger ,然后发现 鼠标按住 物体 的情况下不能拖着滚动了,但是鼠标按在空白处是可以拖动的。

这个问题是因为 EventTrigger把所有的事件都接管了,查看 EventTrigger 代码就会发现它 实现了所有的事件接口

EventTrigger接管所有事件导致 在ScrollRect中,点击不能滚动_第1张图片


然后当我们点击到 上层物体 的时候,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);
        }
    }

}

这样就可以了。

你可能感兴趣的:(unity3d)