【Unity】Project TCC で遊ぼう~UC-03-07 AerialKick: ジャンプ中に急降下できるようにします~

UC-03-07 AerialKick Unity
UC-03-07 AerialKick

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

Project TCC で遊ぼう~UC-03-07 AerialKick: ジャンプ中に急降下できるようにします~

UC-03-07 AerialKick
UC-03-07 AerialKick

UC-03-07 AerialKick

変更点の確認

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

UC-03-06_Sliding_Copy シーンと違うところは、Player オブジェクトの Script Machine にある Dash Sliding AerialKick が更新されています。空中で、右クリックを押しながら、ホイールボタンを押すと空中キックのアニメーションを再生します。

Script Machine
Script Machine

シーンの複製

UC-03-06_Sliding_Copy シーンを複製して、UC-03-07_AerialKick_Copy という名前にします。

PlayerInput の設定

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

PlayerInput の設定
PlayerInput の設定

Animator の設定

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

Animator の設定
Animator の設定

MyPlayer_03_07 の作成

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

using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Effect;
using Unity.VisualScripting.Dependencies.Sqlite;
using UnityEngine;
using UnityEngine.InputSystem;

public class MyPlayer_03_07 : MonoBehaviour {
    private PlayerInput m_rPlayerInput;
    private InputAction m_rDash_Sliding;
    private InputAction m_rRMB;
    private Animator m_rAnimator;
    private ExtraForce m_rExtraForce;
    private GroundCheck m_rGroundCheck;
    private float m_fCooldownDuration = 0.6f;
    private float m_fCooldownTime = 0f;

    private void Awake() {
        TryGetComponent<PlayerInput>(out m_rPlayerInput);
        if (m_rPlayerInput != null) {
            m_rDash_Sliding = m_rPlayerInput.actions["Dash_Sliding"];
            m_rRMB = m_rPlayerInput.actions["RMB"];
        }
        TryGetComponent<Animator>(out m_rAnimator);
        TryGetComponent<ExtraForce>(out m_rExtraForce);
        TryGetComponent<GroundCheck>(out m_rGroundCheck);
    }

    private void OnEnable() {
        if (m_rDash_Sliding != null) {
            m_rDash_Sliding.started += OnDashSliding;
            m_rRMB.performed += OnRMB;
            m_rRMB.canceled += OnRMBStop;
        }
    }

    private void OnDisable() {
        if (m_rDash_Sliding != null) {
            m_rDash_Sliding.started -= OnDashSliding;
            m_rRMB.performed -= OnRMB;
            m_rRMB.canceled -= OnRMBStop;
        }
    }

    private void Update() {
        if (m_fCooldownTime > 0f) {
            m_fCooldownTime -= Time.deltaTime;
            if (m_fCooldownTime < 0f) {
                m_fCooldownTime = 0f;
            }
        }
    }

    private void OnDashSliding(InputAction.CallbackContext context) {
        if (m_rAnimator == null) {
            return;
        }
        if (m_rAnimator.GetBool("IsCrouch")) {
            return;
        }

        // Cooldown.
        if (m_fCooldownTime > 0f) {
            return;
        }
        m_fCooldownTime = m_fCooldownDuration;

        bool bSliding = false;
        bool bAir = false;
        if (m_rGroundCheck != null) {
            if (m_rAnimator.GetBool("RMB")) {
                if (m_rGroundCheck.IsOnGround) {
                    bSliding = true;
                }
                else {
                    bAir = true;
                }
            }
        }

        float fDashPower = 15f;
        Vector3 vecForce = transform.forward * fDashPower;

        if (bSliding) {
            m_rAnimator.Play("Slidinig");
        }
        else if (bAir) {
            m_rAnimator.Play("AerialKick");
            vecForce += new Vector3(0f, -20f, 0f);
        }
        else {
            m_rAnimator.Play("DashStart");
        }

        if (m_rExtraForce != null) {
            m_rExtraForce.AddForce(vecForce);
        }
    }

    private void OnRMB(InputAction.CallbackContext context) {
        if (m_rAnimator != null) {
            m_rAnimator.SetBool("RMB", true);
        }
    }

    private void OnRMBStop(InputAction.CallbackContext context) {
        if (m_rAnimator != null) {
            m_rAnimator.SetBool("RMB", false);
        }
    }
}

動作確認

Unityエディターで再生して、動作確認します。
空中で、右クリックを押しながら、ホイールボタンを押すと空中キックのアニメーションを再生します。

まとめ

Project TCC のキャラクターが空中キックするサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
空中にいる場合のキャラクターのアクションが増えました。

コメント

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