最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

unity中實現(xiàn)Edge瀏覽器鼠標(biāo)手勢的功能思路詳解

 更新時間:2023年12月18日 11:13:58   作者:安東尼王  
這篇文章主要介紹了unity中實現(xiàn)Edge瀏覽器鼠標(biāo)手勢的功能思路詳解,實現(xiàn)起來其實并不復(fù)雜,涉及的技術(shù)點有pc端和移動端屏幕拖動事件,二維向量的相關(guān)運算,手勢匹配算法,事件系統(tǒng)設(shè)計模式,需要的朋友可以參考下

概要

Edge瀏覽器中,只需要使用鼠標(biāo)按住右鍵在屏幕上不同方向拖動,就可以觸發(fā)很多快捷操作,效果很絲滑。那如果想使用unity開發(fā)這么一個功能,支持PC端和移動端,要怎么做呢?

實現(xiàn)思路

實現(xiàn)起來其實并不復(fù)雜,涉及的技術(shù)點有pc端和移動端屏幕拖動事件,二維向量的相關(guān)運算,手勢匹配算法,事件系統(tǒng)設(shè)計模式。
大概思路是:定義鼠標(biāo)路徑為不同的事件類型,例如:“Up”,“Down”,“Left”,“Right”,將相鄰不重復(fù)的路徑類型添加到一個列表中, 通過鼠標(biāo)事件,獲取當(dāng)前幀和上一幀的滑動方向,如果方向偏移當(dāng)前方向范圍,則判斷為鼠標(biāo)在滑動過程中發(fā)生了轉(zhuǎn)折,將每次轉(zhuǎn)折的方向記錄到一個列表中,轉(zhuǎn)折次數(shù)根據(jù)定義的事件鼠標(biāo)路徑數(shù)量而定,超出這個數(shù)量則判定為無效手勢,最后當(dāng)手勢抬起時,匹配定義的事件手勢路徑列表和滑動過程中記錄的手勢列表,如果匹配成功則判定觸發(fā)事件。

1.鼠標(biāo)拖動事件

提示:移動端和pc端事件有所區(qū)別

MouseDown

 	private static bool MouseDown()
    {
        if (Application.isMobilePlatform)
        {
            if (Input.touchCount == 1 && Input.touches[0].phase == TouchPhase.Began)
            {
                MouseId = 0;
                return true;
            }
            return false;
        }
        if (Input.GetMouseButtonDown(1))
        {
            return true;
        }
        return false;
    }

MousePress

 	private static bool MousePress()
    {
        if (Application.isMobilePlatform)
        {
            return Input.touches[0].phase == TouchPhase.Moved || Input.touches[0].phase == TouchPhase.Stationary;
        }
        if (Input.GetMouseButton(1))
        {
            return true;
        }
        return false;
    }

MouseUp

 	private static bool MouseUp()
    {
        if (Application.isMobilePlatform)
        {
            return Input.touches[0].phase == TouchPhase.Ended || Input.touches[0].phase == TouchPhase.Canceled;
        }
        if (Input.GetMouseButtonUp(1))
        {
            return true;
        }
        return false;
    }

2.鼠標(biāo)拖動的二維方向計算

獲取鼠標(biāo)拖動的方向向量

  	private Vector2 GetDragDirection()
    {
        var v = (Vector2)Input.mousePosition - _preMousePoint;
        return v.normalized;
    }

計算方向,目前只識別上下左右四個方向,次方法可擴展為八個方向

 private Direction GetDirection()
    {
        var dir = GetDragDirection();
        var dotH = Vector2.Dot(Vector2.right, dir);
        var dorV = Vector2.Dot(Vector2.up, dir);
        //更趨向于橫向滑動
        if (Mathf.Abs(dotH) > Mathf.Abs(dorV))
        {
            return dotH > 0 ? Direction.Right : Direction.Left;
        }
		//更趨向于縱向滑動
        if (Mathf.Abs(dotH) < Mathf.Abs(dorV))
        {
            return dorV > 0 ? Direction.Up : Direction.Down;
        }
        return _preDirection;
    }

提示:_preMousePoint為上一幀的鼠標(biāo)位置,此字段采集的頻率建議不要太過頻繁,不建議每幀采集,因為可能導(dǎo)致滑動速度過慢時存在噪點手勢,影響事件結(jié)果

3.匹配鼠標(biāo)手勢路徑

記錄路徑方向

private void UpdateGestures()
    {
        var dir = GetDirection();
        if (_preDirection != dir)
        {
            _preDirection = dir;
            _curDirections.Add(dir);
        }
    }

