質問するログイン新規登録

回答編集履歴

1

Input.GetAxis風の入力取得について追記

2021/07/12 11:26

投稿

Bongo
Bongo

スコア10818

answer CHANGED
@@ -11,4 +11,54 @@
11
11
 
12
12
  Debug.Log($"Position: {mousePosition} Delta:{mouseDelta}");
13
13
  }
14
- ```
14
+ ```
15
+
16
+ ##Input.GetAxis風の入力取得
17
+
18
+ 入力があった時に発生するイベントを受動的にハンドリングするのではなく、能動的に入力値をポーリングする方式をご希望なのだろうか...と思って手順を検討してみました。
19
+ まずシーン上の適当なオブジェクトに`PlayerInput`をアタッチし、それの「Create Actions...」ボタンでインプットアクションアセットを作成します。
20
+
21
+ ![図1](ba1b18822a1de50c0765243134396f73.png)
22
+
23
+ メインメニューの「Assets」→「Create」→「Input Actions」で作成した場合だと中身が空っぽのアセットができるようですが、あちらのボタンで作った場合はアセット内にあらかじめ下図のようなアクションが登録済みになるようでした。
24
+
25
+ ![図2](b00fedb6fc9d93affca90614b677ce97.png)
26
+
27
+ 図中にあるMoveアクションは矢印キーやWASDキー、左スティック入力を受け付けるよう設定されており、これが旧Input ManagerにおけるHorizontalやVerticalに相当する位置づけなんじゃないかと思います。
28
+ 今回は`PlayerInput`コンポーネントは使用しない方針で考えましたので、アセットを作成したら`PlayerInput`は削除してしまいます。
29
+ そして、下記のようなスクリプトでMoveアクションから水平・垂直入力を取得するようにしてみました。
30
+
31
+ ```lang-csharp
32
+ using UnityEngine;
33
+ using UnityEngine.InputSystem;
34
+
35
+ public class ActionHandler : MonoBehaviour
36
+ {
37
+ // インスペクター上で、ここに先ほど作成したインプットアクションアセットをセットしておく
38
+ [SerializeField] private InputActionAsset actions;
39
+ private InputAction moveAction;
40
+
41
+ private void OnEnable()
42
+ {
43
+ // Input Systemにおいては、入力を受け付けたいアクションは明示的に有効化してやる必要があるらしい
44
+ // そこでOnEnableのタイミングで有効化し、ついでにアセット内からMoveアクションを取得しておく
45
+ this.actions.Enable();
46
+ this.moveAction = this.actions.FindAction("Player/Move");
47
+ }
48
+
49
+ private void OnDisable()
50
+ {
51
+ // OnDisableのタイミングでアクションを無効化する
52
+ this.actions.Disable();
53
+ }
54
+
55
+ private void Update()
56
+ {
57
+ // Moveアクションから入力値を取得する
58
+ var moveInput = this.moveAction.ReadValue<Vector2>();
59
+ Debug.Log(moveInput);
60
+ }
61
+ }
62
+ ```
63
+
64
+ `GetAxis`ほどお手軽にはいきませんでしたが、下ごしらえさえしておけばゲーム実行中においては`GetAxis`に近い使用感で入力値を取得できるんじゃないでしょうか?