Unity 3D 给物体添加双击触发事件的方法

Unity 3D 给物体添加双击触发事件的方法

    /************************************************************
      FileName: DoubleClickListener.cs
      Author:菜菜      Version :1.0          Date: 2018-10-29
      Description:双击触发事件
    ************************************************************/
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using PicklePro;
    using UnityEngine.Events;
    
    namespace PicklePro
    { 
        public class DoubleClickListener : MonoBehaviour
        {        
            [Range(0,0.5f)]
            [SerializeField]     
            private float delay = 0.5f;//检测鼠标延时时长
            private float firstClickTime = 0;//第一次点击时长
            private bool oneClick = false;//第一次点击否
            private bool isHover;//是否在物体上
	        public UnityEvent Listener;//Unity事件
	
	        /// <summary>
	        /// 鼠标进入物体范围设为True
	        /// </summary>
	        void OnMouseEnter()
	        {
	            isHover = true;
	        }
	
	        /// <summary>
	        /// 鼠标退出物体范围设为False
	        /// </summary>
	        void OnMouseExit()
	        {
	            isHover = false;
	        }
	
	
	        void Update()
	        {
	            // 如果当前的时间 超过第一次点击时间  回归到未点击状态
	            if (isHover)
	            {
	                if (Time.time - firstClickTime > delay)
	                {
	                    oneClick = false;
	                }
	            }            
	        }
	
	        /// <summary>
	        /// 鼠标抬起
	        /// </summary>
	        void OnMouseUp()
	        {
	            if (oneClick == false)
	            {
	                oneClick = true;
	                firstClickTime = Time.time;
	                return;
	            }
	
	            if (oneClick)
	            {
	                Debug.Log("双击");
	
	                Listener.Invoke();
	            }
	        }
	
	    }
    }

参考文档1: https://blog.csdn.net/Hanson_Lu/article/details/81268258
参考文档2: https://blog.csdn.net/sinat_20559947/article/details/49255895

使用

2019/10/16更新

更新可同UGUI Button监听一样.onDoubleClick.AddListener();一样使用

/************************************************************
  FileName: DoubleClickListener.cs
  Author:菜菜       Version :1.1          Date: 2019-10-16
  Description:双击触发事件
************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PicklePro;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using System;

namespace PicklePro
{ 
    public class DoubleClickListener : MonoBehaviour
    {        
        [Range(0,0.5f)]
        [SerializeField]     
        private float delay = 0.5f;//检测鼠标延时时长
        private float firstClickTime = 0;//第一次点击时长
        private bool oneClick = false;//第一次点击否

        private bool isHover;//是否在物体上

        [Serializable]
        public class DoubleClickedEvent : UnityEvent { }
        // Event delegates triggered on click.
        //首先有一个为ButtonClickedEvent嵌套类型的m_OnClick字段,
        //ButtonClickedEvent继承自UnityEvent,它是Unity的事件类。
        [FormerlySerializedAs("onDoubleClick")]
        [SerializeField]
        private DoubleClickedEvent m_OnClick = new DoubleClickedEvent();
        protected DoubleClickListener()
        { }

        public DoubleClickedEvent onDoubleClick
        {
            get { return m_OnClick; }
            set { m_OnClick = value; }
        }


        /// <summary>
        /// 鼠标进入物体范围设为True
        /// </summary>
        void OnMouseEnter()
        {
            if(EventSystem.current.IsPointerOverGameObject())
                return;
            isHover = true;
        }

        /// <summary>
        /// 鼠标退出物体范围设为False
        /// </summary>
        void OnMouseExit()
        {
            isHover = false;
        }


        void Update()
        {
            // 如果当前的时间 - 第一次点击的时间 > 0.5秒 直接将点击都回归到false状态
            // 因为已经没有继续判断的必要了
            if (isHover)
            {
                if (Time.time - firstClickTime > delay)
                {
                    oneClick = false;
                }
            }            
        }

        /// <summary>
        /// 鼠标抬起
        /// </summary>
        void OnMouseUp()
        {
            if (EventSystem.current.IsPointerOverGameObject())
                return;

            if (oneClick == false)
            {
                oneClick = true;
                firstClickTime = Time.time;
                return;
            } 

            if (oneClick)
            {
                Debug.Log("双击");

                onDoubleClick.Invoke();
            }
        }

    }
}

使用:

if (!StepTriggerList[11].GetComponent<DoubleClickListener>())
{
    StepTriggerList[11].AddComponent<DoubleClickListener>().onDoubleClick.AddListener(delegate
    {
        MoveCamera(0, 1.5f);
        SetActive(_currentUIManager.returnNormalCameraButton, true);
    });
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值