9

FingerGestures研究院之初探Unity手势操作(一)

 3 years ago
source link: https://www.xuanyusong.com/archives/1869
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
FingerGestures研究院之初探Unity手势操作(一) | 雨松MOMO程序研究院

          昨天搬家,我被无情的从4楼请上了10楼。原因就是房东们为了争家产打官司,受伤的永远是我们这些打工的租房的码农,呵呵!结果就是我们两家做了一个调换把房子换了一下。东西太多了,真的好累啊,好累啊~~前几天有个朋友问我Unity手势操作,后来我还帮他做了一个例子。我觉得在Unity中用这个手势操作的插件会很方便。以前我只是知道FingerGestures,但是没有深入的用过,这两天学习了一下。真的很好用。

          最近研究了一下Unity中的一个手势操作的插件FingerGestures。它能很方便监听到Unity中的各种手势事件:上下左右四方向的滑动事件、按下事件、抬起事件、移动事件、连击事件、长按事件等等。它同时支持触摸屏操作与鼠标操作,总起来说使用起来还是比较方便的,今天写下教程记录这个插件的详细使用步骤。首先下载这个插件,大家可以在圣典上找这个插件的下载地址,当然也可以在本文最后下载该插件。

 我看了一下这个插件底层的实现步骤,他是通过C#代理的形式来实现手势操作的。如下图红圈内所示,这五个重要的预设用来监听触摸与鼠标的手势事件。包括:单手触摸事件、双手触摸事件、鼠标事件、触摸事件。这里我们使用一个单手的事件,如图中所示将Finger Gertures Initializer拖拽入左侧层次视图中。



OK,上面我们说了该插件是通过C#代理形式来接收事件消息的,所以我们需要用脚本来注册这些事件从而开始接收消息。接着创建一个立方体对象用以处理手势操作,当然你也可以处理游戏中的任何对象。编写脚本FingerEvent.cs ,把这个脚本挂在这个立方体对象之上。

FingerEvent.cs脚本 

using UnityEngine;
using System.Collections;
public class FingerEvent :  MonoBehaviour {
    void OnEnable()
     //启动时调用,这里开始注册手势操作的事件。
     //按下事件: OnFingerDown就是按下事件监听的方法,这个名子可以由你来自定义。方法只能在本类中监听。下面所有的事件都一样!!!
        FingerGestures.OnFingerDown += OnFingerDown;
        //抬起事件
FingerGestures.OnFingerUp += OnFingerUp;
    //开始拖动事件
    FingerGestures.OnFingerDragBegin += OnFingerDragBegin;
        //拖动中事件...
        FingerGestures.OnFingerDragMove += OnFingerDragMove;
        //拖动结束事件
        FingerGestures.OnFingerDragEnd += OnFingerDragEnd;
//上、下、左、右、四个方向的手势滑动
FingerGestures.OnFingerSwipe += OnFingerSwipe;
//连击事件 连续点击事件
FingerGestures.OnFingerTap += OnFingerTap;
//手指触摸屏幕中事件调用一下三个方法
FingerGestures.OnFingerStationaryBegin += OnFingerStationaryBegin;
FingerGestures.OnFingerStationary += OnFingerStationary;
FingerGestures.OnFingerStationaryEnd += OnFingerStationaryEnd;
//长按事件
FingerGestures.OnFingerLongPress += OnFingerLongPress;
    void OnDisable()
     //关闭时调用,这里销毁手势操作的事件
     //和上面一样
        FingerGestures.OnFingerDown -= OnFingerDown;
FingerGestures.OnFingerUp -= OnFingerUp;
FingerGestures.OnFingerDragBegin -= OnFingerDragBegin;
        FingerGestures.OnFingerDragMove -= OnFingerDragMove;
        FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;
FingerGestures.OnFingerSwipe -= OnFingerSwipe;
FingerGestures.OnFingerTap -= OnFingerTap;
FingerGestures.OnFingerStationaryBegin -= OnFingerStationaryBegin;
FingerGestures.OnFingerStationary -= OnFingerStationary;
FingerGestures.OnFingerStationaryEnd -= OnFingerStationaryEnd;
FingerGestures.OnFingerLongPress -= OnFingerLongPress;
    //按下时调用
    void OnFingerDown( int fingerIndex, Vector2 fingerPos )
//int fingerIndex 是手指的ID 第一按下的手指就是 0 第二个按下的手指就是1。。。一次类推。
//Vector2 fingerPos 手指按下屏幕中的2D坐标
//将2D坐标转换成3D坐标
        transform.position = GetWorldPos( fingerPos );
Debug.Log(" OnFingerDown ="  +fingerPos);
//抬起时调用
void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown )
Debug.Log(" OnFingerUp ="  +fingerPos);
//开始滑动
void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )
   Debug.Log("OnFingerDragBegin fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos +"startPos =" +startPos);
//滑动结束
void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos )
Debug.Log("OnFingerDragEnd fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos);
//滑动中
    void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )
           transform.position = GetWorldPos( fingerPos );
Debug.Log(" OnFingerDragMove ="  +fingerPos);
//上下左右四方方向滑动手势操作
void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity )
//结果是 Up Down Left Right 四个方向
Debug.Log("OnFingerSwipe " + direction + " with finger " + fingerIndex);
//连续按下事件, tapCount就是当前连续按下几次
void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount )
        Debug.Log("OnFingerTap " + tapCount + " times with finger " + fingerIndex);
//按下事件开始后调用,包括 开始 结束 持续中状态只到下次事件开始!
         //OnFingerStationary 事件和  OnFingerDragMove 有一个区别。
         //OnFingerStationary 是手指触摸在屏幕中的事件,而OnFingerDragMove是先触摸一下然后滑动的事件。
         //如果你需要时时捕获手指触摸屏幕中的事件时 用OnFingerStationary 即可
void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos )
Debug.Log("OnFingerStationaryBegin " + fingerPos + " times with finger " + fingerIndex);
void OnFingerStationary( int fingerIndex, Vector2 fingerPos, float elapsedTime )
Debug.Log("OnFingerStationary " + fingerPos + " times with finger " + fingerIndex);
void OnFingerStationaryEnd( int fingerIndex, Vector2 fingerPos, float elapsedTime )
Debug.Log("OnFingerStationaryEnd " + fingerPos + " times with finger " + fingerIndex);
//长按事件
void OnFingerLongPress( int fingerIndex, Vector2 fingerPos )
Debug.Log("OnFingerLongPress " + fingerPos );
//把Unity屏幕坐标换算成3D坐标
    Vector3 GetWorldPos( Vector2 screenPos )
        Camera mainCamera = Camera.main;
        return mainCamera.ScreenToWorldPoint( new Vector3( screenPos.x, screenPos.y, Mathf.Abs( transform.position.z - mainCamera.transform.position.z ) ) );

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK