Unity の Project TCC を触って、Unity の機能を学んでいきましょう。
Project TCC で遊ぼう~UC-01-05 Move Jump Crouch: しゃがむ、しゃがんだ状態で歩かせる~
UC-01-05 Move Jump Crouch
変更点の確認
UC-01-05_Move_Jump_Crouch シーンを開きます。
Unityエディター上で再生して、ユニティちゃんをしゃがませてみましょう。
UC-01-04_Move_and_DoubleJump シーンと違うところは、Player オブジェクトの Script Machine に Crouch の処理が追加されています。
Control キー、あるいは、C キーを押すと、しゃがみます。そして、移動キーを押すと、しゃがんだまま移動します。
シーンの複製
UC-01-04_Move_and_DoubleJump_Copy シーンを複製して、UC-01-05_Move_Jump_Crouch_Copy という名前にします。
Input Action Asset の設定
Assets/TCC/Scenes/01_Move/Data_UC-01-03_Move_and_Jump_Copy フォルダを複製して、Data_UC-01-05_Move_Jump_Crouch_Copy という名前にします。
フォルダの中身の名前も変更します。
Data_UC-01-05_Move_Jump_Crouch_Copy を選択して、インスペクターから Edit asset をクリックして Input Actions の設定を行います。
Control キー、あるいは、C キーを押したら Crouch アクションが反応するようにします。
Player オブジェクトの Player Input コンポーネントにある Actions に Input Action Asset を設定します。
Animator の設定
Player オブジェクトの Animator コンポーネントの Controller に UC-01-05_Move_Jump_Crouch を設定します。
C# スクリプトの作成
Player オブジェクトにくっ付いている MyWalkTest にプログラムを追加していきます。
MyWalkTest の内容はこちらになります。
using Unity.TinyCharacterController;
using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Control;
using UnityEngine;
using UnityEngine.InputSystem;
public class MyWalkTest : MonoBehaviour {
private MoveControl m_rMoveControl;
private JumpControl m_rJumpControl;
private GroundCheck m_rGroundCheck;
private HeadContactCheck m_rHeadContactCheck;
private Animator m_rAnimator;
private PlayerInput m_rPlayerInput;
private CharacterSettings m_rCharacterSettings;
private InputAction m_rMove;
private InputAction m_rSprint;
private InputAction m_rJump;
private InputAction m_rCrouch;
private float m_fDefaultHeight;
void Awake() {
TryGetComponent<MoveControl>(out m_rMoveControl);
TryGetComponent<JumpControl>(out m_rJumpControl);
TryGetComponent<GroundCheck>(out m_rGroundCheck);
TryGetComponent<HeadContactCheck>(out m_rHeadContactCheck);
TryGetComponent<Animator>(out m_rAnimator);
TryGetComponent<PlayerInput>(out m_rPlayerInput);
TryGetComponent<CharacterSettings>(out m_rCharacterSettings);
if (m_rPlayerInput != null) {
m_rMove = m_rPlayerInput.actions["Move"];
m_rSprint = m_rPlayerInput.actions["Sprint"];
m_rJump = m_rPlayerInput.actions["Jump"];
m_rCrouch = m_rPlayerInput.actions["Crouch"];
}
}
private void Start() {
if (m_rCharacterSettings != null) {
m_fDefaultHeight = m_rCharacterSettings.Height;
}
}
private void OnEnable() {
if (m_rJumpControl != null) {
m_rJumpControl.OnJump.AddListener(OnJumpStart);
}
if (m_rPlayerInput != null) {
m_rMove.performed += OnMove;
m_rMove.canceled += OnMoveStop;
m_rSprint.performed += OnSprint;
m_rSprint.canceled += OnSprintStop;
m_rJump.started += OnJump;
m_rCrouch.started += OnCrouch;
}
}
private void OnDisable() {
if (m_rJumpControl != null) {
m_rJumpControl.OnJump.RemoveListener(OnJumpStart);
}
if (m_rPlayerInput != null) {
m_rMove.performed -= OnMove;
m_rMove.canceled -= OnMoveStop;
m_rSprint.performed -= OnSprint;
m_rSprint.canceled -= OnSprintStop;
m_rJump.started -= OnJump;
m_rCrouch.started -= OnCrouch;
}
}
private void Update() {
if (m_rMoveControl != null) {
float fSpeed = m_rMoveControl.CurrentSpeed;
if (m_rAnimator != null) {
m_rAnimator.SetFloat("Speed", fSpeed);
}
}
if (m_rGroundCheck != null) {
if (m_rAnimator != null) {
m_rAnimator.SetBool("IsGround", m_rGroundCheck.IsOnGround);
}
}
if (m_rCharacterSettings != null && m_rAnimator != null) {
if (m_rAnimator.GetBool("IsCrouch")) {
m_rCharacterSettings.Height = m_fDefaultHeight / 1.5f;
}
else {
m_rCharacterSettings.Height = m_fDefaultHeight;
}
}
}
private void OnMove(InputAction.CallbackContext context) {
if (m_rMoveControl == null) {
return;
}
Vector2 value = context.ReadValue<Vector2>();
m_rMoveControl.Move(value);
}
private void OnMoveStop(InputAction.CallbackContext context) {
if (m_rMoveControl == null) {
return;
}
Vector2 value = context.ReadValue<Vector2>();
m_rMoveControl.Move(value);
}
private void OnSprint(InputAction.CallbackContext context) {
if (m_rMoveControl == null) {
return;
}
m_rMoveControl.MoveSpeed = 4f;
}
private void OnSprintStop(InputAction.CallbackContext context) {
if (m_rMoveControl == null) {
return;
}
m_rMoveControl.MoveSpeed = 1.2f;
}
private void OnJump(InputAction.CallbackContext context) {
if (m_rJumpControl == null) {
return;
}
m_rJumpControl.Jump(true);
}
private void OnJumpStart() {
if (m_rAnimator != null && m_rJumpControl != null) {
if (m_rJumpControl.AerialJumpCount >= 1) {
m_rAnimator.Play("DoubleJump");
}
else {
m_rAnimator.Play("JumpStart");
}
}
}
private void OnCrouch(InputAction.CallbackContext context) {
if (m_rAnimator != null) {
if (m_rAnimator.GetBool("IsCrouch")) {
if (m_rHeadContactCheck != null && !m_rHeadContactCheck.IsObjectOverhead) {
m_rAnimator.SetBool("IsCrouch", false);
if (m_rMoveControl != null) {
m_rMoveControl.MoveSpeed = 1.2f;
}
}
}
else {
m_rAnimator.SetBool("IsCrouch", true);
if (m_rMoveControl != null) {
m_rMoveControl.MoveSpeed = 0.8f;
}
}
}
}
}
動作確認
Unityエディターで再生して、動作確認します。
ユニティちゃんをしゃがませることが出来れば成功です。
まとめ
Project TCC のキャラクターをしゃがませるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
HeadContactCheck コンポーネントで頭上のコリジョンをチェックすることが出来ます。
コメント