【Unity】Project TCC で遊ぼう~UC-03-08 Wall Jump: 壁に張り付き、更にジャンプできるようにします~

UC-03-08 Wall Jump Unity
UC-03-08 Wall Jump

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

Project TCC で遊ぼう~UC-03-08 Wall Jump: 壁に張り付き、更にジャンプできるようにします~

UC-03-08 Wall Jump
UC-03-08 Wall Jump

UC-03-08 Wall Jump

変更点の確認

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

UC-03-07_AerialKick シーンと違うところは、Player オブジェクトの Script Machine に WallHang が追加されています。空中にいるときに、壁に張り付き状態になれます。

Script Machine
Script Machine

シーンの複製

UC-03-07_AerialKick シーンを複製して、UC-03-08_WallJump_Copy という名前にします。

Level の複製

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

System の複製

UC-03-08_WallJump_Copy シーンの Main Camera、CameraController、VirtualCamera、System オブジェクト(子オブジェクトも含む)を削除します。
UC-03-08_WallJump シーンの System オブジェクトをコピー(Ctrl + C)して、UC-03-08_WallJump_Copy シーンに貼り付け(Ctrl + V)ます。
System/VirtualCamera オブジェクトの CinemachineVirtualCamera コンポーネントの Follow に Player オブジェクトを設定します。

Follow の設定
Follow の設定

アバターの設定

Player オブジェクトの見た目を変更します。
Player オブジェクトの子オブジェクトの UnitychanRFN_STD オブジェクトを削除します。
Assets/TCC/Contents/Characters/UnityChanTPK/Models/01_kohaku_A/Prefabs/01_kohaku_A プレハブを Player オブジェクトのところまで持っていき、ドラッグ&ドロップします。
ヒエラルキーの Player/01_kohaku_A/model_grp/kwep_exebreaker オブジェクトを選択し、インスペクターのチェックを外して無効にします。

アバターの設定
アバターの設定

Player タグの設定

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

Player タグの設定
Player タグの設定

CharacterSettings の設定

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

CharacterSettings の設定
CharacterSettings の設定

PlayerInput の設定

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

PlayerInput の設定
PlayerInput の設定

Animator の設定

Player オブジェクトの Animator コンポーネントの Controller に Assets/TCC/Scenes/03_Action/Data_UC-03-08_WallJump/UC-03-08_WallJump を設定します。
Player オブジェクトの Animator コンポーネントの Avatar に Assets/TCC/Contents/Characters/UnityChanTPK/Models/01_kohaku_A/01_kohaku_AAvatar を設定します。

Animator の設定
Animator の設定

WallCheck の追加

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

WallCheck の追加
WallCheck の追加

AnimatorMoveControl の追加

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

AnimatorMoveControl の追加
AnimatorMoveControl の追加

ScriptMachine の編集

UC-03-08_WallJump_Copy シーンの Player オブジェクトについている ScriptMachine の Jump を削除します。UC-03-08_WallJump シーンの Player オブジェクトについている ScriptMachine の Jump をコピーします。
UC-03-08_WallJump_Copy シーンの Player オブジェクトについている ScriptMachine にペーストします。

ScriptMachine の編集
ScriptMachine の編集

JumpControl の設定

Player オブジェクトの JumpControl コンポーネントの OnJump に OnJump イベントを設定します。

JumpControl の設定
JumpControl の設定

MyPlayer_03_08 の作成

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

using Unity.TinyCharacterController.Brain;
using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Control;
using Unity.TinyCharacterController.Effect;
using UnityEngine;

public class MyPlayer_03_08 : MonoBehaviour {
    private WallCheck m_rWallCheck;
    private GroundCheck m_rGroundCheck;
    private Gravity m_rGravity;
    private Animator m_rAnimator;
    private JumpControl m_rJumpControl;
    private CharacterBrain m_rCharacterBrain;

    private void Awake() {
        TryGetComponent<WallCheck>(out m_rWallCheck);
        TryGetComponent<GroundCheck>(out m_rGroundCheck);
        TryGetComponent<Gravity>(out m_rGravity);
        TryGetComponent<Animator>(out m_rAnimator);
        TryGetComponent<JumpControl>(out m_rJumpControl);
        TryGetComponent<CharacterBrain>(out m_rCharacterBrain);
    }

    private void Update() {
        if (m_rWallCheck == null) {
            return;
        }
        if (m_rGroundCheck == null) {
            return;
        }
        if (m_rGravity == null) {
            return;
        }
        if (m_rAnimator == null) {
            return;
        }
        if (m_rJumpControl == null) {
            return;
        }
        if (m_rCharacterBrain == null) {
            return;
        }
        bool bIsContact = m_rWallCheck.IsContact;
        bool bIsOnGround = m_rGroundCheck.IsOnGround;
        float fFallSpeed = m_rGravity.FallSpeed;
        if (bIsContact && !bIsOnGround && (fFallSpeed < 0)) {
            m_rAnimator.SetBool("IsHang", true);
            m_rGravity.SetVelocity(Vector3.down);
            Vector3 rNormal = m_rWallCheck.Normal;
            Vector3 rForward = Vector3.Scale(rNormal, new Vector3(1f, 0f, 1f));
            Quaternion rRotation = Quaternion.LookRotation(rForward, Vector3.up);
            m_rCharacterBrain.Warp(rRotation);
            m_rAnimator.Play("Hang");
        }
        else {
            m_rAnimator.SetBool("IsHang", false);
            m_rJumpControl.JumpDirection = Vector3.up;
        }
    }
}

動作確認

Unityエディターで再生して、動作確認します。
空中にいるときに、壁に張り付き状態になれます。
さらに、Space キーを押すと、壁ジャンプできます。

まとめ

Project TCC のキャラクターが空中にいるときに壁に張り付き状態になるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
壁ジャンプで上に登っていくアクションができるようになりました。

コメント

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