栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity 点击、双击、连击、长按 事件检测(支持PC和移动端)

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity 点击、双击、连击、长按 事件检测(支持PC和移动端)

InputDefine 类:(公共变量、常量、枚举、事件)定义

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputDefine 
{
    /// 两次点击的时间间隔
    public const float DOUBLE_CLICK_RATE = 0.3f;
    /// 连续按住0.5s后判定为长按
    public const float LONG_PRESS_SCALE = 0.5f;


    /// 判断是否点击在UI上面
    public static bool IsTouchUI()
    {
        if (UnityEngine.EventSystems.EventSystem.current == null) return false;

        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
        {
            if (Input.touchCount < 1) return false;
            if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) return true;
        }
        else
        {
            if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()) return true;
        }

        return false;
    }

}

/// 输入事件类型
public enum EnumInputEventType
{
    /// 没有事件
    None,
    /// 单击
    Click,
    /// 双击
    DoubleClick,
    /// 滑动
    //Slide,
    /// 长按
    LongPress,
}

/// 
/// 输入事件
/// 
/// 是否触摸到UI
/// (PC端)0表示左键,1表示右键,2表示中键
/// 输入事件类型
public delegate void DelInputEvent(bool isTouchUI, int keyCode, EnumInputEventType enumInputEventType);


/// 
/// 鼠标点击
/// 
/// 是否触摸到UI
/// (PC端)0表示左键,1表示右键,2表示中键
/// 连续点次数
public delegate void DelClickEvent(bool isTouchUI, int keyCode, Vector2 clickPs, int clickCount);

MouseEvent 类:鼠标事件(PC端)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

/// 鼠标事件
public class MouseEvent : MonoBehaviour
{
    public DelInputEvent onInputEventChange;
    public DelClickEvent onClickEvent;

    private MouseParam[] mouseParams = new MouseParam[] { new MouseParam(), new MouseParam(), new MouseParam() };

    private void Update()
    {
        addMouseInputEventTypeJudge();
    }

    /// 添加
    private void addMouseInputEventTypeJudge()
    {
        for(int i=0;i< mouseParams.Length;i++)
        {
            mouseInputEventTypeJudge(i);
        }
    }

    /// 鼠标左键输入事件判定
    private void mouseInputEventTypeJudge(int mouseKeyCode)
    {
        //鼠标按下
        if (Input.GetMouseButtonDown(mouseKeyCode))
        {
            mouseParams[mouseKeyCode].startTime = Time.realtimeSinceStartup;
        }

        //鼠标按住
        if (Input.GetMouseButton(mouseKeyCode))
        {
            mouseParams[mouseKeyCode].holdTime = Time.realtimeSinceStartup - mouseParams[mouseKeyCode].startTime;
            if (mouseParams[mouseKeyCode].holdTime >= InputDefine.LONG_PRESS_SCALE)
            {
                if (onInputEventChange != null) onInputEventChange(InputDefine.IsTouchUI(),mouseKeyCode,EnumInputEventType.LongPress);
            }
        }

        //鼠标抬起
        if (Input.GetMouseButtonUp(mouseKeyCode))
        {
            if (mouseParams[mouseKeyCode].holdTime >= InputDefine.LONG_PRESS_SCALE) return;

            if (onInputEventChange != null) onInputEventChange(InputDefine.IsTouchUI(), mouseKeyCode,EnumInputEventType.Click);

            mouseParams[mouseKeyCode].t2 = Time.realtimeSinceStartup;
            if (mouseParams[mouseKeyCode].t2 - mouseParams[mouseKeyCode].t1 < InputDefine.DOUBLE_CLICK_RATE)
            {
                //Debug.Log(mouseKeyCode + ":双击!");

                mouseParams[mouseKeyCode].clickCount++;
                if (onInputEventChange != null) onInputEventChange(InputDefine.IsTouchUI(), mouseKeyCode,EnumInputEventType.DoubleClick);
            }
            else
            {
                mouseParams[mouseKeyCode].clickCount = 1;
            }

            mouseParams[mouseKeyCode].t1 = mouseParams[mouseKeyCode].t2;

            if (onClickEvent != null) onClickEvent(InputDefine.IsTouchUI(), mouseKeyCode,Input.mousePosition, mouseParams[mouseKeyCode].clickCount);
        }
    }

    public struct MouseParam
    {
        public float startTime;
        public float holdTime;
        public float t1;
        public float t2;
        public int clickCount;
    }

}

TouchEvent 类:触摸事件(移动端)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// 触摸事件
public class TouchEvent : MonoBehaviour
{
    public DelClickEvent onClickEvent;
    private void Update()
    {
        if (Input.touchCount > 0)
        {
            for (int i = 0; i < Input.touchCount; i++)
            {
                Touch touch = Input.GetTouch(i);

                if (touch.phase == TouchPhase.Began)
                {
                    if (onClickEvent != null) onClickEvent(InputDefine.IsTouchUI(), i, touch.position, touch.tapCount);
                    //Debug.Log(i + "---" + "touch.tapCount:" + touch.tapCount+ "---touch.position:"+ touch.position);
                }
            }
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/897901.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号