게임개발/드림랜드

2024.09.03 블렌드 트리를 활용한 걷기 애니메이션

서지현 2024. 9. 3. 08:44

'블렌드 트리' 값과 캐릭터 무브 스크립트를 활용하여 걷기 애니메이션을 만들지 않고도 걷기를 구현했다.

 

idle은 0, run은 1, walk는 0.5가 되도록 할당해줬다.

 

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;


[RequireComponent(typeof(CharacterController), typeof(Animator))]
public class CharacterMove : MonoBehaviour
{
    private CharacterController controller;
    private Animator animator;

    [SerializeField]
    float gravity = -9.81f; // 중력의 크기
    float yVelocity = 0f; // 캐릭터의 현재 y축 속도
    [SerializeField]
    public float walkSpeed = 2f;
    [SerializeField]
    public float runSpeed = 5f;
    [SerializeField]
    public float rotationSpeed = 5f; // 회전 속도를 조절하는 변수
    float hAxis;
    float vAxis;
    

    Vector3 moveVec;


    public Transform cameraTransform;

    // Start is called before the first frame update
    void Start()
    {
        controller = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();

        if (cameraTransform == null)
        {


            cameraTransform = Camera.main.transform;


        }
    }

    // Update is called once per frame
    void Update()
    {
        hAxis = Input.GetAxisRaw("Horizontal");
        vAxis = Input.GetAxisRaw("Vertical");

        Vector3 inputDirection = new Vector3(hAxis, 0f, vAxis).normalized;

        Vector3 CameraForward = cameraTransform.forward;
        Vector3 CameraRight = cameraTransform.right;


        CameraForward.y = 0f;
        CameraRight.y = 0f;


        Vector3 moveDirection = CameraForward * inputDirection.z + CameraRight * inputDirection.x;

        bool isWalking = Input.GetKey(KeyCode.LeftShift);
        float movementState = 0f;
        float speed = 0f;


        // 애니메이터 상태 설정

        
        
        if (moveDirection != Vector3.zero)
        {

            movementState = isWalking ? 0.5f : 1f;
            speed = isWalking ? walkSpeed : runSpeed;
        }
        
        animator.SetFloat("MovementState", movementState);


        if (moveDirection != Vector3.zero) {



            // 목표 회전 값 계산
            Quaternion targetRotation = Quaternion.LookRotation(moveDirection);

            // 현재 회전 값과 목표 회전 값을 선형 보간하여 부드럽게 회전
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);

            controller.Move(moveDirection * speed * Time.deltaTime);


        }

        if(controller.isGrounded)
        {


            yVelocity = 0f;


        }

        else
        {

            yVelocity += gravity * Time.deltaTime;


        }

        Vector3 verticalVelocity = new Vector3(0, yVelocity, 0);
        controller.Move(verticalVelocity * Time.deltaTime);


    }


}