'블렌드 트리' 값과 캐릭터 무브 스크립트를 활용하여 걷기 애니메이션을 만들지 않고도 걷기를 구현했다.
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);
}
}
'게임개발 > 드림랜드' 카테고리의 다른 글
2024.09.04 npc 상호작용 (1) | 2024.09.04 |
---|---|
2024.09.03 플레이어 걷는 소리 구현 (0) | 2024.09.03 |
2024.09.02 NPC 애니메이션, 카메라 스크립트와 플레이어 스크립트 그리고 커서 (0) | 2024.09.02 |
2024.08.27 NPC 만들기 (0) | 2024.08.27 |
2024.08.23 드림랜드 개발 과정(2) (0) | 2024.08.23 |