LoginSignup
9
10

More than 1 year has passed since last update.

【UE5】Lyra に学ぶ Enhanced Input

Last updated at Posted at 2022-05-08

【UE5】Lyra に学ぶ Enhanced Input

UE5 の新しいサンプル Lyra Starter Game
その中で Enhanced Input プラグイン が、どのように利用されているかを読み解いていきます。
まず始めに Enhanced Input のみについての情報、続いて Lyra の基本的な情報、最後に Lyra での Enhanced Input の情報、という順番で記述していきます。

  • 解説しないこと
    • Game Feature/Gameplay Ability に関する詳細な部分
      • Game Feature は、レベル切り替え時に入力の設定の変更などを行っています。
      • Gameplay Ability は、キー入力からアクティブ化などを行っています。
      • ただ、詳細に触れようとするとドキュメントが膨大になるため、解説は割愛します。
    • ウィジェットに絡む部分
    • キャラクターのブループリント内の EnhancedInputEvents に関する部分
    • キーコンフィグ関連
  • バージョン

Index

Enhanced Input

  • 入力をより柔軟に扱う仕組みです。
  • これを利用すると、モジュール式に入力処理を付け外しすることもできます。

Enhanced Input の基本的な利用方法

  1. プラグインを有効にする
    • Enhanced Input プラグインを有効化し、エディターを再起動する。
  2. Default Classes の設定を変更する
    • Project Settings > Engine - Input > Default Classes > Default Player Input Class
      • EnhancedPlayerInput (もしくはその派生クラス)に変更する
    • Project Settings > Engine - Input > Default Classes > Default Input Component Class
      • EnhancedInputComponent (もしくはその派生クラス)に変更する
  3. UInputAction データアセットを用意する。
    • 例:移動用、ジャンプ用等
  4. UInputMappingContext データアセットを用意する。
    • 例:デフォルトのキーボードマウス用、シューターゲームのパッド用
  5. UInputMappingContext をローカルプレイヤーに追加する。
    • C++:
      • LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()->AddMappingContext(inputMappingContext,priority)
    • ブループリント:
      • GetLocalController->EnhancedInputLocalPlayerSubsystem->AddMappingContextUInputMappingContext を渡す
  6. UInputAction に関数をバインドする。
    • C++:
      • PlayerEnhancedInputComponent->BindAction(inputAction, ETriggerEvent::Started, this, &AMyPawn::MyInputHandlerFunction)
    • ブループリント:
      • 作成した UInputAction に対応したイベントノードが使用できるようになっているので、任意の処理につなげる
      • ただし、これを使うとハード参照が作られる。モジュール式に行うなら別の方法を取る必要がある。

Enhanced Input の参考リンク

Enhanced Input のコアクラス

クラス名 役割
UInputAction 入力を行った時に発生しうるアクションの種類を定義するデータアセット。
UInputMappingContext UInputAction に対して物理的な入力のマッピングをまとめて定義するためのデータアセット。
UInputTrigger UInputAction::Triggers で指定する、入力がなされたかを判定するためのクラス。
UInputModifier UInputAction::Modifiers で指定する、 Trigger に渡す前に入力値を加工するためのクラス。
UEnhancedInputComponent Enhanced Input 用の UInputComponent 派生クラス。
UEnhancedPlayerInput Enhanced Input 用の UPlayerInput 派生クラス。
UEnhancedInputLocalPlayerSubsystem ULocalPlayer が所持する Subsystem 。
  • 詳しくは Unreal Engine 5.0 Documentation > Enhanced Input プラグイン 参照。
  • UInputAction / UInputMappingContext / UInputTrigger / UInputModifier について
    • 入力に関する定義を行うデータアセット/クラス。
    • UInputActionUInputMappingContext は別々に登録します。
      • UInputAction
        • 入力アクションが発生した際に呼び出す関数を UEnhancedInputComponent::BindAction() 等でバインドします。
        • つまり、1つの入力アクションに対して、1つの関数をバインドする、ということであり、これにより入力アクションに対応する動作を実装することができます。
      • UInputMappingContext
        • 物理的な入力が発生した際に入力アクションが発生するように UEnhancedInputLocalPlayerSubsystem::AddMappingContext() 等で追加します。
      • つまり、物理的な入力に対して直接関数をバインドせず、入力アクションを経由して目的の動作に処理を流しているということです。
    • 別々というのはどういうことか?
      • UInputAction が登録済み、 UInputMappingContext が未登録の場合
        • 物理的な入力に UInputMappingContext が追加されていないため、 UInputAction が発生しない。
        • 結果、バインドされた関数が呼び出されない状態となる。
      • UInputAction が未登録、 UInputMappingContext が登録済みの場合
        • 物理的な入力に UInputMappingContext が追加されているため、 UInputAction が発生する。
        • だが、 UInputAction に対して何もバインドされていないため何も起きない状態となる。
  • UEnhancedInputComponent / UEnhancedPlayerInput / UEnhancedInputLocalPlayerSubsystem について
    • 入力制御を行うクラス。
    • 利用する場合は Project Settings の設定を変更する
      • Project Settings > Engine - Input > Default Classes > Default Player Input Class
        • UEnhancedPlayerInput 派生クラスにする。
        • PlayerController が所持する PlayerInput クラスはここで指定されたクラスになる。
      • Project Settings > Engine - Input > Default Classes > Default Input Component Class
        • UEnhancedInputComponent 派生クラスにする。
        • Actor が所持する InputComponent クラスはここで指定されたクラスになる。

