国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity_Input System】Input System新輸入系統(tǒng)(三)——在游戲中更換按鍵綁定

這篇具有很好參考價值的文章主要介紹了【Unity_Input System】Input System新輸入系統(tǒng)(三)——在游戲中更換按鍵綁定。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

八、在游戲中更換按鍵綁定

1.Binding和CompositeBinding

  • Binding只由一個部分組成,一般綁定單個按鍵或者搖桿
  • CompositeBinding由兩個以上部分組成,一般是用于將多個按鍵組成虛擬軸

更換按鍵綁定時,Binding和Composite Binding需要分別處理,對Composite Binding需要循環(huán)各個部分進行修改。

可以用InputBinding.isComposite來判斷是否是Composite Binding

unity inputsystem綁定ui,Unity,unity

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

public class CompositeBindingCheck : MonoBehaviour
{
    MyAction inputActions;
    private void Start()
    {
        inputActions = new MyAction();
        Debug.Log("WASD:" + inputActions.Player.Test1.bindings[0].isComposite);
        Debug.Log("Left Stick:" + inputActions.Player.Test1.bindings[1].isComposite);
    }

}

?控制臺輸出結果:

unity inputsystem綁定ui,Unity,unity

2.在UI中顯示原本的按鍵綁定

1>顯示Action名稱

用到的API:InputAction.name

2>顯示Binding名稱

用到的API:InputAction.GetBindingDisplayString

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    [SerializeField]
    public InputActionReference actionReference;
    private void Start()
    {
        actionLabel.text = actionReference.name;
        bindingLabel.text = actionReference.action.GetBindingDisplayString(0, out string deviceLayoutName, out string controlPath);
    }

}

unity inputsystem綁定ui,Unity,unity

運行效果:

unity inputsystem綁定ui,Unity,unity

PS.InputActionReferrence是InputSystem的一個API,用來引用在InputActionAsset中已經(jīng)設置過的InputAction,即使被引用的InputAction重命名,引用也不會丟失,

請查閱:Class InputActionReference | Input System | 1.3.0 (unity3d.com)

3.更換按鍵綁定

用到的API:InputAction.PerformInteractiveRebinding

請查閱:Class InputActionRebindingExtensions | Input System | 1.3.0 (unity3d.com)

How do I…? | Input System | 1.3.0 (unity3d.com)

注意Binding和Composite Binding需要分別處理,因為Composite Binding需要循環(huán)更換每個部分的按鍵綁定

