Unity 简单手势识别

Unity 简单手势识别

代码很简单没有难度,都有注解,随便 康一康 就会了。

CallEvent () 方法需要自己搭载使用。

Unity 代码

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

/// <summary>
/// 手势识别
/// </summary>

public class PlayerAnimator_ZH : MonoBehaviour
{
    //鼠标第一次点击位置
    public Vector2 _MousePos;
    //位置枚举
    public GestureState _GestureStateBe;
    //最小动作距离
    private float _MinGestureDistance = 20.0f;
    //手势开启布尔
    private bool _IsInvaild;
    
    void Update()
    {
        //手势方法
        GestureOnClick();
    }

    //手势方法
    public void GestureOnClick()
    {
        //手势为空
        _GestureStateBe = GestureState.Null;

        if (Input.GetMouseButtonDown(0))
        {
            //第一次鼠标点击位置记录
            _MousePos = Input.mousePosition;
            //开启手势识别
            _IsInvaild = true;

        }
        if (Input.GetMouseButton(0))
        {
            //鼠标轨迹向量
            Vector2 _Dis = (Vector2)Input.mousePosition - _MousePos;
            //画线
            Debug.DrawLine(_MousePos, (Vector2)Input.mousePosition, Color.cyan);
            //判断当前 向量的长度 是否大于 最小动作距离
            if (_Dis.magnitude>_MinGestureDistance)
            {
                //判断在 空间 X轴 还是在 Y轴
                if (Mathf.Abs(_Dis.x) > Mathf.Abs(_Dis.y) && _IsInvaild)
                {
                    if (_Dis.x > 0)
                    {
                        //如果当前向量值 X 大于 0  就是 Right 状态
                        _GestureStateBe = GestureState.Right;
                    }
                    else if (_Dis.x < 0)
                    {
                        //如果当前向量值 X 小于 0  就是 Lift 状态
                        _GestureStateBe = GestureState.Lift;
                    }
                }
                //判断在 空间 X轴 还是在 Y轴
                else if (Mathf.Abs(_Dis.x) < Mathf.Abs(_Dis.y) && _IsInvaild)
                {
                    if (_Dis.y > 0)
                    {
                        //如果当前向量值 Y 大于 0  就是 Up 状态
                        _GestureStateBe = GestureState.Up;
                    }
                    else if (_Dis.y < 0)
                    {
                        //如果当前向量值 Y 小于 0  就是 Down 状态
                        _GestureStateBe = GestureState.Down;
                    }
                }
                //关闭手势识别
                _IsInvaild = false;
            }            
        }
    }

	//呼叫事件
    public void CallEvent()
    {
        switch (_GestureStateBe)
        {
            case GestureState.Null:

                // Null 方法调用(自己写)

                break;

            case GestureState.Up:

                // Up 方法调用(自己写)

                break;

            case GestureState.Down:

                // Down 方法调用(自己写)

                break;

            case GestureState.Lift:

                // Lift 方法调用(自己写)

                break;

            case GestureState.Right:

                // Right 方法调用(自己写)

                break;

            default:
                break;
        }
    }

    //状态枚举
    public enum GestureState
    {
        Null,
        Up,
        Down,
        Lift,
        Right
    }
}


其实代码还可进行补充,比如左上、左下、右上、右下、叠加等等吧,如有问题就 Call 我吧。
 
 欢迎交流,虽然我是个小菜鸡,哈哈哈
 
 就酱,入君共勉。

版权声明:本文为weixin_43925843原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。