Enhanced Input についての大まかな説明は以上です。

Lyra サンプル ゲーム

マーケットプレイス > Lyra Starter Game

UE5 の機能を使った、新しいサンプルプロジェクトです。
ドキュメント上では 「Lyra サンプル ゲーム」と称され、マーケットプレイス上では「Lyra Starter Game」と称されています。

Lyra の参考リンク

Lyra の前提知識

  • Lyra は UE5 のサンプルプロジェクトとして用意されているものですが、特徴的な点は モジュール式となるように設計 されているところです。
  • 入力制御に関してもモジュール式となるように実装されていて、 Game Feature を経由しているため、そちらの知識も必要となります。
    • Game Feature に関して、このドキュメントでは深くは触れません。
    • 「任意のタイミングで入力の設定をつけたり外したりしやすくするための仕組みを使用している」と念頭に置いておけば良いと思います。
  • エクスペリエンス
    • ユーザー体験。
    • Lyra では Elimination / Control / Exploader / FrontEnd などがそれに当たります。

Lyra についての大まかな説明は以上です。

Lyra における Enhanced Input

  • 前述のとおり、モジュール式となるように入力設定が定義されています。
  • どういうことかというと、 Game Feature を介して入力設定を行えるようにするために、多くのデータアセット型などが定義されています。
  • そのため、あちらこちらに設定が散らばっており、参照するデータアセットも多いです。
    • Class Viewer / Content Browser の Search / Reference Viewer 等を利用することで大まかな依存関係など把握できます。
    • 一部はアセットマネージャ経由で名前で処理している部分もあるので、ソースを確認する必要もあります。

Lyra における Enhanced Input の参考リンク

Lyra における Enhanced Input の設定

項目 補足
Project Settings > Engine - Input > Default Classes > Default Player Input Class UEnhancedPlayerInput Enhanced Input 用
Project Settings > Engine - Input > Default Classes > Default Input Component Class ULyraInputComponent Enhanced Input 用
Project Settings > Engine - General Settings > Default Classes > World Settings Class ULyraWorldSettings Game Feature の指定用

Lyra における UInputAction

Content Browser の SearchType=InputAction と記述すると一覧が確認できます。

  • 各アセットを Reference Viewer で確認すると、以下のようなアセットから参照されていることが確認できます。
    • UInputMappingContext
      • UInputAction に対して物理的な入力を指定しています。
    • ULyraInputConfig
      • UInputAction と対になる GameplayTag を設定し、 C++ でバインドの際に利用しています。詳しくは後述します。
    • UUserWidget 及びその派生クラス(例: ULyraJoystickWidget 等)
      • Widget の操作(ボタンを押す等)から発生させる UInputAction を指定するのに利用しています。
      • 解説は割愛します。
    • Character クラスの入力イベント(例: B_HeroShooter_Mannequin 等)
      • ブループリント内で EnhancedInputEvents を実装することで UInputAction へのバインドを行っています。
      • 解説は割愛します。

Lyra における UInputMappingContext