下面的例子只是簡單去測試怎么使用這個API去修改按鍵綁定,如果是實際項目需要,可以參考官方案例:Rebinding UI

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    //Binding的id
    public string bindingId;
    
    private int index;
    [SerializeField]
    public InputActionReference actionReference;
    private InputActionRebindingExtensions.RebindingOperation RebindOperation;
    private void Start()
    {
        //UI顯示Action名
        actionLabel.text = actionReference.name;
        //獲取BingdingID
        /* 這里只是為了簡單,所以手動選擇要修改的binding,并且獲取它的id
         * 這個例子里面,第0層是WASD
         * 第1層是composite的第1個部分W
         * 第2層是composite的第2個部分S
         * 第3層是composite的第3個部分A
         * 第4層是composite的第4個部分D
         * 第5層是左搖桿
         */
        index = 0;
        bindingId = actionReference.action.bindings[index].id.ToString();
        //UI刷新Binding名
        UpdateLabel(index);
    }
    /// <summary>
    /// 開始替換
    /// </summary>
    /// <param name="index"></param>
    public void StartInteractiveRebind()
    {
        //獲取bindingIndex,Bingdings數(shù)組的下標,從0開始,如果action為空返回false
        if (!CheckActionAndBinding(out int bindingIndex))
            return;

        // If the binding is a composite, we need to rebind each part in turn.
        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            var firstPartIndex = bindingIndex + 1;
            if (firstPartIndex < actionReference.action.bindings.Count && actionReference.action.bindings[firstPartIndex].isPartOfComposite)
                PerformInteractiveRebind(actionReference, firstPartIndex, allCompositeParts: true);
        }
        else
        {
            PerformInteractiveRebind(actionReference, bindingIndex);
        }
    }
    /// <summary>
    /// 獲取bindingIndex,Bingdings數(shù)組的下標,從0開始,如果action為空返回false
    /// </summary>
    /// <param name="index"></param>
    private bool CheckActionAndBinding(out int bindingIndex)
    {
        bindingIndex = -1;
        if (actionReference == null)
            return false;
        bindingIndex = actionReference.action.bindings.IndexOf(x => x.id == new System.Guid(bindingId));
        return true;

    }
    private void PerformInteractiveRebind(InputAction action, int bindingIndex, bool allCompositeParts = false)
    {
        RebindOperation?.Cancel(); // Will null out m_RebindOperation.

        void CleanUp()
        {
            RebindOperation?.Dispose();
            RebindOperation = null;
        }

        // Configure the rebind.
        RebindOperation = action.PerformInteractiveRebinding(bindingIndex)
            .WithControlsExcluding("Mouse")//剔除鼠標
            .OnCancel(
                operation =>
                {
                    CleanUp();
                })
            .OnComplete(
                operation =>
                {
                    UpdateLabel(index);
                    CleanUp();

                        // If there's more composite parts we should bind, initiate a rebind
                        // for the next part.
                    if (allCompositeParts)
                    {
                        var nextBindingIndex = bindingIndex + 1;
                        if (nextBindingIndex < action.bindings.Count && action.bindings[nextBindingIndex].isPartOfComposite)
                            PerformInteractiveRebind(action, nextBindingIndex, true);
                    }
                });
        RebindOperation.Start();
    }
    /// <summary>
    /// UI刷新binding名
    /// </summary>
    /// <param name="index"></param>
    private void UpdateLabel(int index)
    {
        bindingLabel.text = actionReference.action.GetBindingDisplayString(index, out string deviceLayoutName, out string controlPath);
    }
}

unity inputsystem綁定ui,Unity,unity

unity inputsystem綁定ui,Unity,unity

運行效果:

?unity inputsystem綁定ui,Unity,unity

4.按鍵的保存

//Load:
var rebinds = PlayerPrefs.GetString("rebinds");
if (!string.IsNullOrEmpty(rebinds))
actions.LoadBindingOverridesFromJson(rebinds);

//Save:
var rebinds = actions.SaveBindingOverridesAsJson();
PlayerPrefs.SetString("rebinds", rebinds);

5.按鍵恢復默認設置

用到的API:InputAction.RemoveBindingOverride

