【Unity】Project TCC で遊ぼう~UC-03-02 Rolling: キャラクターにローリング回避を実装します~

UC-03-02 Rolling Unity
UC-03-02 Rolling

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

Project TCC で遊ぼう~UC-03-02 Rolling: キャラクターにローリング回避を実装します~

UC-03-02 Rolling
UC-03-02 Rolling

UC-03-02 Rolling

変更点の確認

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

UC-02-03_Cinemachine_TPS_Control シーンと違うところは、Player オブジェクトの Script Machine に Evasion の処理が追加されています。
マウスのホイールボタンをクリックすると回避します。

Script Machine
Script Machine

シーンの複製

UC-02-03_Cinemachine_TPS_Control シーンを複製して、UC-03-02_Rolling(TPS)_Copy という名前にします。

Input Action Asset の設定

Assets/TCC/Scenes/02_Camera/Data_UC-02-03_TPS_Control フォルダを複製して、Assets/TCC/Scenes/03_Action/Data_UC-03-02_Rolling(TPS)_Copy という名前にします。
フォルダ内のファイルも UC-03-02_Rolling_Copy という名前にします。
Input Action Asset(UC-03-02_Rolling_Copy)を選択して、インスペクターの Edit asset ボタンを押します。
Actions に Rolling を追加します。

Rolling の追加
Rolling の追加

Rolling にマウスの Middle Button を割り当てます。

マウスのホイールボタン
マウスのホイールボタン

Player オブジェクトの PlayerInput コンポーネントの Actions に UC-03-02_Rolling_Copy を設定します。

PlayerInput の設定
PlayerInput の設定

Animator コンポーネントの設定

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

Animator の設定
Animator の設定

ExtraForce コンポーネントの追加

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

ExtraForce の追加
ExtraForce の追加

MyPlayer_03_02 スクリプトの作成

Assets/TCC/Scenes/03_Action/Data_UC-03-02_Rolling(TPS)_Copy/MyPlayer_03_02 スクリプトを新規作成します。
Player オブジェクトに MyPlayer_03_02 スクリプトを追加します。
MyPlayer_03_02 スクリプトの内容はこちらになります。

using System.Security.Cryptography;
using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Control;
using Unity.TinyCharacterController.Effect;
using UnityEngine;
using UnityEngine.InputSystem;

public class MyPlayer_03_02 : MonoBehaviour {
    private PlayerInput m_rPlayerInput;
    private InputAction m_rRolling;
    private GroundCheck m_rGroundCheck;
    private Animator m_rAnimator;
    private MoveControl m_rMoveControl;
    private ExtraForce m_rExtraForce;
    private float m_fCooldownDuration = 0.6f;
    private float m_fCooldownTime = 0f;

    private void Awake() {
        TryGetComponent<PlayerInput>(out m_rPlayerInput);
        if (m_rPlayerInput != null) {
            m_rRolling = m_rPlayerInput.actions["Rolling"];
        }
        TryGetComponent<GroundCheck>(out m_rGroundCheck);
        TryGetComponent<Animator>(out m_rAnimator);
        TryGetComponent<MoveControl>(out m_rMoveControl);
        TryGetComponent<ExtraForce>(out m_rExtraForce);
    }

    private void OnEnable() {
        if (m_rRolling != null) {
            m_rRolling.started += OnRolling;
        }
    }

    private void OnDisable() {
        if (m_rRolling != null) {
            m_rRolling.started -= OnRolling;
        }
    }

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

    private void OnRolling(InputAction.CallbackContext context) {
        if (m_rRolling == null) {
            return;
        }
        if (m_rGroundCheck == null) {
            return;
        }
        if (!m_rGroundCheck.IsOnGround) {
            return;
        }

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

        Vector3 vecForward = transform.forward;
        if (m_rAnimator != null) {
            if (m_rAnimator.GetFloat("Speed") > 0.05f) {
                if (m_rMoveControl != null) {
                    vecForward = m_rMoveControl.Direction;
                }
            }
        }
        if (m_rExtraForce != null) {
            Vector3 vecForce = vecForward * 20f;
            m_rExtraForce.AddForce(vecForce);
        }
        if (m_rAnimator != null) {
            m_rAnimator.Play("Rolling");
        }
    }
}

動作確認

Unityエディターで再生して、動作確認します。
マウスのホイールボタンをクリックすると回避すれば成功です。

まとめ

Project TCC のキャラクターを回避させるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
ExtraForce コンポーネントを使って回避させることが出来ます。

コメント

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