Content Browser の SearchType=InputMappingContext と記述すると一覧が確認できます。

  • 各アセットを Reference Viewer で確認すると、以下のようなアセットから参照されていることが確認できます。
    • UPlayerMappableInputConfig
      • プレイヤーに追加する UInputMappingContext を指定しています。詳しくは後述します。
    • ULyraExperienceActionSet
      • エクスペリエンスに紐づく入力マッピング追加のパラメータとして UInputMappingContext を指定しています。詳しくは後述します。
    • Gameplay Ability
      • GA_ADS 内で ADS 用の操作 IMC_ADS_Speed を一時的にマッピングするのに利用しています。
      • 解説は割愛します。

図にすると以下のような状況です。

また、それぞれ以下の UInputAction を参照しています。

UInputAction IMC_Default_
Gamepad

KBM
IMC_ShooterGame_
Gamepad

KBM
IMC_InventoryTest IMC_ADS_Speed
IA_Move
IA_Look_Stick
IA_Look_Mouse
IA_Jump
IA_Crouch
IA_Ability_Dash
IA_Weapon_Fire_Auto
IA_Weapon_Fire
IA_Weapon_Reload
IA_AutoRun
IA_QuickSlot1
IA_QuickSlot2
IA_QuickSlot3
IA_ADS
IA_Grenade
IA_Melee
IA_QuickSlot_CycleBackward
IA_QuickSlot_CycleForward
IA_ShowScoreboard
IA_Emote
IA_Interact
IA_ToggleInventory
IA_ToggleMap
IA_ToggleMarkerInWorld

Lyra における入力マッピング追加方法

入力マッピングの追加には UInputMappingContext が必要です。
前述のとおり、 UPlayerMappableInputConfig / ULyraExperienceActionSet などが保持しており、この2つがどのように利用されているかを解説します。

Lyra における入力マッピング追加方法: UPlayerMappableInputConfig 経由

Content Browser の SearchType=PlayerMappableInputConfig と記述すると一覧が確認できます。

  • 各アセットを Reference Viewer で確認すると、以下のようなアセットから参照されていることが確認できます。
    • B_SimpleHeroPawn ( ULyraCharacter 派生BP)
    • ShooterCore/TopDownArenaUGameFeatureData

図にすると以下のような状況です。

それぞれについて、どのように利用されるかを解説します。

Lyra における入力マッピング追加方法: UPlayerMappableInputConfig 経由: B_SimpleHeroPawn の場合

  • 設定されている UPlayerMappableInputConfig
    • B_SimpleHeroPawn を開き、コンポーネント LyraHeroDetails を見ると Lyra Hero Component > Default Input Configs で以下が指定されていることを確認できます。
      • PMI_Default_Gamepad
      • PMI_Default_KBM
  • 設定されている UPlayerMappableInputConfig の利用のされ方について
    • ULyraHeroComponent::InitializePlayerInput() にて参照され、(キーコンフィグ関連を経由し)入力マッピングの追加が行われます。
      • キーコンフィグ関連についての解説は割愛します。
  • B_SimpleHeroPawn の参照のされ方について
    • B_SimpleHeroPawnB_LyraDefaultExperienceULyraExperienceDefinition ) から参照されています。
      • B_LyraDefaultExperienceALyraGameMode::HandleMatchAssignmentIfNotExpectingOne() から参照されます。
      • 該当のコードは各レベルの World Settings > Game Mode > Default Gameplay Experience が指定されていない場合に利用されます。
      • レベルを開いて確認すると、上記が指定されていないものは具体的には以下となります。
        • L_DefaultEditorOverview
        • L_ShooterFrontendBackground
          • フロントエンド画面の背景のアニメーションシーケンスで利用されています。
          • こちらの解説は割愛します。
  • 処理の流れのまとめ
    1. レベル L_DefaultEditorOverview の初期化を行う。
    2. エクスペリエンス B_LyraDefaultExperience を適用する。
    3. プレイヤー用のポーンとして B_SimpleHeroPawn が使用される。
    4. ポーンの初期化の際、 PMI_Default_Gamepad / PMI_Default_KBM が適用される。
    5. その結果、上記で指定されている IMC_Default_Gamepad / IMC_Default_KBMUInputMappingContext )が追加される。