定義事件路徑,此處只示例最多兩段路徑,事件路徑可以擴展多段

  public static Dictionary<GestureState, List<Direction>> Gestures = new()
    {
    { GestureState.Down , new() { Direction.Down }},
    { GestureState.Up , new(){ Direction.Up }},
    { GestureState.Left , new() { Direction.Left }},
    { GestureState.Right , new() { Direction.Right }},
    { GestureState.DownLeft , new() { Direction.Down, Direction.Left}},
    { GestureState.DownRight , new() { Direction.Down,Direction.Right }},
    { GestureState.UpLeft , new() { Direction.Up,Direction.Left }},
    { GestureState.UpRight , new() { Direction.Up,Direction.Right }},
    { GestureState.LeftDown , new() { Direction.Left, Direction.Down }},
    { GestureState.LeftUp , new() { Direction.Left, Direction.Up }},
    { GestureState.RightDown , new() {Direction.Right, Direction.Down }},
    { GestureState.RightUp , new(){Direction.Right, Direction.Up }},
    };

匹配路徑

private GestureState MatchGesture()
    {
        var state = GestureState.Invalid;
        foreach (var gesture in Gestures)
        {
            if (gesture.Value.SequenceEqual(_curDirections))
            {
                state = gesture.Key;
                break;
            }
        }
        return state;
    }

小結(jié)

直線手勢比較簡單,后續(xù)會繼續(xù)研究進階手勢,如曲線,異性等手勢,歡迎交流!

到此這篇關(guān)于unity中實現(xiàn)Edge瀏覽器鼠標(biāo)手勢的功能的文章就介紹到這了,更多相關(guān)unity Edge瀏覽器鼠標(biāo)手勢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#用Activex實現(xiàn)Web客戶端讀取RFID功能的代碼

    C#用Activex實現(xiàn)Web客戶端讀取RFID功能的代碼

    由于要在Web項目中采用RFID讀取功能,所以有必要開發(fā)Activex,一般情況下開發(fā)Activex都采用VC,VB等,但對這兩塊不是很熟悉,所以采用C#編寫Activex的方式實現(xiàn)
    2011-05-05
  • C# MemoryStream類案例詳解

    C# MemoryStream類案例詳解

    這篇文章主要介紹了C# MemoryStream類案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • c# 獲取照片的經(jīng)緯度和時間的示例代碼

    c# 獲取照片的經(jīng)緯度和時間的示例代碼

    這篇文章主要介紹了c# 獲取照片的經(jīng)緯度和時間的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C#引用類型作為方法的參數(shù)分析

    C#引用類型作為方法的參數(shù)分析

    這篇文章主要介紹了C#引用類型作為方法的參數(shù)分析,以實例的形式較為詳細(xì)的分析了參數(shù)的傳值問題,需要的朋友可以參考下
    2014-11-11
  • C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的方式

    C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的方式

    這篇文章主要給大家介紹了關(guān)于C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#中多線程調(diào)用方式的幾種實現(xiàn)

    C#中多線程調(diào)用方式的幾種實現(xiàn)

    本文主要介紹了C#中幾種多線程調(diào)用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • 詳解C# parallel中并行計算的四種寫法總結(jié)

    詳解C# parallel中并行計算的四種寫法總結(jié)

    在C#中,parallel關(guān)鍵字可以用于并行計算。本文為大家總結(jié)了四種C# parallel并行計算的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • C#簡單爬蟲案例分享

    C#簡單爬蟲案例分享

    這篇文章主要為大家分享了C#簡單爬蟲案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 基于WPF實現(xiàn)面包屑效果的示例代碼

    基于WPF實現(xiàn)面包屑效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實現(xiàn)面包屑效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-04-04
  • C# 腳本引擎RulesEngine的使用詳解

    C# 腳本引擎RulesEngine的使用詳解

    這篇文章主要介紹了C# 腳本引擎RulesEngine的使用方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02

最新評論

仁化县| 丰台区| 灵寿县| 南丰县| 彭州市| 驻马店市| 富蕴县| 塔城市| 柘荣县| 开封市| 民和| 嘉禾县| 甘孜| 巴南区| 柏乡县| 蓬莱市| 陇川县| 怀来县| 渑池县| 蓬溪县| 巫山县| 昭通市| 都兰县| 阳曲县| 都安| 四会市| 凌云县| 南召县| 东乡县| 阿拉善左旗| 尖扎县| 红桥区| 金川县| 璧山县| 郁南县| 新余市| 栾城县| 邓州市| 礼泉县| 许昌市| 舟曲县|