Input Systemを使っているんだけど、ダブルタップなどでキャラクターをダッシュさせる方法はないの?
いくつかやり方はあるけど、Interactionを使えばこの辺がスマートに実装できるわ。
Input SystemのカスタムInteractionを用いてキャラクターのダッシュ操作を実現する方法の解説記事です。
実装方法は様々ですが、Input SystemのカスタムInteractionを使うと、次のような操作をInput System側で検知・通知できるようになります。
- WASDキーのダブルタップ(ダブルタップスプリント)
- スティックを素早く倒す
Input SystemのInteractionはこのような特定の入力パターンを検知した時に入力を通知する機能を有しているため、今回のケースに適したものと言えるでしょう。
ダブルタップ操作のInteractionには、Multi Tap Interactionというプリセットが用意されていますが、ダブルタップ直後にダッシュキャンセルされてしまう問題があったため、今回は自作のInteractionを実装して対応することとしました。
本記事では、自作のInteractionを実装して、ダブルタップやスティック早倒しによるダッシュ操作を実現する方法を解説していきます。
この作品はユニティちゃんライセンス条項の元に提供されています
- Unity 2022.1.7f1
- Input System 1.3.0
目次 非表示
前提条件
Input Systemがインストールされ、有効化されているものとします。
ここまでの手順が分からない方は、以下記事をご覧ください。
また、Input Actionでキャラクター操作のシーンがセットアップされているものとします。
本記事ではStarter Assets – Third Person Character Controllerというアセットのサンプルシーンのプレイヤーに対してダッシュ操作を適用していくものとします。
キャラクター操作が適用されているものであれば、Starter Assetsでなくても構いません。Starter Assetsのセットアップ方法については以下記事をご覧ください。
例ではプレイヤーモデルをユニティちゃんに差し替えていますが、デフォルトのままでも問題ありません。ユニティちゃんモデルへの差し替え方法は以下記事で解説しています。
Interactionの仕組み
特定の入力パターンを表現するものです。ActionやBinding単位で適用できます。
参考:Interactions | Input System | 1.3.0
例えば、Hold Interactionは長押しを表現するInteractionの一種です。Interactionが何も指定されない場合はDefault Interactionが暗黙的に適用されます。
Interactionが特定の入力パターンを検知すると、Performedコールバックが発火されます。
参照元では、Player Inputと組み合わせて次のようなコードでコールバックを拾えば良いです。
Player Inputの使い方が分からない方は以下記事をご覧ください。
また、コールバックのより詳細な挙動については、以下記事で解説しています。
ダブルタップスプリントの実装の流れ
本記事では、WASDキーのダブルタップ操作などを検知したときに「ダッシュボタンが押された」ような振る舞いをさせることを目標とします。
具体的には、ダッシュ操作を検知した時にPerformedコールバックを発火し、その後にボタンを離したらCanceledコールバックが発火するようなInteractionの実装を目指します。
本記事で紹介する実装の流れは以下のようになります。
- カスタムInteractionの実装
- カスタムComposite Bindingの実装
- 上記InteractionとComposite BindingをダッシュActionに適用
2つ目のカスタムComposite Bindingの実装ですが、これはスクリプト側からボタン入力として入力値を受け取りたい場合に必要になることがあります。
理由は、2軸のWASD入力がVector2型であるのに対し、ボタン入力はfloat型であり、両者の型不一致が生じるためです。
Starter Assetsのサンプルでは、ダッシュボタンの入力を次のようにisPressedプロパティから受け取っているので、カスタムComposite Bindingの実装が必要になります。
マルチタップ&ホールドを検知するInteractionの実装
次のような挙動をするカスタムInteractionを実装するものとします。
指定された回数だけ素早くタップし、押しっぱなしになった時にPerformedコールバックを通知します。
Performedコールバックの後に入力がなくなった場合、一定時間ウェイトを置いてからCanceledコールバックを通知することとします。これは、入力方向を切り替えた瞬間などにダッシュキャンセルにならなくするための処置です。
以下、Interactionの実装例です。
上記をMultiTapAndHoldInteraction.csという名前でUnityプロジェクトに保存すると、以下のようにInteractionが使用可能になります。
ダブルタップのみならず、任意回数のタップにも対応することとしました。
処理内容については、ソースコード中のコメントをご覧ください。
カスタムComposite Bindingの実装
WASDキー入力などをComposite BindingとしてActionに定義しているとき、入力値の型はVector2となります。
この場合、ボタン入力として受け取る場合はfloat型入力値となり、型不一致によるエラーとなります。この状態で入力値を取得しようとすると、次のようなエラーがログ出力されます。
本記事のようなWASDキー入力の大きさを1軸入力(float)として扱いたい場合、4方向入力の大きさをfloat型入力とするカスタムComposite Bindingを実装して適用すれば解決できます。
以下、カスタムComposite Bindingの実装例です。
上記スクリプトをDPadMagnitudeComposite.csという名前でUnityプロジェクトに保存すると、以下のようにカスタムComposite Bindingが選択可能になります。
Actionへの適用
該当するダッシュ操作のActionにInteractionとComposite Bindingを適用します。
例では、SprintというActionに対して適用するものとします。
まず、該当Actionの下に、先ほど実装したComposite Bindingを追加します。
そして、方向キーを設定します。例ではWASDキーを上下左右の入力として設定することにします。
追加したComposite Bindingに先のカスタムInteractionを適用して設定します。
もし、大本のAction TypeがValueになっていなかったらValueに設定しておきます。
最後にSave AssetボタンをクリックしてInput Actionのアセット内容を保存します。
以上で手順は完了です。
実行結果
ここまでの手順を成功させると、WASDキーのマルチタップ&ホールド操作でダッシュできるようになります。
スティック早倒しの実装例
2つ目のダッシュ操作の例として、ゲームパッドのスティックを素早く倒したときにダッシュさせる例を紹介します。
実装の流れはダブルタップスプリントと一緒ですが、実装するInteractionとComposite Bindingの内容が異なります。
スティック早倒しを検知するInteractionの実装
次のような仕様を満たすInteractionを実装するものとします。
入力値の大きさがStart Press PointからEnd Press Pointまで時間Max Delay以内に変化したときにPerformedコールバックを通知するものとします。
時間以内に変化しなかった場合や、入力がなくなった時(Release Point以下となった時)、Canceledコールバックを通知するものとします。
以下、Interactionの実装例です。
上記をQuickPressInteraction.csという名前で保存するとInteractionが使えるようになります。
入力値の大きさに変換するComposite Bindingの実装
スティック入力はVector2型の入力ですが、これをfloat型に変換するComposite Bindingを実装します。
上記をMagnitudeComposite.csという名前で保存しておきます。
Actionへの適用
先述のComposite BindingをActionに追加します。
追加したComposite Bindingにスティック入力などのControl Pathを設定します。
そして、Quick Press Interactionを先述のComposite Bindingに適用し、必要に応じてパラメータの設定を行います。
設定したら、忘れずにSave Assetボタンクリックで内容を保存してください。
実行結果
スティックを素早く倒すとダッシュし、ゆっくり倒すとダッシュしなくなります。
思い通りの操作にならない場合は、Quick Press Interactionのパラメータを調整すると良いです。
Interactionを適用する場合の注意点
複数のダッシュ操作を適用する際、ボタン操作とInteractionを共存させると、操作が競合して次のようなエラーが出る場合があるようです。
主にダブルタップなどのInteraction操作とボタン押下を同時に行った際にエラーとなります。理由は、InteractionのフェーズがPerformedのままになっているためです。
一般的に、Unity提供のプリセットでも同様の問題が起こるため、現状ではInteractionを使用する場合はAction TypeをPass Throughにしておくか、ボタン入力のBindingを消す(必要なら別Actionにしてしまう)などの対策が必要になるかもしれません。
さいごに
カスタムInteractionとComposite Bindingを実装してダッシュ操作を実現する方法を解説しました。
Input Systemのクラス仕様を理解したうえで実装しないといけない点が面倒かもしれませんが、一度実装すると使いまわせる点では良いかもしれません。
入力タイミングの検知という時系列が絡む複雑な処理をInteraction側に任せることにより、入力値を処理するロジックとキャラクター操作のロジックが綺麗に分かれるメリットがあります。
開発するコンテンツに合わせて検討すると良いでしょう。