Lyra における入力マッピング追加方法: UPlayerMappableInputConfig 経由: ShooterCore の場合

  • 設定されている UPlayerMappableInputConfig
    • ShooterCore を開き、 Actions > Actions > Index[3] を見ると Add Input Config が指定され、 Input Configs で以下が指定されていることを確認できます。
      • PMI_Default_KBM
      • PMI_Default_Gamepad
      • PMI_ShooterDefaultConfig_KBM
      • PMI_ShooterDefaultConfig_Gamepad
  • 設定されている UPlayerMappableInputConfig の利用のされ方について
    • UGameFeatureAction_AddInputConfig にて参照され、(キーコンフィグ関連を経由し)入力マッピングの追加が行われます。
      • キーコンフィグ関連についての解説は割愛します。
  • ShooterCoreUGameFeatureData ) の参照のされ方について
    • Reference Viewer からでは追うことができません。
    • 以下のどちらかで Game Feature の名前を指定します。
      • ULyraExperienceDefinition::GameFeaturesToEnable
      • ULyraExperienceActionSet::GameFeaturesToEnable
    • そうすることで、 ULyraExperienceManagerComponent::OnExperienceLoadComplete() で参照され、 Game Feature のロードとアクティブ化が実行されます。
    • 指定されている場所
      • 以下の 3 つの ULyraExperienceDefinition
        • B_LyraShooterGame_ControlPoints
        • B_ShooterGame_Elimination
        • B_TestInventoryExperience
      • 以下の 4 つの ULyraExperienceActionSet
        • LAS_ShooterGame_SharedInput
        • LAS_ShooterGame_StandardComponents
        • LAS_ShooterGame_StandardHUD
        • LAS_InventoryTest
      • ULyraExperienceActionSetULyraExperienceDefinition から参照されますが、上記 4 つの ULyraExperienceActionSet は上記 3 つの ULyraExperienceDefinition からのみ参照されています。
        • (注:現状で確認できる範囲では。)
      • つまり、上記 3 つの ULyraExperienceDefinition をアクティブ化する際に ShooterCore のロードとアクティブ化が実行されます。
    • ULyraExperienceDefinition が指定されているレベル
      • B_LyraShooterGame_ControlPoints
        • L_Convolution_Blockout
      • B_ShooterGame_Elimination
        • L_ShooterGym
        • L_Expanse
        • L_Expanse_Blockout
        • L_FiringRange_WP
      • B_TestInventoryExperience
        • L_InventoryTestMap
      • つまりこれら 6 つのレベルをロードする際に ShooterCore のロードとアクティブ化が実行されます。
  • 処理の流れのまとめ
    1. 以下いずれかのレベルの初期化を行う。
      • L_Convolution_Blockout
      • L_ShooterGym
      • L_Expanse
      • L_Expanse_Blockout
      • L_FiringRange_WP
      • L_InventoryTestMap
    2. レベルで指定された以下いずれかのエクスペリエンスを適用する。
      • B_LyraShooterGame_ControlPoints
      • B_ShooterGame_Elimination
      • B_TestInventoryExperience
    3. エクスペリエンスで指定された Game Feature ShooterCore のロードとアクティブ化が実行される。
    4. Game Feature ShooterCore で指定された以下の UPlayerMappableInputConfig が適用される
      • PMI_Default_KBM
      • PMI_Default_Gamepad
      • PMI_ShooterDefaultConfig_KBM
      • PMI_ShooterDefaultConfig_Gamepad
    5. その結果、上記の UPlayerMappableInputConfig で指定された以下の UInputMappingContext が追加される。
      • IMC_Default_KBM
      • IMC_Default_Gamepad
      • IMC_ShooterGame_KBM
      • IMC_ShooterGame_Gamepad

Lyra における入力マッピング追加方法: UPlayerMappableInputConfig 経由: TopDownArena の場合

