八、在游戲中更換按鍵綁定
1.Binding和CompositeBinding
- Binding只由一個部分組成,一般綁定單個按鍵或者搖桿
- CompositeBinding由兩個以上部分組成,一般是用于將多個按鍵組成虛擬軸
更換按鍵綁定時,Binding和Composite Binding需要分別處理,對Composite Binding需要循環(huán)各個部分進行修改。
可以用InputBinding.isComposite來判斷是否是Composite Binding
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);
}
}
?控制臺輸出結果:
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);
}
}
運行效果:
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);
}
}
運行效果:
?
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);
}
}
運行效果:?文章來源:http://www.zghlxwxcb.cn/news/detail-765717.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-765717.html
到了這里,關于【Unity_Input System】Input System新輸入系統(tǒng)(三)——在游戲中更換按鍵綁定的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!