- Unity 2021.3.6f1
- InputSystem 1.3.0
- InputSystemなにもわからない
やりたかったこと
- プレイヤー操作とUI操作を出来るようにしたい(この時キーの切り替えとかは全く考えてなかった)
- キーマウとゲームパッドの両方で動かせるようにしたい(どちらの入力もそのまま素直に処理する感じ)
Input Action Assetはこんなイメージ
![](https://pepophilia.com/wp-content/uploads/2024/06/スクリーンショット-2024-06-07-231229.png)
![](https://pepophilia.com/wp-content/uploads/2024/06/スクリーンショット-2024-06-07-231243.png)
やっちゃダメだったこと
複数のPlayerInputコンポーネントをとりあえず何個も作る対応
- なんか一部のキーが反応しないとかで詰んだ
例:
PlayerObject
- PlayerInput
- DefaultScheme: Any
- DefaultMap: Player
- PlayerScriptClass
- 方向キーとかジャンプキーによってキャラクターの動きの処理するクラス
UIObject
- PlayerInput
- DefaultScheme: Any
- DefaultMap: UI
- UIScriptClass
- オプションキーによってUI開いたり操作の処理するクラス
InteractiveObject
- PlayerInput
- DefaultScheme: Any
- DefaultMap: Player
- InteractiveScriptClass
- インタラクトキーによって対話の処理するクラス
対処方法
- PlayerInputコンポーネントを1つにして都度有効にするアクションマップを切り替えるようにした
例:
PlayerInputObject
- PlayerInput
- DefaultScheme: Any
- DefaultMap: Player
- PlayerInputHandlerClass
- 入力全般を処理するクラス
PlayerObject
- PlayerScriptClass
- PlayerInputHandlerClassのプレイヤー操作アクションを見て処理するクラス
UIObject
- UIScriptClass
- PlayerInputHandlerClassのUI操作アクションを見て処理するクラス
InteractObject
- InteractScriptClass
- PlayerInputHandlerClassの対話操作アクションを見て処理するクラス
public class PlayerInputHandlerClass : MonoBehaviour{
PlayerInput playerInput;
InputAction JumpAction;
InputAction SubmitAction;
InputAction InteractAction;
void Start(){
playerInput = GetComponent<PlayerInput>();
JumpAction = playerInput.actions["Jump"];
SubmitAction = playerInput.actions["Submit"];
InteractAction = playerInput.actions["Interact"];
}
// プレイヤー操作時とUI操作時でCurrentActionMapを切り替える
public void SwitchActionMap(string actionMapName){
layerInput.SwitchCurrentActionMap(actionMapName);
}
public bool GetJumpButtonDown(){
return JumpAction.triggered;
}
public bool GetSubmitButtonDown(){
return SubmitAction.triggered;
}
public bool GetInteractButtonDown(){
return InteractAction.triggered;
}
}
これでcurrentActionMapがPlayerのときはジャンプアクション、UIのときはSubmitアクションが反応するようになる。
ゲームパッドでジャンプは反応するけどSubmitが反応しない
ジャンプ(Button South)とSubmit(Submit [Any])のキーが競合しているから?
かは知らないけど、とりあえずSubmitに明示的にButton Southを割り当てたら反応するようになった。
![](https://pepophilia.com/wp-content/uploads/2024/06/スクリーンショット-2024-06-07-233544.png)
学んだこと
- キーが反応しないときのデバッグが大変なのでPlayerInputコンポーネントは1つにするかActionMapの数だけにしたほうが良いかも
- ActionMap間でキーが重複する場合はAnyキーを過信しないほうが良いかも
- 同じActionMap内でキーが重複するのも反応しない原因な気がするので避けたいかも(だからAction Mapを分けるべき、ということ?)
- 複数デバイス対応とか最初から想定して作れたらベストだけど、個人開発でそんなところまで手が回らないよね