Unity防止按钮点击

3

我正在创建一个针对长按按钮的脚本。长按按钮已经起作用了,唯一的问题是如果长按按钮触发,我想防止按钮的点击。

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System.Collections;

public class LongPressButton : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    [Tooltip("How long must pointer be down on this object to trigger a long press")]
    public float durationThreshold = 1.0f;

    public UnityEvent onLongPress = new UnityEvent();

    private bool isPointerDown = false;
    private bool longPressTriggered = false;
    private float timePressStarted;

    private void Update()
    {
        if (isPointerDown && !longPressTriggered)
        {
            if (Time.time - timePressStarted > durationThreshold)
            {
                longPressTriggered = true;
                onLongPress.Invoke();
            }
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        timePressStarted = Time.time;
        isPointerDown = true;
        longPressTriggered = false;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isPointerDown = false;
    }


    public void OnPointerExit(PointerEventData eventData)
    {
        isPointerDown = false;
    }
}

我知道有方法可以防止事件传播到3D世界,但是否有一种方法可以防止在按钮脚本上的传播呢?

1个回答

0

我已经想通了,由于Unity事件系统的限制,您需要两个脚本来实现。首先是长按按钮脚本:

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System.Collections;
using UnityEngine.UI;

public class LongPressButton : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    [Tooltip("How long must pointer be down on this object to trigger a long press")]
    public float durationThreshold = 1.0f;

    public UnityEvent onLongPress = new UnityEvent(); 

    private bool isPointerDown = false;
    private bool longPressTriggered = false;
    private float timePressStarted;

    public bool WasLongPressTriggered
    {
        get;
        protected set;
    }

    private void Update()
    {
        if (isPointerDown && false == longPressTriggered)
        {
            if (Time.time - timePressStarted > durationThreshold)
            {
                longPressTriggered = true;
                WasLongPressTriggered = true;
                onLongPress.Invoke();
            }
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        timePressStarted = Time.time;
        isPointerDown = true;
        longPressTriggered = false;
        WasLongPressTriggered = false;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isPointerDown = false;
    }


    public void OnPointerExit(PointerEventData eventData)
    {
        isPointerDown = false;
    }
}

然后,您需要一个新的按钮脚本来覆盖旧的基本按钮:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Button2 : Button
{
    public bool PreventPropagationOnLongPress;

    public override void OnPointerClick(PointerEventData eventData)
    {
        var longPress = GetComponent<LongPressButton>();
        if (longPress == null)
        {
            base.OnPointerClick(eventData);
        }
        if(false == longPress.WasLongPressTriggered)
        {
            base.OnPointerClick(eventData);
        }
    }
}

这在编辑器中可以工作,但在移动设备上尚未完全测试,可能在Unity编辑器中调用了on point click,但在移动设备上可能会从on mouse up触发... 目前这将防止事件传播。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接