Unity Fingers Gesture手势插件教程(新)
前言
前幾天Unity資源商城搞活動白嫖到了這個插件,但是看了下網(wǎng)上的教程都是比較舊的版本,所以決定學(xué)習(xí)記錄一下。個人感覺比easy touch使用方便一些,而且easy touch很久沒更新了。
操作
運行插件內(nèi)演示場景DemoScene。
按住shift鍵或者ctrl模擬雙指操作,此時不需要點擊鼠標(biāo)左邊,移動鼠標(biāo)即可。如果點擊就是三指操作。
shift+鼠標(biāo)滾輪上下:模擬雙指旋轉(zhuǎn)
ctrl+鼠標(biāo)滾輪上下:模擬雙指縮放
配置
打開FingersScriptPrefab,面板里的參數(shù)用于全局控制。
參數(shù)(后面用到特殊的會繼續(xù)補充):
Default DPI:手勢觸發(fā)的靈敏度。如果值設(shè)置的特別大的話手勢會延遲觸發(fā)。除非有特殊需求不然用默認(rèn)值即可。
我們可以通過修改下圖中的Touch來自定義手指顯示的內(nèi)容。
基本使用
首先聲明手勢Recognizer。
private TapGestureRecognizer tapGesture;對Recognizer初始化并傳入回調(diào)。
private void CreateTapGesture(){tapGesture = new TapGestureRecognizer();tapGesture.StateUpdated += TapGestureCallback; //傳入回調(diào)FingersScript.Instance.AddGesture(tapGesture); //對應(yīng)的有Remove}通過傳入的回調(diào)觸發(fā)行為。
private void DoubleTapGestureCallback(DigitalRubyShared.GestureRecognizer gesture){if (gesture.State == GestureRecognizerState.Ended){Debug.Log("Tap");}}常用的API(參考案例代碼)
注意手勢是全局的,不需要選中,如果想指定目標(biāo)需要綁定目標(biāo)或者自行加邏輯判斷。
StateUpdated:注冊手勢的回調(diào)事件
tripleTapGesture.StateUpdated += PlatformSpecificViewTapUpdated;
PlatformSpecificView:指定點擊的目標(biāo)
tripleTapGesture.PlatformSpecificView = bottomLabel.gameObject;
NumberOfTapsRequired:Tap手勢的連點次數(shù)。單擊、雙擊等都是靠這個區(qū)分
tripleTapGesture.NumberOfTapsRequired = 3;
AddGesture:注冊手勢
FingersScript.Instance.AddGesture(tripleTapGesture);
GestureRecognizerState:手勢回調(diào)中判斷當(dāng)前的執(zhí)行階段
if (gesture.State == GestureRecognizerState.Ended)
RequireGestureRecognizerToFail:添加或移除一個需要失敗的手勢。 設(shè)置為 null 可以清除所有需要失敗的手勢。比如說下面的例子意思為如果doubleTapGesture手勢觸發(fā)了就會導(dǎo)致tapGesture觸發(fā)失敗。其實就是防止手勢沖突使用的
tapGesture.RequireGestureRecognizerToFail = doubleTapGesture;
gesture.FocusX, gesture.FocusY:回調(diào)中點擊的屏幕坐標(biāo)
DebugText("Double tapped at {0}, {1}", gesture.FocusX, gesture.FocusY);
Direction:設(shè)置滑動方向
swipeGesture.Direction = SwipeGestureRecognizerDirection.Down;
DirectionThreshold:對于設(shè)置的方向,這是在該方向與另一個方向上必須成比例的滑動量。 例如,與沿 x 軸移動相比,向下滑動手勢需要在 y 軸上移動更多倍數(shù)。 默認(rèn)值為 1.5,這意味著向下滑動手勢需要在 y 軸與 x 軸上大 1.5 倍。小于或等于 1 表示任何比率都可以接受。簡單來說就是這個值越大就需要越貼合目標(biāo)方向
swipeGesture.DirectionThreshold = directionThreshold;// allow a swipe, regardless of slope
gesture.StartFocusX, gesture.StartFocusY:手勢開始的位置
DebugText("Swiped from {0},{1} to {2},{3}; velocity: {4}, {5}", gesture.StartFocusX, gesture.StartFocusY, gesture.FocusX, gesture.FocusY, swipeGesture.VelocityX, swipeGesture.VelocityY);
swipeGesture.VelocityX, swipeGesture.VelocityY:滑動的速度(根據(jù)focus)
DebugText("Swiped from {0},{1} to {2},{3}; velocity: {4}, {5}", gesture.StartFocusX, gesture.StartFocusY, gesture.FocusX, gesture.FocusY, swipeGesture.VelocityX, swipeGesture.VelocityY);
MinimumNumberOfTouchesToTrack:設(shè)置最少用到的手指數(shù),一般用1或2。要注意不是每個手勢都支持多指
panGesture.MinimumNumberOfTouchesToTrack = 2;
MaximumNumberOfTouchesToTrack:設(shè)置最大用到的手指數(shù),默認(rèn)用1或2
longPressGesture.MaximumNumberOfTouchesToTrack = 1;
gesture.DeltaX, gesture.DeltaY:手勢位移的距離
DebugText("Panned, Location: {0}, {1}, Delta: {2}, {3}", gesture.FocusX, gesture.FocusY, gesture.DeltaX, gesture.DeltaY);
scaleGesture.ScaleMultiplier:手指距離的縮放值
DebugText("Scaled: {0}, Focus: {1}, {2}", scaleGesture.ScaleMultiplier, scaleGesture.FocusX, scaleGesture.FocusY);
rotateGesture.RotationRadiansDelta:旋轉(zhuǎn)弧度的變化
Earth.transform.Rotate(0.0f, 0.0f, rotateGesture.RotationRadiansDelta * Mathf.Rad2Deg);
AllowSimultaneousExecution:允許多個手勢同時操作一個目標(biāo)
panGesture.AllowSimultaneousExecution(scaleGesture);
panGesture.AllowSimultaneousExecution(rotateGesture);
scaleGesture.AllowSimultaneousExecution(rotateGesture);
CaptureGestureHandler:捕獲點擊的目標(biāo)并處理。返回false是可穿透,true為不可穿透,null為默認(rèn)。
FingersScript.Instance.CaptureGestureHandler = CaptureGestureHandler;private static bool? CaptureGestureHandler(GameObject obj){if (obj.name.StartsWith("PassThrough")){return false;}else if (obj.name.StartsWith("NoPass")){return true;}return null;}ComponentTypesToDenyPassThrough(重點注意):除了gesture view之外設(shè)置可阻擋gesture檢測的類型。比如防止穿透UI。
FingersScript.Instance.ComponentTypesToDenyPassThrough.Add(typeof(UnityEngine.UI.Image));
StartOrResetGesture:開始或重置手勢。參數(shù)分別為手勢、目標(biāo)是否顯示在最前面(只對sprite有效)、相機(jī)、執(zhí)行手勢的游戲?qū)ο蟆@示的sprite、執(zhí)行手勢的模式(是在綁定物體上執(zhí)行還是任意對象)、接收的相機(jī)
FingersScript.StartOrResetGesture(r, BringToFront, Cameras, gameObject, spriteRenderer, GestureRecognizerComponentScriptBase.GestureObjectMode.RequireIntersectWithGameObject, out camera);
ClearTrackedTouchesOnEndOrFail:是否在手勢結(jié)束或失敗時清空跟蹤的touches,默認(rèn)為false。 一般情況下設(shè)置為false
tapGesture.ClearTrackedTouchesOnEndOrFail = true;
AddMask:為手勢添加限制區(qū)域。參數(shù)為collider和手勢。只有在Mask范圍內(nèi)點擊目標(biāo)才會生效
FingersScript.Instance.AddMask(Mask1, tapGesture);
AllowSimultaneousExecutionWithAllGestures:允許和其他所有手勢一起執(zhí)行
tapGesture2.AllowSimultaneousExecutionWithAllGestures();
FingersScript.HasInstance:檢測場景中是否有FingersScript實例
if (FingersScript.HasInstance)
ShowTouches:顯示模擬的點擊,僅在調(diào)試時執(zhí)行此操作,因為它會干擾其他Canvas
FingersScript.Instance.ShowTouches = true;
獲取點擊位置所有可接收射線的物體。
private void TapGestureUpdated(DigitalRubyShared.GestureRecognizer gesture){if (gesture.State == GestureRecognizerState.Ended){Debug.Log("Tapped on " + gesture.PlatformSpecificView);List<UnityEngine.EventSystems.RaycastResult> results = new List<UnityEngine.EventSystems.RaycastResult>();UnityEngine.EventSystems.PointerEventData eventData = new UnityEngine.EventSystems.PointerEventData(UnityEngine.EventSystems.EventSystem.current);eventData.position = new Vector2(gesture.FocusX, gesture.FocusY);UnityEngine.EventSystems.EventSystem.current.RaycastAll(eventData, results);Debug.Log("Event system raycast count: " + results.Count + ", objects: " + string.Join(",", results.Select(r => r.gameObject.name).ToArray()));}}組件介紹
參數(shù)比較簡單,直譯或者查看代碼即可理解。
關(guān)于搖桿
參數(shù)簡單介紹
DeadZone:死區(qū),小于該值的不會觸發(fā)搖桿效果。類似敏感度
InputCurve:傳值曲線
EightAxisMode:八角模式,搖桿會變成上下左右和對角八個方向,搖桿轉(zhuǎn)動有間隔感
MaxRangeRadiusMultiplier:搖桿中心圓拖動到邊界時的偏移
FollowSpeed:搖桿整體跟隨手指的速度,默認(rèn)為0
StartMode:MustStartInside(搖桿靜止,在搖桿上操作)MoveToPanStart(根據(jù)Pan手勢作為搖桿起始點)PanInsideOrPanMovesInside(搖桿靜止,在Pan手勢區(qū)域內(nèi)操作)
RestrictJoystickPositionTo:需要Unity2019以上。將搖桿位置限制在此 collider2D 上,null 表示沒有限制。將 colider 放在搖桿父對象中
ReturnToHomePosition:操作完后自動回到初始位置
Cross Platform Input:輸入軸
Callbacks:搖桿回調(diào),接收Vector2
使用方法
為搖桿傳入回調(diào)事件。當(dāng)然也可以在面板上綁定。
Joystick.JoystickExecuted = JoystickExecuted;
為搖桿加入遮罩。(可選)
FingersScript.Instance.AddMask(Mask1, JoystickScript.PanGesture);
各類Gesture組件
查看DemoSceneComponents場景。面板上功能與前面API介紹的差不多。
FingersPanOrbit
場景:DemoScene3DOrbit
效果:可以方便的實現(xiàn)對目標(biāo)物體的旋轉(zhuǎn)移動和縮放,通過調(diào)整參數(shù)快速的實現(xiàn)想要的效果。
FingersDragDropComponentScript
長按拖拽物體,3D或sprite、UI都可以,但注意只有sprite有顯示在最前面的效果,可以自己修改邏輯。
作者做了很多案例,都是使用這款插件的核心功能擴(kuò)展的,這里就不一一記述了,大家可以自行翻閱以加深理解。
后續(xù)用到其他知識點會繼續(xù)補充。
備注
遇到問題,FingersScript與我的游戲框架中生成的UICanvas沖突了,Canvas接收不到點擊事件。
解決方案: 在場景中創(chuàng)建一個UI->EventSystem,不要動態(tài)生成。
總結(jié)
以上是生活随笔為你收集整理的Unity Fingers Gesture手势插件教程(新)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大西瓜源码
- 下一篇: HTML中粗体strong与b,斜体em