【Unity】Project TCC で遊ぼう~UC-03-04 Damage and Dodge: キャラクターがダメージを受けたり、回避出来たりするようにします~

UC-03-04 Damage and Dodge Unity
UC-03-04 Damage and Dodge

Unity の Project TCC を触って、Unity の機能を学んでいきましょう。

Project TCC で遊ぼう~UC-03-04 Damage and Dodge: キャラクターがダメージを受けたり、回避出来たりするようにします~

UC-03-04 Damage and Dodge
UC-03-04 Damage and Dodge

UC-03-04 Damage and Dodge

変更点の確認

UC-03-04_Damage_and_Dodge シーンを開きます。
Unityエディター上で再生して、ユニティちゃんを動かしてみましょう。

UC-03-01_Dash シーンと違うところは、AnimatorController(UC-03-04_Damage_and_Dodge)の DashStart ステートに AnimatorModifierBehaviour が追加されています。DashStart ステートの間、AnimatorModifierBehaviour に Dodge キーを登録します。Dodge キーが登録されている時は Player オブジェクトはダメージを受けません。

State Machine
State Machine

シーンの複製

UC-03-01_Dash シーンを複製して、UC-03-04_Damage_and_Dodge_Copy という名前にします。

Level の複製

UC-03-04_Damage_and_Dodge_Copy シーンの Level オブジェクト(子オブジェクトも含む)を削除します。
UC-03-04_Damage_and_Dodge シーンの Level オブジェクトをコピー(Ctrl + C)して、UC-03-04_Damage_and_Dodge_Copy シーンに貼り付け(Ctrl + V)ます。

Player オブジェクトのタグの設定

Player オブジェクトの Tag を Player に設定します。

Tag の設定
Tag の設定

Animator の設定

Player オブジェクトの Animator コンポーネントの Controller に Assets/TCC/Scenes/03_Action/Data_UC-03-04_Damage_and_Dodge を設定します。

Animator の設定
Animator の設定

AnimatorMoveControl コンポーネントの追加

Player オブジェクトに AnimatorMoveControl コンポーネントを追加します。

AnimatorMoveControl の追加
AnimatorMoveControl の追加

AnimatorModifierCheck コンポーネントの追加

Player オブジェクトに AnimatorModifierCheck コンポーネントを追加します。

AnimatorModifierCheck の追加
AnimatorModifierCheck の追加

MySpikeAction_03_04 の作成

ヒエラルキービューの Level/Trap/SpikeAction オブジェクトの StateMachine コンポーネントを削除します。
MySpikeAction_03_04 スクリプトを新規作成して、SpikeAction オブジェクトに追加します。
SpikeAction オブジェクトの MySpikeAction_03_04 スクリプトの Player に Player オブジェクトを設定します。
SpikeAction_1~SpikeAction_9 オブジェクトも同様にします。

MySpikeAction_03_04 の追加
MySpikeAction_03_04 の追加

MySpikeAction_03_04 スクリプトの内容はこちらになります。

using Unity.TinyCharacterController.Check;
using Unity.VisualScripting;
using UnityEngine;

public class MySpikeAction_03_04 : MonoBehaviour {
    [SerializeField] private GameObject m_rPlayer;
    private Animator m_rAnimator;
    private AnimatorModifierCheck m_rAnimatorModifierCheckPlayer;
    private Animator m_rAnimatorPlayer;
    private bool m_bOnEnterState = false;

    private void Awake() {
        TryGetComponent<Animator>(out m_rAnimator);
        if (m_rPlayer != null) {
            m_rPlayer.TryGetComponent<AnimatorModifierCheck>(out m_rAnimatorModifierCheckPlayer);
            m_rPlayer.TryGetComponent<Animator>(out m_rAnimatorPlayer);
        }
    }

    private void OnTriggerEnter(Collider other) {
        if (other.gameObject.tag == "Player") {
            OnEnterState();
        }
    }

    private void OnTriggerExit(Collider other) {
        if (other.gameObject.tag == "Player") {
            OnExitState();
        }
    }

    private void OnEnterState() {
        if (m_bOnEnterState) {
            return;
        }
        m_bOnEnterState = true;

        if (m_rAnimator == null) {
            return;
        }
        m_rAnimator.SetTrigger("SpikeAction");
        if (m_rAnimatorModifierCheckPlayer == null) {
            return;
        }
        if (m_rAnimatorModifierCheckPlayer.HasKey("Dodge")) {
            return;
        }
        if (m_rAnimatorPlayer != null) {
            m_rAnimatorPlayer.Play("Damage");
        }
    }

    private void OnExitState() {
        if (!m_bOnEnterState) {
            return;
        }
        m_bOnEnterState = false;
    }
}

動作確認

Unityエディターで再生して、動作確認します。
SpikeAction オブジェクトの上を歩くとダメージを受けます。
SpikeAction オブジェクトの上をダッシュ(マウスのホイールボタン)で通過するときはダメージを受けません。

まとめ

Project TCC のキャラクターがダメージを受けるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
AnimatorModifierCheck コンポーネントでアニメーションの状態をチェックしながら、ダメージを受ける・受けない処理を切り替える方法を試しました。

コメント

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