請查閱:Class InputActionRebindingExtensions | Input System | 1.3.0 (unity3d.com)

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    //Binding的id
    public string bindingId;
    
    private int index;
    [SerializeField]
    public InputActionReference actionReference;
    private InputActionRebindingExtensions.RebindingOperation RebindOperation;
    private void Start()
    {
        //UI顯示Action名
        actionLabel.text = actionReference.name;
        //獲取BingdingID
        /* 這里只是為了簡單,所以手動選擇要修改的binding,并且獲取它的id
         * 這個例子里面,第0層是WASD
         * 第1層是composite的第1個部分W
         * 第2層是composite的第2個部分S
         * 第3層是composite的第3個部分A
         * 第4層是composite的第4個部分D
         * 第5層是左搖桿
         */
        index = 0;
        bindingId = actionReference.action.bindings[index].id.ToString();
        //UI刷新Binding名
        UpdateLabel(index);
    }
    //開始替換
    public void StartInteractiveRebind()
    {
        //獲取bindingIndex,Bingdings數(shù)組的下標,從0開始,如果action為空返回false
        if (!CheckActionAndBinding(out int bindingIndex))
            return;

        // If the binding is a composite, we need to rebind each part in turn.
        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            var firstPartIndex = bindingIndex + 1;
            if (firstPartIndex < actionReference.action.bindings.Count && actionReference.action.bindings[firstPartIndex].isPartOfComposite)
                PerformInteractiveRebind(actionReference, firstPartIndex, allCompositeParts: true);
        }
        else
        {
            PerformInteractiveRebind(actionReference, bindingIndex);
        }
    }
    //獲取bindingIndex,Bingdings數(shù)組的下標,從0開始,如果action為空返回false
    private bool CheckActionAndBinding(out int bindingIndex)
    {
        bindingIndex = -1;
        if (actionReference == null)
            return false;
        bindingIndex = actionReference.action.bindings.IndexOf(x => x.id == new System.Guid(bindingId));
        return true;

    }
    private void PerformInteractiveRebind(InputAction action, int bindingIndex, bool allCompositeParts = false)
    {
        RebindOperation?.Cancel(); // Will null out m_RebindOperation.

        void CleanUp()
        {
            RebindOperation?.Dispose();
            RebindOperation = null;
        }

        // Configure the rebind.
        RebindOperation = action.PerformInteractiveRebinding(bindingIndex)
            .WithControlsExcluding("Mouse")//剔除鼠標
            .OnCancel(
                operation =>
                {
                    CleanUp();
                })
            .OnComplete(
                operation =>
                {
                    UpdateLabel(index);
                    CleanUp();

                        // If there's more composite parts we should bind, initiate a rebind
                        // for the next part.
                    if (allCompositeParts)
                    {
                        var nextBindingIndex = bindingIndex + 1;
                        if (nextBindingIndex < action.bindings.Count && action.bindings[nextBindingIndex].isPartOfComposite)
                            PerformInteractiveRebind(action, nextBindingIndex, true);
                    }
                });
        RebindOperation.Start();
    }
    /// <summary>
    /// UI刷新binding名
    /// </summary>
    /// <param name="index"></param>
    private void UpdateLabel(int index)
    {
        bindingLabel.text = actionReference.action.GetBindingDisplayString(index, out string deviceLayoutName, out string controlPath);
    }

    public void ResetToDefault()
    {
        if (!CheckActionAndBinding(out var bindingIndex))
            return;

        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            // It's a composite. Remove overrides from part bindings.
            for (var i = bindingIndex + 1; i < actionReference.action.bindings.Count && actionReference.action.bindings[i].isPartOfComposite; ++i)
                actionReference.action.RemoveBindingOverride(i);
        }
        else
        {
            actionReference.action.RemoveBindingOverride(bindingIndex);
        }
        UpdateLabel(index);
    }
}

unity inputsystem綁定ui,Unity,unity

運行效果:?

unity inputsystem綁定ui,Unity,unity文章來源地址http://www.zghlxwxcb.cn/news/detail-765717.html

