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);
});
}