流れは ShooterCore とほぼ同じで、参照しているアセットが異なります。

  • 設定されている UPlayerMappableInputConfig
    • TopDownArena を開き、 Actions > Actions > Index[1] を見ると Add Input Config が指定され、 Input Configs で以下が指定されていることを確認できます。
      • PMI_Default_KBM
      • PMI_Default_Gamepad
  • TopDownArena ( UGameFeatureData ) の参照のされ方について
    • 指定されている場所
      • B_TopDownArenaExperienceULyraExperienceDefinition )のみ。
      • つまり、B_TopDownArenaExperienceULyraExperienceDefinition) をアクティブ化する際に TopDownArena のロードとアクティブ化が実行されます。
    • B_TopDownArenaExperienceULyraExperienceDefinition ) が指定されているレベル
      • L_TopDownArenaGym のみ。
      • つまり L_TopDownArenaGym レベルをロードする際に TopDownArena のロードとアクティブ化が実行されます。
  • 処理の流れのまとめ
    1. 以下のレベルの初期化を行う。
      • L_TopDownArenaGym
    2. レベルで指定された以下のエクスペリエンスを適用する。
      • B_TopDownArenaExperience
    3. エクスペリエンスで指定された Game Feature TopDownArena のロードとアクティブ化が実行される。
    4. Game Feature TopDownArena で指定された以下の UPlayerMappableInputConfig が適用される
      • PMI_Default_KBM
      • PMI_Default_Gamepad
    5. その結果、上記の UPlayerMappableInputConfig で指定された以下の UInputMappingContext が追加される。
      • IMC_Default_KBM
      • IMC_Default_Gamepad

Lyra における入力マッピング追加方法: ULyraExperienceActionSet 経由

Content Browser の SearchLyraExperienceActionSet と記述すると一覧が確認できます。

各アセットを開いて確認すると、Actions To Perform > Actions にて Add Input Mapping を指定しているものがあります。
LAS_InventoryTest / LAS_ShooterGame_SharedInput の 2 つです。
これらが有効化されるタイミングは Lyra における入力マッピング追加方法: UPlayerMappableInputConfig 経由: ShooterCore の場合 で記述したとおりです。

Lyra における入力マッピング追加方法: ULyraExperienceActionSet 経由: LAS_InventoryTest の場合

  • 処理の流れのまとめ
    1. 以下のレベルの初期化を行う。
      • L_InventoryTestMap
    2. レベルで指定された以下のエクスペリエンスを適用する。
      • B_TestInventoryExperience
    3. エクスペリエンスで指定された LAS_InventoryTestULyraExperienceActionSet ) のロードとアクティブ化が実行される。
    4. LAS_InventoryTestULyraExperienceActionSet ) で指定された以下の UInputMappingContext が追加される。
      • IMC_InventoryTest

Lyra における入力マッピング追加方法: ULyraExperienceActionSet 経由: LAS_ShooterGame_SharedInput の場合

  • 処理の流れのまとめ
    1. 以下いずれかのレベルの初期化を行う。
      • L_Convolution_Blockout
      • L_ShooterGym
      • L_Expanse
      • L_Expanse_Blockout
      • L_FiringRange_WP
      • L_InventoryTestMap
    2. レベルで指定された以下いずれかのエクスペリエンスを適用する。
      • B_LyraShooterGame_ControlPoints
      • B_ShooterGame_Elimination
      • B_TestInventoryExperience
    3. エクスペリエンスで指定された LAS_ShooterGame_SharedInputULyraExperienceActionSet) のロードとアクティブ化が実行される。
    4. LAS_ShooterGame_SharedInputULyraExperienceActionSet ) で指定された以下の UInputMappingContext が追加される。
      • IMC_ShooterGame_KBM

note:
つまり、たとえば IMC_ShooterGame_KBM は以下の 2 箇所から追加されていることになります。

  • ShooterCore
  • LAS_ShooterGame_SharedInput

その際に指定しているプライオリティも異なります。(それぞれ 0 と 1 を指定しています。)
これが何を意味し、どのような挙動となるかまでは追いかけていません。

入力マッピングの追加方法については以上となります。

