【Unity】Project TCC で遊ぼう~UC-03-05 Down and Wakeup: キャラクターがダウン状態になったり、そこから復帰できるようにします~

UC-03-05 Down and Wakeup Unity
UC-03-05 Down and Wakeup

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

Project TCC で遊ぼう~UC-03-05 Down and Wakeup: キャラクターがダウン状態になったり、そこから復帰できるようにします~

UC-03-05 Down and Wakeup
UC-03-05 Down and Wakeup

UC-03-05 Down and Wakeup

変更点の確認

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

UC-03-04_Damage_and_Dodge シーンと違うところは、Player オブジェクトに Down の State Machine が追加されています。AnimatorController の IsDown パラメータが true になると Down ステートに移行します。

State Machine
State Machine

シーンの複製

UC-03-04_Damage_and_Dodge シーンを複製して、UC-03-05_Down_and_Wakeup_Copy という名前にします。

Level の複製

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

PlayerInput の設定

Player オブジェクトの PlayerInput コンポーネントの Actions に Assets/TCC/Scenes/03_Action/Data_UC-03-05_Down_and_Wakeup/UC-03-05_Down_and_Wakeup を設定します。

PlayerInput の設定
PlayerInput の設定

Animator の設定

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

Animator の設定
Animator の設定

MyExplosion_03_05 の作成

ヒエラルキービューの Level/Trap/Explosion オブジェクトの StateMachine コンポーネントを削除します。
MyExplosion_03_05 スクリプトを新規作成して、Explosion オブジェクトに追加します。
Explosion オブジェクトの MyExplosion_03_05 スクリプトの Particles に Explosion/Particle System オブジェクトと Explosion/Particle System_Smoke オブジェクトを設定します。
Explosion オブジェクトの MyExplosion_03_05 スクリプトの Player に Player オブジェクトを設定します。
Explosion_1~Explosion_3 オブジェクトも同様にします。

Explosion の設定
Explosion の設定

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

using NUnit.Framework;
using System.Collections.Generic;
using Unity.TinyCharacterController.Check;
using UnityEngine;

public class MyExplosion_03_05 : MonoBehaviour {
    [SerializeField] private List<ParticleSystem> m_arParticles;
    [SerializeField] private GameObject m_rPlayer;
    private AnimatorModifierCheck m_rAnimatorModifierCheckPlayer;
    private Animator m_rAnimatorPlayer;

    private void Awake() {
        m_rPlayer.TryGetComponent<AnimatorModifierCheck>(out m_rAnimatorModifierCheckPlayer);
        m_rPlayer.TryGetComponent<Animator>(out m_rAnimatorPlayer);
    }

    private void OnTriggerEnter(Collider other) {
        if (other.gameObject.tag == "Player") {
            int nCount = 200;
            foreach (ParticleSystem rParticle in m_arParticles) {
                rParticle.Emit(nCount);
            }
            if (m_rAnimatorModifierCheckPlayer != null) {
                if (m_rAnimatorModifierCheckPlayer.HasKey("Muteki") || m_rAnimatorModifierCheckPlayer.HasKey("Dodge")) {
                }
                else {
                    if (m_rAnimatorPlayer != null) {
                        m_rAnimatorPlayer.SetBool("IsDown", true);
                    }
                }
            }
        }
    }
}

MyPlayer_03_05 の作成

MyPlayer_03_05 スクリプトを新規作成して、Player オブジェクトに追加します。
MyPlayer_03_05 スクリプトの内容はこちらになります。

using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Control;
using UnityEngine;
using UnityEngine.InputSystem;

public class MyPlayer_03_05 : MonoBehaviour {
    private PlayerInput m_rPlayerInput;
    private InputAction m_rWakeup;
    private Animator m_rAnimator;
    private MoveControl m_rMoveControl;
    private AnimatorModifierCheck m_rAnimatorModifierCheck;
    private bool m_bIsDown;

    private void Awake() {
        TryGetComponent<PlayerInput>(out m_rPlayerInput);
        if (m_rPlayerInput != null) {
            m_rWakeup = m_rPlayerInput.actions["Wakeup"];
        }
        TryGetComponent<Animator>(out m_rAnimator);
        TryGetComponent<MoveControl>(out m_rMoveControl);
        TryGetComponent<AnimatorModifierCheck>(out m_rAnimatorModifierCheck);
    }

    private void Start() {
        OnExitStateDown();
    }

    private void OnEnable() {
        if (m_rWakeup != null) {
            m_rWakeup.started += OnWakeup;
        }
    }

    private void OnDisable() {
        if (m_rWakeup != null) {
            m_rWakeup.started -= OnWakeup;
        }
    }

    private void Update() {
        if (m_bIsDown) {
        }
        else {
            if (m_rAnimator != null) {
                if (m_rAnimator.GetBool("IsDown")) {
                    OnEnterStateDown();
                }
            }
        }
    }

    private void OnEnterStateDown() {
        m_bIsDown = true;
        if (m_rPlayerInput != null) {
            m_rPlayerInput.SwitchCurrentActionMap("Field_Down");
        }
        if (m_rAnimator != null) {
            m_rAnimator.Play("Down");
        }
        if (m_rMoveControl != null) {
            m_rMoveControl.Move(Vector2.zero);
        }
    }

    private void OnExitStateDown() {
        m_bIsDown = false;
        if (m_rPlayerInput != null) {
            m_rPlayerInput.SwitchCurrentActionMap("Field_Standing");
        }
    }

    private void OnWakeup(InputAction.CallbackContext context) {
        if (m_rAnimatorModifierCheck != null) {
            if (!m_rAnimatorModifierCheck.HasKey("Wakeup")) {
                if (m_rAnimator != null) {
                    m_rAnimator.SetTrigger("Wakeup");
                    m_rAnimator.SetBool("IsDown", false);
                }
            }
        }
        OnExitStateDown();
    }
}

動作確認

Unityエディターで再生して、動作確認します。
Explosion オブジェクトの上を歩くとダウン状態になります。
ダウン状態のときに、マウスの右ボタンをクリックすると、復帰できます。

まとめ

Project TCC のキャラクターがダウン状態になるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
PlayerInput コンポーネントの ActionMap を切り替えることにより、ダウン状態の操作方法を切り替えることが出来ます。

コメント

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