到了這里,關于【Unity_Input System】Input System新輸入系統(tǒng)(三)——在游戲中更換按鍵綁定的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 第五十二章 Unity Input System 新輸入系統(tǒng)

    第五十二章 Unity Input System 新輸入系統(tǒng)

    新輸入系統(tǒng)InputSystem是2019年Unity新推出的插件。請注意,Unity默認使用舊的Input Manager,新的Input System處于未啟用狀態(tài)。當你安裝Input System組件時,Unity會詢問你是否啟用新的輸入系統(tǒng)。如果你選擇Yes,Unity會啟用新的并禁用舊的,之后編輯器將重新啟動。具體的操作是,打開包

    2024年02月07日
    瀏覽(22)
  • Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入

    Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入

    輸入系統(tǒng)是 VR 應用中非常重要的一部分。我們通常需要獲取 VR 手柄上某個按鍵的輸入,然后將其作用到應用中,比如按下手柄的 Grip 鍵進行抓取。在我的其他 Unity XR Interaction Toolkit 的開發(fā)教程里,已經(jīng)有介紹如何去獲取手柄的輸入。那么這篇教程我將做一個總結,將相關的

    2024年02月12日
    瀏覽(24)
  • Unity New Input System 及其系統(tǒng)結構和源碼淺析【Unity學習筆記·第十二】

    Unity New Input System 及其系統(tǒng)結構和源碼淺析【Unity學習筆記·第十二】

    轉載請注明出處:??https://blog.csdn.net/weixin_44013533/article/details/132534422 作者:CSDN@|Ringleader| 主要參考: 官方文檔:Unity官方Input System手冊與API 官方測試用例:Unity-Technologies/InputSystem 如果c#的委托和事件不了解,參考我這篇:【C#學習筆記】委托與事件 (從觀察者模式看C#的委

    2024年01月25日
    瀏覽(25)
  • 第五十章 Unity Input Manager 輸入系統(tǒng)(上)

    第五十章 Unity Input Manager 輸入系統(tǒng)(上)

    Unity的輸入系統(tǒng)支持多種輸入設備,比如鍵盤和鼠標,游戲手柄,觸摸屏,VR和AR控制器等等。Unity 通過兩個獨立的系統(tǒng)提供輸入支持:第一,輸入管理器 (Input Manager) 是 Unity 核心平臺的一部分,默認情況下可用,屬于舊的unity輸入系統(tǒng)。第二,輸入系統(tǒng) (Input System) 是一個包,

    2024年02月10日
    瀏覽(26)
  • 第五十一章 Unity Input Manager 輸入系統(tǒng)(下)

    第五十一章 Unity Input Manager 輸入系統(tǒng)(下)

    本章節(jié)我們就來使用水平軸和垂直軸來控制游戲物體的移動和旋轉。我們之前大致講過,游戲物體移動最重要的是方向,速度和時間三個要素,同樣旋轉也是。接下來,我們將之前創(chuàng)建的地形場景導入進來,如下所示 然后將之前的“MecanimDemo”工程里面的模型文件和動畫文件

    2024年02月03日
    瀏覽(27)
  • Unity SteamVR 開發(fā)教程:SteamVR Input 輸入系統(tǒng)(2.x 以上版本)

    Unity SteamVR 開發(fā)教程:SteamVR Input 輸入系統(tǒng)(2.x 以上版本)

    輸入系統(tǒng)是 VR 開發(fā)中非常重要的一部分。我們通常需要獲取 VR 手柄上某個按鍵的輸入,然后將其作用到應用中,比如按下手柄的 Grip 鍵進行抓取,就需要在檢測到“按下手柄 Grip 鍵”的輸入操作時,執(zhí)行抓取的行為。 SteamVR 插件是 Valve 提供給 Unity 開發(fā)者的用于開發(fā) PCVR (頭

    2024年02月08日
    瀏覽(26)
  • Unity 3D Input System的使用

    Unity 3D Input System的使用

    Input System是Unity新推出的輸入系統(tǒng),可以用作以前Input Manager的更具擴展性和可自定義性的替代方案。這里我將使用Unity 3D的Input System來實現(xiàn)一個FPS第一人稱的游戲場景。 演示效果如下: 新建一個Unity 3D項目,在Asset Store里面下載StarterAssets - FirstPerson,然后在Package Manager里面導

    2024年02月20日
    瀏覽(21)
  • 游戲開發(fā)小結——Unity 2.5D 平臺游戲:跳墻(新輸入系統(tǒng))

    游戲開發(fā)小結——Unity 2.5D 平臺游戲:跳墻(新輸入系統(tǒng))

    到目前為止,在這個項目中,我已經(jīng)介紹了如何創(chuàng)建具有雙跳功能的物理基礎角色控制器。我添加了動態(tài)平臺、收藏品和事件驅(qū)動的電梯。 今天我將回到角色控制器腳本(Player)并添加墻跳功能。這將允許玩家檢測墻壁的表面并從一堵墻跳到另一堵墻。 場景設置 我的場景有

    2024年02月01日
    瀏覽(23)
  • vue+element-ui input輸入框設置屬性type為number去除右邊的上下按鍵

    當 input type=number 時,去掉后面的上下按鈕 1.全局樣式改變: 2.在style中使用的是vue+element,通常寫當前頁面的樣式時使用scoped,防止篡改其他頁面樣式,但是這樣會發(fā)現(xiàn)上面的代碼失效,此時需要使用/deep/去尋找 【定義樣式】去除表框、去除上下箭頭、去除滾輪事件 3.在sty

    2024年02月11日
    瀏覽(62)
  • 【Unity學習筆記】New Input System 部分源碼和測試用例補充

    【Unity學習筆記】New Input System 部分源碼和測試用例補充

    轉載請注明出處:??https://blog.csdn.net/weixin_44013533/article/details/135630016 作者:CSDN@|Ringleader| 主要參考: Unity官方Input System手冊與API 【Unity學習筆記】Unity TestRunner使用 NewIputSystem主體內(nèi)容請參見:【Unity學習筆記】第十二 · New Input System 及其系統(tǒng)結構 和 源碼淺析 注:本文使用的

    2024年01月22日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包