Lyra における入力アクションのバインド方法

  • ここでは C++ で行っているバインドについて述べます。
    • B_HeroShooter_Mannequin 等の EnhancedInputEvents についての解説は割愛します。
  • C++ でバインドを行う場合、以下の関数を使用します。
    • UEnhancedInputComponent::BindAction()
  • 上記の関数は以下の関数から呼び出していることが確認できます。
    • ULyraInputComponent::BindNativeAction()
    • ULyraInputComponent::BindAbilityActions()
  • 上記の関数は以下の関数から呼び出していることが確認できます。
    • ULyraHeroComponent::InitializePlayerInput()
      • ポーンの初期化の際に呼び出される関数です。
      • 関数の実装を更に読み解いていくと以下のことがわかります。
        • バインドに使用している UInputAction は以下で指定している。
          • FLyraInputAction:::InputAction
        • FLyraInputAction は以下のいずれかで指定している。
          • ULyraInputConfig::NativeInputActions
          • ULyraInputConfig::AbilityInputActions
        • ULyraInputConfig は以下で指定している。
          • ULyraPawnData::InputConfig
        • ULyraPawnData は以下で指定している。
          • ULyraExperienceDefinition::DefaultPawnData
        • ULyraExperienceDefinition は以下で指定している。
          • World Settings > Game Mode > Default Gameplay Experience
      • つまり、レベルの初期化時にレベル毎の設定に従ってバインド処理がなされる、ということです。
    • ULyraHeroComponent::AddAdditionalInputConfig()
      • Game Feature によるバインドの追加の際に呼び出される関数です。
      • 関数の実装を更に読み解いていくと以下のことがわかります。
        • バインドに使用している UInputAction は以下で指定している。
          • FLyraInputAction:::InputAction
        • FLyraInputAction は以下で指定している。
          • UGameFeatureAction_AddInputBinding:::InputConfigs
        • UGameFeatureAction_AddInputBinding は以下で指定している。
          • ULyraExperienceActionSet::Actions
        • ULyraExperienceActionSet は以下で指定している。
          • ULyraExperienceDefinition::ActionSets
        • ULyraExperienceDefinition は以下で指定している。
          • World Settings > Game Mode > Default Gameplay Experience
      • こちらのケースも前述のものと同じように、レベルの初期化が起点となっています。

Reference ViewerUInputAction の依存関係を追うと以下のようになります。

Reference ViewerULyraPawnData 経由の UInputAction の依存関係を追うと以下のようになります。

Reference ViewerULyraExperienceActionSet 経由の UInputAction の依存関係を追うと以下のようになります。

これらの依存関係を見ていくと、どのレベルでどの入力アクションがバインドされているのかがわかります。

  • 例:TopDownArena をプレイしようとする場合
    • レベル L_TopDownArenaGym の初期化を行う。
      • ポーンの情報として InputData_Arena が使用される。
        • NativeAction として IA_Move が使用される。
        • AbilityAction として IA_Weapon_Fire が使用される。
  • 例:ControlPoints をプレイしようとする場合
    • レベル L_Convolution_Blockout の初期化を行う。
      • ポーンの情報として InputData_Hero が使用される。
        • NativeAction として IA_Move/IA_Look_Mouse/IA_Look_Stick/IA_Crouch/IA_AutoRun が使用される。
        • AbilityAction として IA_Jump/IA_Weapon_Fire/IA_Weapon_Fire_Auto/IA_Weapon_Reload/IA_Ability_Heal/IA_Ability_Death が使用される。
      • アクションセット経由で InputData_ShooterGame_AddOns が使用される。
        • AbilityAction として IA_Melee/IA_ADS/IA_Grenade/IA_ShowScoreboard/IA_DropWeapon/IA_Emote が使用される。

note:
これを見ると TopDownArena では IA_Ability_Death が使用されていないことがわかり、 ControlPoints などとは異なる死亡処理が行われていることが想像できます。
(実際の死亡処理はまだ確認していませんので実際の処理は不明です。)

Lyra における入力アクションのバインド方法:ネイティブにバインドされる関数

  • コードでいうと ULyraHeroComponent::InitializePlayerInput() の以下の部分です。
     LyraIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Move, ETriggerEvent::Triggered, this, &ThisClass::Input_Move, /*bLogIfNotFound=*/ false);
     LyraIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Look_Mouse, ETriggerEvent::Triggered, this, &ThisClass::Input_LookMouse, /*bLogIfNotFound=*/ false);
     LyraIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Look_Stick, ETriggerEvent::Triggered, this, &ThisClass::Input_LookStick, /*bLogIfNotFound=*/ false);
     LyraIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Crouch, ETriggerEvent::Triggered, this, &ThisClass::Input_Crouch, /*bLogIfNotFound=*/ false);
     LyraIC->BindNativeAction(InputConfig, GameplayTags.InputTag_AutoRun, ETriggerEvent::Triggered, this, &ThisClass::Input_AutoRun, /*bLogIfNotFound=*/ false);
    
  • BindNativeAction() では InputConfig->NativeInputActionsFLyraInputAction ) から第二引数と同じ InputTag を探します。
    • あった場合はペアとなる入力アクションに第五引数で渡された関数をバインドします。
    • ない場合はバインドしません。
  • つまり、固定の処理を行う関数に直接バインドされています。
  • 具体的に行う内容はは各関数をご参照ください。

