前回は、Unity の AnimationController の「待機(デフォルト)」・「攻撃」 2 つのステート間に往復するための 2 番目の遷移を作成して、攻撃アニメーションの完了とほぼ同時に無条件に待機アニメーションに戻る設定をプログラムを使わずに紹介しました。
前回の記事:Unity 3Dキャラ待機モーションと攻撃モーションの切替2/4 | Compota-Soft-Press
![Unity AnimationController の遷移で無条件でアニメーションが完了したら移る設定を追加することでデフォルトステートに戻るようになりました2/3](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-AnimationController-の遷移で無条件でアニメーションが完了したら移る設定を追加することでデフォルトステートに戻るようになりました2-1024x473.png)
今回は、スペースキー押下時に AnimationController のパラメータを変更してステートを遷移させる自作プログラムを公開し、その主な機能を説明します。
※ Unity のバージョンは 2021.3.25f1 です。3D キャラクターは Unity の無料アセット「Adventure Character」を使用しています。アニメーションは「Mixamo」から入手したものを使用しています。
スクリプト(.cs) ファイルの作成とゲームオブジェクトへの適用
キー入力に応じて待機アニメーションから一時的に攻撃アニメーションに切り替える C# のプログラムを作成します。
C# スクリプトを作成する場合は、 Project ウィンドウのフォルダの余白で右クリックをして表示されるメニューから Create > C# Script を選択します。
名前は Attackable.cs に変更しました。
![Unity Project ウィンドウのフォルダの余白で右クリックして表示されるメニューから Create > C# Script を選択して、Attackable.cs を作成します.](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-Project-ウィンドウのフォルダの余白で右クリックして表示されるメニューから-Create->-C-Script-を選択して、Attackable.cs-を作成します.png)
Attackable.cs を 3D キャラクターのゲームオブジェクト(例では Man_Full)に付加します。
![Unity スクリプトを 3D キャラクターのゲームオブジェクトに付加します.](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-スクリプトを-3D-キャラクターのゲームオブジェクトに付加します.png)
プログラムの実装
3D キャラクターのゲームオブジェクトに付加したプログラムの中身は以下です。
各関数ごとに簡単な説明をします。
イベント関数は Unity のシステムから特定のタイミングで呼び出される関数です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attackable : MonoBehaviour
{
/// <summary>
/// 3D アニメーションを制御する Animator コンポーネントです。
/// </summary>
Animator animator;
private void Awake()
{
animator = GetComponent<Animator>();
if (animator == null)
{
Debug.LogError("animator == null");
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyUp(KeyCode.Space))
{
if (animator.GetBool("Attacking") == false)
{
animator.SetBool("Attacking", true);
}
}
}
/// <summary>
/// 攻撃アニメーションクリップ内の最後のフレームのアニメーションイベントで呼び出されます。
/// </summary>
public void OnAnimationEventAttackingFinished()
{
animator.SetBool("Attacking", false);
}
}
Awake イベント関数
ゲームオブジェクトが生成されたときに一度だけ呼び出されます。
例では、このプログラムを付加しているゲームオブジェクトが持っているはずの Animator コンポーネントを取得して、メンバ変数 animator に保持します。
animator を参照する際に毎回取得するよりも効率的です。
Update イベント関数
毎フレームごとに呼び出されます。フレームは FPS (Frames Per Second) で用いるものと同じです。
特定のキー入力(例ではスペースキーを押して離した状態)が起きたか場合、攻撃中でない= Attacking パラメータが false の場合は、 animator に追加した Attacking パラメータを true に変化させます。
前回の記事では、シーン再生時に Animator ウィンドウで Attacking パラメータのチェックボックスを操作して true に変え、待機ステータスから攻撃ステータスへ遷移しましたが、それをプログラムで行っています。
![Unity AnimationController のパラメータを変更することで他のステータス(アニメーション)に遷移しました.2/3](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-AnimationController-のパラメータを変更することで他のステータス(アニメーション)に遷移しました.2.png)
※画像内のステータスという言葉は正しくはステートです。
OnAnimationEventAttackingFinished 関数
これは筆者が独自に追加した関数です。
呼び出し元は、後述するアニメーションクリップに追加するアニメーションイベントです。
この関数が呼び出されると、 animator の Attacking パラメータが false に変化します。
しかし、まだ呼び出し元がありません。
この関数が呼び出されないと、一度攻撃を指示すると Attacking パラメータの値はずっと true の状態になるため、攻撃アニメーション後に待機アニメーションに戻ると、攻撃を指示していないにも関わらず、待機から攻撃アニメーションへの遷移を勝手に繰り返してしまいます。
![Unity AnimationController のパラメータをアニメーション完了後にリセットしない場合、何度も同じ遷移を繰り返してしまいます.1/2](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-AnimationController-のパラメータをアニメーション完了後にリセットしない場合、何度も同じ遷移を繰り返してしまいます.1-1024x508.png)
![Unity AnimationController のパラメータをアニメーション完了後にリセットしない場合、何度も同じ遷移を繰り返してしまいます.2/2](https://compota-soft.work/wp1/wp-content/uploads/2023/07/Unity-AnimationController-のパラメータをアニメーション完了後にリセットしない場合、何度も同じ遷移を繰り返してしまいます.2-1024x508.png)
今回はここまで
今回は、Unity の AnimationController のアニメーションパラメータをキー入力に応じて変更することで、待機から攻撃ステートへ遷移させ、3D キャラクターのアニメーションを切り替える自作プログラムを公開し、関数単位で処理内容を説明しました。
実際にキー入力で待機から攻撃ステートへ遷移することをテストしました。
パラメータが戻らないせいで攻撃アニメーションが繰り返されてしまう問題についても確認しました。
参照サイト Thank You !
記事一覧 → Compota-Soft-Press
コメント