この記事では、Unityの新しい入力システム「Input System」を活用して、ゼルダの伝説の回転斬りのような「溜め攻撃」アクションを実装する方法を解説します。
Input Systemには長押しを検知する「Hold Interaction」もありますが、今回はあえてそれを使わず、ボタン入力の基本的なイベントである「押した瞬間 (started)」と「離した瞬間 (canceled)」の時刻差を利用するアプローチを紹介します。
従来のUpdate関数内で 毎フレーム入力を監視する方法と比較して、Input Systemのイベント駆動型アプローチは、コードがシンプルになり、特に機能追加や変更に対する保守性が向上するメリットが期待できます。
この記事の内容
- 溜め攻撃の実装:Input System (Press) vs Update vs Hold Interaction
- Input SystemのインストールとInput Actionsアセットの作成
- Input Actions:左クリック(攻撃ボタン)アクションの定義
- スクリプト連携:PlayerInputとイベント処理スクリプト
- 溜め時間の計算ロジック:startedとcanceledの活用
- 中間演出の実装:コルーチンでInput Systemの弱点を補う
- まとめ:Pressイベント方式のメリット・デメリットと使い分け
Sponsored
溜め攻撃の実装:Input System (Press) vs Update vs Hold Interaction
溜め攻撃を実装する方法はいくつか考えられます。それぞれの特徴を見てみましょう。
- 従来の
Update関数による実装:Update()内で毎フレーム入力をチェックし、ボタンが押されている時間を計測します。- 仕組みは直感的ですが、入力の種類や条件分岐が増えるとコードが複雑化しがちです。
- Input System の
Hold Interactionを使う実装:- Input ActionsアセットでInteractionを「Hold」に設定し、指定時間(Hold Time)長押しされると
performedイベントが発生します。 - 設定は簡単ですが、後述するように「短押し(通常攻撃)」と「長押し(溜め攻撃)」を同じボタンで使い分けたい場合に、実装がやや複雑になることがあります。
- Input ActionsアセットでInteractionを「Hold」に設定し、指定時間(Hold Time)長押しされると
- Input System の
Pressイベント (started/canceled) を使う実装(本記事のアプローチ):- ボタンが押された瞬間(
started)と離された瞬間(canceled)のイベントを利用し、その間の時間を計測します。 - イベント駆動でコードが整理されやすく、短押し・長押しの判定や溜め中の処理を柔軟に実装できます。
- ボタンが押された瞬間(
Q. なぜHold InteractionではなくPressイベント (started/canceled) を使うのか?
Hold Interactionは指定時間長押しされたことを検知するのに便利ですが、「同じボタンで短押し(通常攻撃)と長押し(溜め攻撃)を使い分けたい」場合や、「溜めている最中に演出を入れたい」場合には、少し扱いにくい側面があります。
- 短押しと長押しの両立: Hold Interactionでは、長押しが成立して
performedが呼ばれる前に、短押し時の処理(通常攻撃など)をボタンを押した直後に実行させたい場合、工夫が必要です。例えば、「押した瞬間(started)に通常攻撃を出し、Holdが成立したらキャンセルする」といった制御や、別途短押し用のアクションを用意するなど、実装が複雑になりがちです。 - 押下開始タイミングの活用: ボタンを押した瞬間にキャラクターが構えモーションに入ったり、溜めエフェクトを開始したりといった処理を即座に行いたい場合、Hold Interactionだけではタイミングを計りにくいことがあります。
- 溜め中の制御: 溜めゲージを表示したり、一定時間ごとに溜めレベルが上がる演出を入れたりする場合、最終的に
performedイベントが発生するまで待つ必要があるHold Interactionでは、溜めている途中の細かな制御がしづらいです。
一方、本記事で紹介する**Pressイベント (started/canceled) を利用する方法**では、
- ボタンを押した瞬間の
startedイベントと、離した瞬間のcanceledイベントの時刻差を計測することで、押下時間を正確に把握できます。 - これにより、「一定時間未満なら通常攻撃、一定時間以上なら溜め攻撃」といった判定を
canceledイベント内で簡単に行えます。 startedイベント発生時に溜め動作やエフェクトを開始し、canceledイベントで攻撃を発動、という流れを自然に実装できます。- (後述するコルーチンなどを組み合わせれば)溜めている最中の演出や状態変化も柔軟に組み込めます。
このように、短押し/長押しの判定や、溜め中の演出・状態管理を柔軟に行いたい場合には、started/canceledイベントを利用するアプローチが適していると言えます。
Sponsored