Unity 3Dキャラ待機モーションと攻撃モーションの切替3/4

前回は、Unity の AnimationController の「待機(デフォルト)」・「攻撃」 2 つのステート間に往復するための 2 番目の遷移を作成して、攻撃アニメーションの完了とほぼ同時に無条件に待機アニメーションに戻る設定をプログラムを使わずに紹介しました。

前回の記事:Unity 3Dキャラ待機モーションと攻撃モーションの切替2/4 | Compota-Soft-Press

Unity AnimationController の遷移で無条件でアニメーションが完了したら移る設定を追加することでデフォルトステートに戻るようになりました2/3

今回は、スペースキー押下時に 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 を作成します.

Attackable.cs を 3D キャラクターのゲームオブジェクト(例では Man_Full)に付加します。

Unity スクリプトを 3D キャラクターのゲームオブジェクトに付加します.

プログラムの実装

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
Animator ウィンドウで行っていたパラメータの値の変更をプログラムで行います。

※画像内のステータスという言葉は正しくはステートです。

OnAnimationEventAttackingFinished 関数

これは筆者が独自に追加した関数です。
呼び出し元は、後述するアニメーションクリップに追加するアニメーションイベントです。

この関数が呼び出されると、 animator の Attacking パラメータが false に変化します。

しかし、まだ呼び出し元がありません

この関数が呼び出されないと、一度攻撃を指示すると Attacking パラメータの値はずっと true の状態になるため、攻撃アニメーション後に待機アニメーションに戻ると、攻撃を指示していないにも関わらず、待機から攻撃アニメーションへの遷移を勝手に繰り返してしまいます。

今回はここまで

今回は、Unity の AnimationController のアニメーションパラメータをキー入力に応じて変更することで、待機から攻撃ステートへ遷移させ、3D キャラクターのアニメーションを切り替える自作プログラムを公開し、関数単位で処理内容を説明しました。
実際にキー入力で待機から攻撃ステートへ遷移することをテストしました。
パラメータが戻らないせいで攻撃アニメーションが繰り返されてしまう問題についても確認しました。

参照サイト Thank You !

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました