Unity3d_Rewired官方文档翻译:概念(一):InputManager、Players、Actions
僅翻譯了官方文檔中的Essentials(要點)、Concepts(概念)兩部分,這是文檔中最重要的部分,理解了這兩部分的內(nèi)容應該足以讓你將Rewired運用到你的項目中,之后再去閱讀文檔的其他部分也能更容易理解。
斜體加下劃線部分為添加的注解,非官方文檔內(nèi)容。若你發(fā)現(xiàn)有翻譯、注解不正確的,請留言告知,以免再繼續(xù)誤導他人,感謝。
目錄-
概念
-
Input Manager
- 重要
- 創(chuàng)建一個Input Manager
- 編輯輸入
- 數(shù)據(jù)如何存儲
- OnDestroy
- Input Manager檢視窗口
- 在游戲中使用Input Manager
-
測試單個場景
- Rewired Initializer
- 替代方法
- 編輯器下運行
- 重要信息
-
Players
- 創(chuàng)建/編輯Players
- 訪問Players
- System Player
- 獲取輸入
- Player與控制器映射
- Player與控制器
- Joysticks
- Keyboard
- Mouse
- Custom Controller
-
Actions
- 獲取輸入
- 按鍵與軸
- 創(chuàng)建、編輯Action
- Action類別
- Rewired的目的和職責
-
Input Manager
概念
Input Manager
Input Manger的職責是存儲所有輸入配置數(shù)據(jù),并使其可以在運行時被獲取。你必須保證場景中存在一個Input Manager,否則Rewired輸入將不可用。
重要
- 場景中必須有且只能有一個Input Manager存在【可以存在多個,但只能有一個處于激活狀態(tài)】
- 不要在運行時激活或者禁用Input Manager
創(chuàng)建一個Input Manager
通過菜單界面創(chuàng)建Input Manager: Window -> Rewired -> Create -> Input Manager
- Input Manger(Prefab) - 將Input Manager作為預制體資源創(chuàng)建到Project視圖下。建議使用此選項。(不要將這個預制體存儲到Rewired文件夾下的任何位置。如果你需要刪除并重裝Rewired,這將導致數(shù)據(jù)丟失。)
- Input Manger(in scene) - 將在當前場景中創(chuàng)建一個Input Manager。(不建議)
強烈建議你創(chuàng)建Input Manager預制體,然后使用Rewired Initializer去實例化。
編輯輸入
你可以通過Rewired Editor創(chuàng)建并編輯輸入。在Hierarchy窗口選中Input Manger,然后在Inspector窗口中點擊“Laun Rewired Editor”打開編輯器。你可以通過編輯器修改存儲在選中的Input Manager中的輸入配置數(shù)據(jù)。
數(shù)據(jù)如何存儲
不同于其他大多數(shù)輸入系統(tǒng),Rewired不將整個工程的輸入配置數(shù)據(jù)(maps,Actions等等)保存在一個單獨的位置。相反,這些數(shù)據(jù)都被存儲在Input Manager這個游戲?qū)ο笊稀_@意味著只要你想,你可以為每一個不同的場景創(chuàng)建完全不同的輸入設置,因為每一個Input Manager 對象是完全獨立的。這也意味著輸入設置不是全局可用的,尤其是編輯器腳本中,或者當Rewired還未初始化時。
運行時,當前的輸入配置數(shù)據(jù)是從當前場景中已激活的Input Manager中加載而來。你可以在編輯器中禁用一個Input Manager,然后激活另一個,以此來切換不同的輸入配置(確保只有一個Input Manager處于激活狀態(tài),或者其他所有Input Manager都被禁用)。可以將Input Manager制作成預制體,然后在每一個場景中都實例化它,以此來共享輸入配置。
OnDestroy
當激活的Input Manager被銷毀時,它將完全重置 Rewired,從而使Player、Controller等對象引用失效,控制器分配丟失等。腳本中對這些對象的所有引用都將失效。如果要銷毀Input Manager,你必須注意這一點,尤其是“Don't Destroy on Load”未勾選,并進行場景加載時。
注意:這也會影響編輯器中腳本的運行時重新編譯。當運行時腳本進行重新編譯,Rewired會重置。此時,Rewired 對象的緩存引用將失效,因此如果不考慮這一點,腳本可能會開始拋出空引用異常。如果運行時腳本重新編譯是你工作流程的一部分,請參閱此鏈接了解更多信息
Input Manager檢視窗口
| Don't Destroy On Load | 勾選后,加載場景是將不會銷毀Input Manager |
|---|---|
| Data Files | 對ControllerDataFiles對象的引用。該對象包含所有受支持操縱桿(joysticks)和模板的列表,是 Rewired 正常運行所必需的。如果你想要自定義自己的受支持的控制器,您可以將其鏈接到您已修改的 ControllerDataFiles 的單獨副本。 |
| Run in Editor Mode | 使Rewired可以在編輯器模式下運行 |
| Debug Information | 在運行時顯示Player、Controller、Controller Map等大量有用信息。可將系統(tǒng)中的大多數(shù)運行時對象可視化。 |
在游戲中使用Input Manager
當游戲最終打包時,初始場景中應該存在一個Input Manager(或者Rewired Initializer),并確保Don't Destroy On Load已勾選,使Rewired可以貫穿整個游戲周期。
測試單個場景
Rewired Initializer
建議你在每一個場景中都創(chuàng)建一個Rewired Initializer。Rewired Initializer會在Awake時根據(jù)需要生成Input Manager,但是當加載新場景是它不會生成多個Input Manager,以避免產(chǎn)生錯誤。這樣,您就可以在每個場景中使用相同的 Rewired 輸入管理器,并能在編輯器中單獨測試這些場景或在游戲過程中加載它們。
通過菜單創(chuàng)建Rewired Initializer:Window -> Rewired -> Create -> Initializer
創(chuàng)建Rewired Initializer后,你需要為其賦予一個Input Manager預制體。
替代方法
你可以創(chuàng)建一個Input Manager的預制體,然后在每一個場景中放置一個它的實例,并不勾選Don't Destroy On Load。當加載新場景時,已加載場景里的Input Manager將自動銷毀自己,原有的Input Manager不變并繼續(xù)處理輸入,而不會導致錯誤。
不建議使用該方法,因為它容易導致錯誤。每一個場景中的Input Manager都可以直接編輯,這可能導致不同場景中不同預制件實例的配置存在差異。這是尋求幫助中經(jīng)常遇到的情況。建議使用Rewired Initializer以避免任何潛在錯誤。
注意:如果你創(chuàng)建了一個Input Manager的預制體,請總是通過預制體打開Rewired Editor編輯器,而不是場景中的實例,否則這些修改將只會應用到實例。如果您不小心對場景中的實例進行了更改,您可以將更改應用到預制件中,這樣一切都會保持同步。
編輯器下運行
使 Rewired 在 Play 模式之外的編輯器中運行。當不在播放模式下時,它可用于在 Unity 編輯器中處理輸入,以實現(xiàn)各種目的。
按下 "Input Manager"Inspector中的 "Run in Edit Mode"按鈕可在編輯模式下啟動Rewired。請注意,該按鈕的作用是切換,因此如果將其啟用,則每次打開場景或退出播放模式時,Rewired都會立即開始在編輯模式下運行。
重要信息
- 在Play和Editor模式間切換時,Rewired將會重置,在不同模式間,對象的狀態(tài)不會保持。例如,您對任何 Rewired 對象所做的操縱桿(Joystick)分配或其他運行時更改都不會持久存在。
- 你能不在Rewired運行時編輯Input Manager的配置數(shù)據(jù)
- 并非所有編輯器平臺和輸入源都完全支持在 "編輯 "模式下運行。某些類型的輸入設備在某些編輯器平臺使用某些輸入源進行輸入時可能無法工作。
- 如果需要在Scene視圖有焦點時進行輸入,請啟用 "Allow Input in Editor Scene Views"選項。
- 在編輯模式下,Rewired 不會在標準的 Unity Update、FixedUpdate 和 OnGUI 循環(huán)中更新,因為在Play模式之外,Unity 不會每幀都執(zhí)行這些循環(huán)。因此,在“編輯”模式下,Rewired 只會在特殊的編輯器更新循環(huán)中運行。這有一些重要的副作用:
- 在處理輸入時,無法使用 Unity 的 Time 類。例如,如果您需要將一個值乘以 Time.deltaTime,它將始終返回 0。相反,您必須使用 ReInput.time.unscaledDeltaTime。
- 在編寫腳本時,建議使用輸入事件方法獲取輸入,而不是在 Update 中進行輪詢,因為 Unity 不會每幀都執(zhí)行 Update 循環(huán)。
- 在 "編輯 "模式下,Rewired 永遠不會在 "FixedUpdate"模式下運行。如果使用輸入事件,只能訂閱“Update”循環(huán)中的事件。
- 如果要輪詢輸入,請通過 EditorApplication.update 回調(diào)進行輪詢。
- Mouse.screenPosition 和相關屬性在編輯模式下不起作用。
- 要從編輯器腳本開始以編輯模式運行,請將 InputManager.runInEditMode 屬性設置為 true。
Players
Rewired是采用以Player為中心的輸入系統(tǒng)。這意味著,通常情況下所有輸入都由Player處理而不是控制器。您只需調(diào)用 player.GetAxis、player.GetButton 等,或使用 player.AddInputEventDelegate 注冊接收輸入事件,即可訪問所有輸入,而無需考慮輸入源。
例如,您可能需要響應來自鍵盤、鼠標、任意數(shù)量的操縱桿和任意數(shù)量的自定義控制器的輸入。只需將控制器和相應的映射分配給Player,然后直接從Player獲取輸入即可。從Player接收到的輸入是所有分配控制器接收到的輸入的組合。此外,游戲手柄(joysticks)可以(可選)在連接和斷開時智能地自動分配給玩家,因此您不必擔心每個玩家擁有哪些控制器。相反,您只需為你需要的特定Action獲取輸入,Rewired 就會處理剩下的工作。
將Player視為 "控制器容器 "可能會有所幫助。換句話說,Player可以包含任意數(shù)量的控制器和控制器映射。當你從Player獲取輸入時,實際上是從Player擁有的、啟用了 "Action"->"元素 "映射的任何控制器獲取輸入。【本文出現(xiàn)的所有“元素”通常是指控制器上的實體按鍵或搖桿】
創(chuàng)建/編輯Players
Player是由場景中的Input Manager在運行時創(chuàng)建的。您必須在Rewired Editor中定義 "Player",才能在運行時創(chuàng)建它們。
訪問Players
ReInput.players 屬性中的方法可通過 id 或名稱訪問Player,或獲取所有Player的列表。建議您在 Awake 中存儲Player的引用,并在游戲過程中保持該引用。
System Player
System player是用于處理保存、載入等系統(tǒng)操作的可選項。你可以為System player分配控制器和控制器映射,就像為其他Player分配控制器和控制器映射一樣。操縱桿不會自動分配給System player,但可以通過腳本手動分配。
獲取輸入
在Rewired中,你通常從Player而非控制器本身獲得輸入。
Player與控制器映射
控制器映射是控制器元素到Actions的關聯(lián)。由于 Rewired 是一個以Player為中心的輸入系統(tǒng),因此控制器映射并不存儲在控制器中,而是存儲在Player中。這樣做的好處是,您可以根據(jù)需要在多個 "Player "之間共享控制器,同時每個 "Player "都能保持自己獨立的 "Action "映射集。
Player 類包含許多用于獲取、添加和刪除所有類型控制器映射的方法(通過 Player.controllers.maps 對象訪問這些方法)。此外,賦值沖突檢查和保存/加載映射也是通過Player類處理的。
即使為Player分配了控制器,如果沒有分配映射,也無法進行輸入。您應在Rewired Editor中為每個Player定義操縱桿、鍵盤和鼠標的起始映射。您也可以通過Player類,在運行時加載和分配映射。
Player與控制器
Player本質(zhì)上是控制器和控制器映射的容器。Player中包含的控制器映射提供了一種將Actions與控制器元素(按鈕、鍵、軸等)關聯(lián)的方法。Player處理不同類型控制器的方式略有不同。
Rewired 目前有 4 種控制器類:
- Joystick(非鍵盤或鼠標)
- Keyboard
- Mouse
- Custom Controller
Joysticks
在Player返回操縱桿的輸入之前,必須先將該操縱桿分配給Player。該操縱桿必須添加到Player的操縱桿列表中,然后才能接收來自該設備的輸入。如果需要,一個操縱桿可以分配給多個Player并共享(這種情況很少見)。
默認情況下,Rewired 的操縱桿自動分配系統(tǒng)已在Input Manager中啟用。這將確保每個Player在連接到系統(tǒng)時都能根據(jù)“Rewired Editor - Setting ”頁面中的規(guī)則分配到一個操縱桿。如果您有自動分配系統(tǒng)選項無法滿足的特殊需求,可以禁用該系統(tǒng)。
要在Player中返回操縱桿的輸入,以下條件必須全部滿足:
- 操縱桿必須分配給Player。
- Player必須至少有一個啟用的操縱桿映射(Joystick Map)適用于該操縱桿。
- 操縱桿映射必須將至少一個操縱桿元素綁定到一個Action上。
請勿混淆:Player在Input Manager中“擁有操縱桿映射”這一事實與分配給該Player的操縱桿并不相同。“操縱桿映射”完全獨立于“操縱桿分配”,不會影響操縱桿自動分配系統(tǒng)為Player分配的操縱桿(如果有的話)。操縱桿分配包括向Player添加操縱桿類對象(Joystick)。一旦分配了操縱桿,Rewired 將在Player中加載該特定操縱桿的操縱桿映射(如果在 Rewired Editor中創(chuàng)建了一個或多個適用的操縱桿映射并將其分配給了Player的話),然后操縱桿映射將執(zhí)行Action到該操縱桿上的元素的映射。如果已將操縱桿分配給Player,但未找到匹配的操縱桿映射,則該操縱桿不會在該Player中提供任何輸入。
Keyboard
在Rewired中,鍵盤是一個共享控制器。與操縱桿類似,鍵盤也必須分配給Player,然后才能返回任何輸入。這可以在 "Input Manager - Player "頁面進行設置,也可以通過腳本使用 player.controllers.hasKeyboard 屬性進行設置。默認情況下,除非在Input Manager中禁用,否則鍵盤會在啟動時分配給所有Player。
與操縱桿一樣,只有當Player擁有至少一個將某些Actions與按鍵關聯(lián)起來的鍵盤映射(Keyboard Map)時,鍵盤才會在Player中返回輸入。
Mouse
與操縱桿類似,鼠標也必須分配給Player后才能返回任何輸入。這可以在 "Input Manager - Player "頁面中進行設置,也可以通過腳本使用 player.controllers.hasMouse 屬性進行設置。如果需要,鼠標可由多個Player共享。
與操縱桿和鍵盤一樣,只有當一個Player中至少有一個鼠標映射(Mouse Map)將某些Actions與鼠標按鈕和軸相關聯(lián)時,鼠標才會在該Player中返回輸入。
Custom Controller
自定義控制器在處理方式上與操縱桿非常相似,但它們與系統(tǒng)的連接永遠不會斷開,并且始終可用。同樣的規(guī)則也適用:自定義控制器必須分配給一個Player,并且有一個或多個有效的自定義控制器映射,才能返回任何輸入值。
Actions
一個Action可以代表任何類型的事件,這些事件都是輸入的結果。一般來說,Action是根據(jù)其在游戲中代表的動作來命名的,例如水平移動、跳躍、射擊、裝彈、更換武器、出拳等。Action也能代表系統(tǒng)操作,例如:菜單、保存、加載、取消、后退、前進等。你如何命名和使用Action完全取決于你的游戲需要。
獲取輸入
在Rewired中,Action通常是獲取輸入的方式。與從特定控制器上的特定按鈕獲取輸入(如果用戶切換控制器,按鈕可能會發(fā)生變化)不同,你可以通過Player類從Action獲取輸入。例如
private Rewired.Player player;
void Awake() {
player = Rewired.ReInput.players.GetPlayer(0); // get the player by id
}
void Update() {
player.GetButtonDown("Fire");
}
這樣,你就不必擔心玩家使用的控制器類型或數(shù)量,只需根據(jù) "Action "獲取輸入即可。
您也可以根據(jù)操作 ID 獲取輸入。Action ID 顯示在Rewired Editor的 "Action"下。你可以導出Action ID 常量列表,這樣就可以在編碼時使用IDE的自動補全功能查找Action ID,非常方便。按 id 查找Action比按名稱查找要快得多,因此推薦使用這種方法。
此外,您還可以選擇使用輸入事件,而不是如上例所示輪詢輸入。
按鍵與軸
Action 既不是按鈕,也不是軸。Action是一個虛擬元素,可以作為按鈕(布爾值)和軸(浮點值)進行查詢。所有Player的按鈕(Button)和坐標軸(Axis)方法都能正常工作,無論該Action的值由哪種類型或多少個底層元素構成。
查詢Action的按鈕值時,如果綁定到該Action的底層元素是物理軸或虛擬軸,則該Action的Input Behavior Button Dead Zone將用于確定按鈕狀態(tài)變化發(fā)生在哪個軸值上。此外,底層軸只有在軸值為正數(shù)時才會觸發(fā) Button 狀態(tài)改變。如果軸值為負數(shù),則按鈕狀態(tài)將忽略該值,而形成負按鈕狀態(tài)。
查詢Action的軸值時,如果綁定到Action的底層元素是物理或虛擬按鈕,則會使用Action的Input Behavior Digital Axis Settings來確定如何計算軸值。
創(chuàng)建、編輯Action
您必須在Rewired Editor中創(chuàng)建和編輯Action。
Action類別
通過使用 "Action Categories",可以將操作歸類到不同的列表中。
Action Categories僅用于在Rewired Editor中或在用戶界面(例如控件重映射界面)中顯示的動作列表中進行分類組織。它們對Player中的控件映射沒有任何影響,也不會以任何方式影響輸入。
Rewired的目的和職責
通常,Rewired的Action系統(tǒng)會被以一種非預期的方式用作單獨的游戲狀態(tài)管理系統(tǒng)的組成部分或替代物。這不是Rewired的設計初衷,也不是它的使用目的。
- Rewired 的唯一目的是讀取用戶輸入。
- Rewired 中的所有 "Action "實際上都是 "輸入操作",除了用于獲取有關用戶意圖的信息外,不得用于任何其他目的。它們不應與游戲狀態(tài)或操作相混淆或用作游戲狀態(tài)或操作。
- Action "跳躍 "并不表示 "玩家正在跳躍",而是表示 "用戶想要跳躍"。
- 游戲應實現(xiàn)權限和狀態(tài)管理系統(tǒng),對用戶輸入進行評估,然后改變狀態(tài)。在這之后,發(fā)生的事情就不屬于輸入系統(tǒng)的職責范圍了。
總結
以上是生活随笔為你收集整理的Unity3d_Rewired官方文档翻译:概念(一):InputManager、Players、Actions的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实时数据流无忧:用 SpringBoot
- 下一篇: 数据结构里的一棵树