前述の UInputAction の依存関係の例でいうと以下のようになります。

  • 例:TopDownArena をプレイしようとする場合
    • ポーンの情報として InputData_Arena が使用される。
      • InputData_ArenaNativeInputActions を確認すると以下の項目のペアが設定されている。
        • IA_MoveInputTag.Move
      • よって、入力アクション IA_MoveULyraHeroComponent::Input_Move() がバインドされる。
      • それ以外は InputData_Arena に指定されていないのでバインドされない。
  • 例:ControlPoints をプレイしようとする場合
    • ポーンの情報として InputData_Hero が使用される。
      • InputData_ArenaNativeInputActions を確認すると以下の項目のペアが設定されている。
        • IA_MoveInputTag.Move
        • IA_Look_MouseInputTag.Look.Mouse
        • IA_Look_StickInputTag.Look.Stick
        • IA_CrouchInputTag.Crouch
        • IA_AutoRunInputTag.AutoRun
      • よって、前述のすべての関数がバインドされる。

Lyra における入力アクションのバインド方法:アビリティにバインドされる関数

  • コードでいうと ULyraHeroComponent::InitializePlayerInput() / ULyraHeroComponent::AddAdditionalInputConfig() の以下の部分です。
     LyraIC->BindAbilityActions(InputConfig, this, &ThisClass::Input_AbilityInputTagPressed, &ThisClass::Input_AbilityInputTagReleased, /*out*/ BindHandles);
    
  • BindAbilityActions() では InputConfig->AbilityInputActionsFLyraInputAction ) の全ての要素に対して以下を行います。
    • 入力アクションに、入力開始/終了時の処理として第三/第四引数で渡された関数を、ペアとなる InputTag を含めてバインドします。
  • つまり、アビリティに関しては全て同じ関数にバインドされます。
  • 上記の関数ではバインドされた引数 InputTag を元にアビリティを特定し、アクティブ化などを行います。
  • アビリティについて
    • ここで言うアビリティとは、要は Gameplay Ability です。
    • Gameplay Ability についての解説はこのドキュメントでは割愛します。
    • (付与方法、 InputTag から Gameplay Ability の特定方法等々の解説が必要となり、さらにドキュメントが長くなってしまう為。)

前述の UInputAction の依存関係の例でいうと以下のようになります。

  • 例:TopDownArena をプレイしようとする場合
    • ポーンの情報として InputData_Arena が使用される。
      • InputData_ArenaAbilityInputActions を確認すると以下の 1 つのペアが設定されている。
        • IA_Weapon_FireInputTag.Weapon.Fire
    • よって、前述の関数が上記の 1 つのペアでバインドされる。
  • 例:ControlPoints をプレイしようとする場合
    • ポーンの情報として InputData_Hero が使用される。
      • InputData_HeroAbilityInputActions を確認すると以下の 6 つのペアが設定されている。
        • IA_JumpInputTag.Jump
        • IA_Weapon_FireInputTag.Weapon.Fire
        • IA_Weapon_Fire_AutoInputTag.Weapon.FireAuto
        • IA_Weapon_ReloadInputTag.Weapon.Reload
        • IA_Ability_HealInputTag.Ability.Heal
        • IA_Ability_DeathInputTag.Ability.Death
    • アクションセット経由で InputData_ShooterGame_AddOns が使用される。
      • InputData_ShooterGame_AddOnsAbilityInputActions を確認すると以下の 6 つのペアが設定されている。
        • IA_ShowScoreboardInputTag.Ability.ShowLeaderboard
        • IA_ADSInputTag.Weapon.ADS
        • IA_GrenadeInputTag.Weapon.Grenade
        • IA_EmoteInputTag.Ability.Emote
        • IA_DropWeaponInputTag.Ability.Quickslot.Drop
        • IA_MeleeInputTag.Ability.Melee
    • よって、前述の関数が上記の 12 つのペアでバインドされる。

入力アクションのバインド方法については以上となります。

終わりに

ここまでで、 Lyra で Enhanced Input がどのように利用されているかや、各アセットの大まかな繋がりが解説できたと思います。
情報の粒度がまちまちで、分かり難い箇所も多いとは思いますが、どなたかの参考になれば幸いです。


おしまい。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10