1.基礎(chǔ)概念
1-1.前言
隨著Unity的不斷發(fā)展,開發(fā)者們對Unity的項目輸入系統(tǒng)要求也越來越高,經(jīng)常會有項目在做多平臺適配和跨平臺移植時對變更輸入系統(tǒng)而感到煩惱。而InputSystem這款插件正是Unity官方為了解決廣大開發(fā)者而推出的一款新的輸入方式。
相較于舊版的InputManager,InputSystem的操作雖然更為繁瑣復(fù)雜,但應(yīng)對跨平臺項目時面對不同的輸入方式InputSystem的輸入映射機制則為開發(fā)者們提供了巨大的便捷,這也是我們要學(xué)習(xí)InputSystem的原因。
如果覺得圖文教程不夠詳細的朋友可以移步到 【InputSystem基礎(chǔ)教程】觀看視頻教程。
2.基礎(chǔ)操作
2-1插件安裝
1.我們打開Unity上方工具欄中的Window =>Package Manager打開Unity插件包管理界面
2.點擊右上角Package選項中Unity Registry,然后在右側(cè)搜索欄中搜索Input
3.找到InputSystem插件,點擊安裝
2-2.如何創(chuàng)建InputActions
1.安裝插件后在項目Project中右鍵點擊Creater若出現(xiàn)InputActions選項證明插件安裝成功,點擊創(chuàng)建InputActions。
2.創(chuàng)建InputActions成功后雙擊打開InputActions編輯頁面,此時我們有幾個參數(shù)需要了解并使用的。
2-3.InputActions概念及結(jié)構(gòu)關(guān)系
在我們InputSystem中所用到結(jié)構(gòu)關(guān)系為
InputSystem=>InputActions=>ActionMaps=>Actions
ActionMaps
簡單來說我們可以將InputActions視為我們項目里其中一個控制器的輸入操作管理集,而ActionMaps則為該控制器其中的一個輸入映射集。
Actions
而Actions則為ActionMaps里其中一個動作輸入映射
ActionProperties
在Actions中也有許多參數(shù),其中ActionType則是我們最常用到。其概念為我們該動作輸入映射的類型,有以下三種類型
1.Button 默認設(shè)置,包括按鈕或者按鍵觸發(fā)的一次性動作
2.Value 提供一種連續(xù)狀態(tài)變化事件,如果設(shè)置了多個輸入,就會切換到最主要的一個。用它進行模擬控制,比如移動。
3.Pass Through 和Value很相似,但它不會像Value一樣(如果有多個輸入時,不會只選擇最主要的那個,而把其他的輸入忽略)
在使用Value或者Pass Through Types時,你會看到一個額外的選項 Control Type為該Value的返回值類型
2-4.InputActions常用實例
在我們Unity項目中輸入檢測做常用的兩種功能實現(xiàn)
1.角色移動時持續(xù)輸入 - Value
在我們選擇ActionType為Value之后會出現(xiàn)Control Type,以下為常用的Control Type列舉
Control Type | 使用場景 |
---|---|
Axis | 僅為單軸方向數(shù)值 |
Vector 2 | 為雙軸方向數(shù)值 |
Vector 3 | 為三軸方向數(shù)值 |
2.攻擊或點擊菜單欄時一次性輸入 - Button
2-5.動作映射調(diào)用
官方PlayerInput組件調(diào)用
我們需要在場景中在我們需要的對象上添加PlayerInput組件
隨后我們需要在Player組件中選定我們剛剛創(chuàng)建好的InputActions,選擇想要使用的輸入映射集,再選擇對應(yīng)輸入?yún)?shù)返回的調(diào)用方式BehaviorType
再BehaviorType中我們有四種不同的調(diào)用方式
1.Send Message
使用Send Message時,每次的觸發(fā)會盜用一個對應(yīng)的函數(shù)(就是在對應(yīng)的Actions名前面加個On-)正如下圖所示在我們PlayerInput組件當中我們將BehaviorType選擇了Send Message后我們的輸入?yún)?shù)將會通過Send Message方法發(fā)送到我們對應(yīng)生成的函數(shù)中
比如Input Action 名為 Jump,那么對應(yīng)的函數(shù)即為 OnJump
獲取輸入時的數(shù)據(jù),我們可以寫一個輸入控制類,在該類中調(diào)用我們上述說到的Actions生成函數(shù)
可以通過isPressed獲取設(shè)置了ActionType為Button類型的動作是否點擊
可以通過Get 獲取設(shè)置了ActionType為Value對應(yīng)類型的數(shù)據(jù)
public class PlayerController : MonoBehaviour
{
void OnAction1(InputValue value)
{
bool isAction1Pressd = value.isPressed;
Debug.Log(isAction1Pressd);
}
void OnMove(InputValue value)
{
Vector2 moveVal = value.Get<Vector2>();
Debug.Log(moveVal );
}
void OnJump(InputValue value)
{
float triggerVal = value.Get<float>();
Debug.Log(triggerVal );
}
}
2.Broadcast Messages
Broadcast Messages 與 send Message 很相似(但目前我還沒有搞懂具體區(qū)別)
3.Invoke Unity Events
區(qū)別于上述兩種BehaviorType不同的是,在我們選擇該方法后會出現(xiàn)Events的選項,我們需要自己寫好動作方法后將其掛載到我們對應(yīng)的ActionMaps中對應(yīng)的ActionEvents上才能觸發(fā)對應(yīng)的動作事件。
在我們寫的動作方法中需要在方法入?yún)⑻幖由螴nputAction.CallbackContext類型的入?yún)?,通過此參數(shù)我們才能獲取我們對應(yīng)輸入返回(且加入該參數(shù)后會將其方法置頂如上圖所示)
public class PlayerController : MonoBehaviour
{
public void moveControl(InputAction.CallbackContext value)
{
Vector2 moveVal = value.ReadValue<Vector2>();
Debug.Log(moveVal);
}
}
4.Invoke C Sharp Events
與Invoke Unity Events方式其實大致相同,需要我們自己先寫好一個帶有InputAction.CallbackContext類型入?yún)⒌膭幼鞣椒?,不同的是我們掛載方式變成了腳本事件加載而不是在Unity界面上的可視化掛載
using UnityEngine;
using UnityEngine.InputSystem;
public class CSharpEvent : MonoBehaviour
{
public PlayerInput playerInput;
void OnEnable()
{
playerInput.onActionTriggered += MyEventFunction;
}
void OnDisable()
{
playerInput.onActionTriggered -= MyEventFunction;
}
void MyEventFunction(InputAction.CallbackContext value)
{
Debug.Log(value.action.name + (" was triggered"));
}
}
提示:在我自己嘗試下發(fā)現(xiàn)上述四種的官方組件調(diào)用方式都只在輸入發(fā)生時觸發(fā)時發(fā)送一次輸入返回,并不會持續(xù)發(fā)送,所以如果要實現(xiàn)輸入控制角色移動這種需要持續(xù)返回輸入信號功能的并不適合該方式。該方式僅適合如菜單界面點擊按鈕或者跳躍功能這種僅需輸入時觸發(fā)一次返回的功能。
腳本調(diào)用
基于上述提示,所以官方PlayerInput組件調(diào)用動作事件函數(shù)時并不能滿足我們所有的場景需求(也可能是我在持續(xù)返回信號上沒找到解決方案),所以我們還需要學(xué)習(xí)一下不借助官方PlayerInput組件的事件調(diào)用。我們直接在我們的腳本中調(diào)用InputSystem中的動作事件。
在我們使用腳本調(diào)用之前我們需要做一件事情,在我們創(chuàng)建好的InputActions屬性面板中找到Generate C# Class并勾選,隨后點擊Apply生成對應(yīng)的腳本,之后我們就可以在我們自己寫的PlayerController 類中調(diào)用該腳本了
不知道怎么說明了,直接上代碼(自己看注釋理解)
using UnityEngine;
using UnityEngine.InputSystem;
public class CSharpEvent : MonoBehaviour
{
private PlayerInputActions playerInputActions;
//將對應(yīng)的ActionMaps中對應(yīng)的Action進行傳址引用
public Vector2 keyboardMoveAxes => playerInputActions.keyboard.moveControl.ReadValue<Vector2>();
void Awake() {
//實例化InputActions腳本
playerInputActions = new PlayerInputActions();
}
private void OnEnable(){
//將要使用的ActionMap開啟
playerInputActions.keyboard.Enable();
}
private void OnDisable()
{
//上述同理
playerInputActions.keyboard.Disable();
}
private void Update()
{
//在幀更新方法中調(diào)用所寫的動作方法
movePlayer();
}
private void movePlayer(){
//因為要在Update方法中使用,需要需要先判斷是否有輸入對應(yīng)的Input操作
if(keyboardMoveAxes != Vector2.zero){
//判斷有輸入后便執(zhí)行對應(yīng)方法
Debug.Log(keyboardMoveAxes);
}
}
}
3.引用文獻
Unity InputSystem官方使用手冊
Unity input system 使用記錄(實例版)- 作者 : xkxsxkx
Unity New Input System 作者 : 小蟲兒飛到花叢中
以上就是本文章全部內(nèi)容了,如果覺得實用可以點個收藏和關(guān)注。博主空間還有更多和Unity相關(guān)的實用技巧歡迎大家來一起相互學(xué)習(xí)。
更詳細的視頻教程:日醉夜的狗-【Unity】InputSystem基礎(chǔ)教程系列文章來源:http://www.zghlxwxcb.cn/news/detail-678714.html
下一期InputSystem進階實用技巧(實現(xiàn)角色移動跳躍等功能) 【Unity】InputSystem實用教程文章來源地址http://www.zghlxwxcb.cn/news/detail-678714.html
到了這里,關(guān)于【Unity InputSystem】基礎(chǔ)教程(保姆級超詳細超基礎(chǔ)?。。。┑奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!