プレイヤーが攻撃するアニメーションの途中でダメージを発生させたい!
本記事の内容
・どういう時に、アニメーションの最中に処理を入れる必要があるのか
・Unityのアニメーションクリップのイベント機能
アニメーションの最中に処理を入れる場面
例1:攻撃モーション
攻撃モーションを細かく見てみると、攻撃モーションというのは以下の3つのフェーズに分解することが出来ます。
①攻撃前モーション(攻撃発生フレーム)→②攻撃発生・持続→③攻撃後の後隙(攻撃自体は発生していない)
スマブラの、ガノンドロフを例に見てみましょう。
剣を振り上げるまでが①攻撃前モーション。
実際に攻撃を振り下ろしている間(赤い丸が出ている瞬間)が、②攻撃発生・持続の時間
そして最後に、③攻撃後の後隙が振り下ろした後に動けない時間です。
よく「発生が遅い」とかいうのは、①(攻撃前モーション(攻撃発生フレーム)に掛かる時間が長い、ということを指しますね。
ゲーム内でアニメーションを作る時は、この①~③の一連の動きを作成しますが、攻撃が発生するのは、②(攻撃発生・持続の時間)のタイミングにしたいですよね。
そこで、アニメーション途中で、攻撃判定を発生させるという処理が必要になるのです。
また、攻撃時の途中でエフェクトを発生させる、などもアニメーション途中に処理が必要になりますね。
例2:回避モーション
モンスターハンターや、エルデンリングなど、回避が重要なアクションゲームにおいては、回避モーション中に無敵フレームが発生すると思います。
ただ、もちろん回避の無敵フレームが発生するのは、回避を始めて数フレーム後ですよね。そして回避モーションが完了するときには再び無敵状態が解除されているはずです。
実装しているゲームエンジンなどは違いますが、Unityでの実装の仕方としてはアニメーションの途中のフレームで「数フレームの間だけ無敵化するイベント(処理)」を挟んでいるのです。
これを実際にUnityを使った実装方法について解説します。
アニメーション最中にイベント(処理)を入れる方法
使用アセット
今回は解説のために、以下の無料アセットを使用します。
アセットの取り込み方についてはこちらの記事を参考にしてください。
アニメーションの作成
まず、キャラクターのアニメーションを作成します。作成方法はこちらの記事を参考にしてください。
攻撃アニメーションをこのように作成しました。
次に、この赤いエフェクトが出ている間だけ、「攻撃中」という文字を画面に表示してみます。
テキスト表示UIを作成
ヒエラルキーウィンドウの空いているところを選択し、テキストを追加しましょう。
わかりやすいところにテキストを配置します。私はプレイヤーの下に配置しました。
攻撃中にテキストを表示するスクリプトを作成
次にスクリプトを作成します。
考え方としては、攻撃中は攻撃フラグをONにして、攻撃が終わると攻撃フラグをOFFにします。そして、攻撃フラグがONのときだけ「攻撃中」というテキストを表示する、という寸法です。
ここから先はChatGPTを使用します。使い方はこちらを参考にしてください。
ChatGPTに以下のプロンプトを入れます。
ChatGPTへのプロンプト
あなたはUnityのエンジニアです。Unityで2Dゲームを制作しています。
キャラクターのスクリプトを作成してください。・プレイヤーにアタッチするスクリプトです ・攻撃モーション中のみ「攻撃中フラグ」をONに設定し、攻撃モーションが終わったら「攻撃中フラグ」をOFFにする ・「攻撃中フラグ」がONの状態だと、UIのテキストに「攻撃中」と表示、攻撃が終わると「攻撃していない」というテキストを表示する
ChatGPTの回答はランダム性があるので、必ずしも同じ回答になるとは限らないのですが、大体同じ回答になるはずです。私は以下の回答を得ました。
using UnityEngine; using UnityEngine.UI; // UIコンポーネントを使用するために必要
public class PlayerAttack : MonoBehaviour {
public Animator animator; // アニメーターの参照を設定する
public Text attackStatusText; // UIテキストの参照を設定する
private bool isAttacking = false; // 攻撃中フラグの状態 // 攻撃を開始するメソッド(アニメーションイベントや他のトリガーから呼び出す)
public void StartAttack() { isAttacking = true; // 攻撃中フラグをONにする UpdateAttackStatusText(); } // 攻撃が終了したことを示すメソッド(アニメーションイベントや他のトリガーから呼び出す)
public void EndAttack() { isAttacking = false; // 攻撃中フラグをOFFにする UpdateAttackStatusText(); } // UIテキストを更新するメソッド
private void UpdateAttackStatusText() {
if (isAttacking) { attackStatusText.text = "攻撃中"; // 攻撃中のテキストを表示 }
else { attackStatusText.text = "攻撃していない"; // 攻撃していない状態のテキストを表示 }
}
}
まず、作成してくれたスクリプト(プログラム)のクラス名を確認します。「public class PlayerAttack」の「PlayerAttack」の部分ですね。
そして、Unityのプロジェクトで右クリックを押し、C#スクリプト作成を選択して、クラス名と同じファイル名を設定します。
作成したスクリプトをダブルクリックで開き、ChatGPTが作成したスクリプトをまるっとコピペして貼り付け、保存(Ctrl+S)をします。
プレイヤーのコンポーネントの設定
次に、プレイヤーに先程作ったスクリプトをアタッチ(プロジェクトウィンドウからプレイヤーのコンポーネントにドラッグアンドドロップ)します。
そして、Text欄に先程作ったテキストをセットしましょう。
アニメーションクリップの設定
最後に、攻撃モーションの開始と終了時に、「攻撃中フラグ」を更新する処理を追加しましょう。
アニメーションウィンドウの攻撃を開始するフレームと終了するフレームを選択して、杭のボタン(イベント追加)を押します。
杭のボタンを押せたら、追加したイベント(杭のアイコン)を選択した状態でインスペクタウィンドウから、対応する処理を選択します。
実行してみる
これで準備は完了です。上部の再生ボタンから実行してみましょう。攻撃中と攻撃していない時でテキストが変わりましたね!
まとめ
アニメーションの途中で処理を入れたい場合は、これまで説明したイベントの追加を行うことで実現が出来ます。
たとえば、無敵の開始と終了をセットするとか、攻撃判定の開始・終了なども出来ます。
(武器で攻撃をする場合は、プレイヤーと武器を別オブジェクトにして、武器側に当たり判定をつける必要があります)
自分の作りたいゲームに合わせてカスタマイズしてみましょう!それでは素敵なゲーム制作ライフを!
コメント