Unity에서의 고급 플레이어 이동

이 튜토리얼에서는 달리기, 웅크리기, 매끄러운 카메라 시스템을 포함한 Unity의 고급 플레이어 이동 메커니즘을 살펴보겠습니다. 이러한 기능은 플레이어 컨트롤에 깊이와 세련미를 더해 전반적인 게임플레이 경험을 향상시킵니다. 사실적인 움직임과 상호 작용을 위해 Unity의 물리 시스템을 사용합니다.

장면 설정

코딩에 들어가기 전에 플레이어 객체와 카메라가 있는 기본 장면을 설정해 보겠습니다.

  1. 새로운 Unity 프로젝트를 만듭니다.
  2. 계층 구조에서 3D 큐브를 만들고, 이름을 Player로 바꾸고 캐릭터와 비슷하게 크기를 조정합니다(예: X: 1, Y: 2, Z: 1).
  3. 플레이어에 Rigidbody 컴포넌트를 추가하고, Interpolate 속성을 Interpolate로 설정하여 부드러운 물리 효과를 구현합니다.
  4. Capsule Collider 컴포넌트를 추가하고 높이와 반경을 플레이어 모델과 일치하도록 조정합니다.
  5. 빈 GameObject를 만들고, CameraRig라는 이름을 붙이고, Camera를 붙입니다. 카메라를 플레이어 뒤, 약간 위에 배치합니다.
  6. CameraRig를 Player 객체의 자식으로 만들어서 Player 객체의 움직임을 따르도록 합니다.

고급 플레이어 이동 구현

기본적인 움직임, 달리기, 웅크리기, 부드러운 카메라 회전을 처리하는 스크립트를 구현하겠습니다.

플레이어 이동 스크립트

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float walkSpeed = 5f;
    public float sprintSpeed = 10f;
    public float crouchSpeed = 2.5f;
    public float jumpForce = 5f;
    public float gravity = 20f;

    public Transform cameraTransform;
    public float lookSensitivity = 2f;
    public float maxLookAngle = 80f;

    private Rigidbody rb;
    private float currentSpeed;
    private bool isCrouching = false;
    private bool isGrounded = false;

    private void Start()
    {
        rb = GetComponent();
        rb.freezeRotation = true; // Prevent the Rigidbody from rotating
    }

    private void Update()
    {
        HandleMovement();
        HandleJumping();
        HandleCrouching();
        HandleCameraRotation();
    }

    private void HandleMovement()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 move = transform.right * moveHorizontal + transform.forward * moveVertical;
        move = move.normalized * currentSpeed * Time.deltaTime;

        Vector3 velocity = rb.velocity;
        velocity.x = move.x;
        velocity.z = move.z;
        rb.velocity = velocity;
    }

    private void HandleJumping()
    {
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
        }
    }

    private void HandleCrouching()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            isCrouching = !isCrouching;
            currentSpeed = isCrouching ? crouchSpeed : walkSpeed;
            transform.localScale = new Vector3(1, isCrouching ? 0.5f : 1, 1);
        }

        if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
        {
            currentSpeed = sprintSpeed;
        }
        else if (!isCrouching)
        {
            currentSpeed = walkSpeed;
        }
    }

    private void HandleCameraRotation()
    {
        float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;

        Vector3 rotation = cameraTransform.localEulerAngles;
        rotation.y += mouseX;
        rotation.x -= mouseY;
        rotation.x = Mathf.Clamp(rotation.x, -maxLookAngle, maxLookAngle);

        cameraTransform.localEulerAngles = rotation;
    }

    private void OnCollisionStay(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

주요 특징 및 설명

이동 및 속도 제어

이 스크립트는 Unity의 Rigidbody을 사용하여 플레이어를 움직여 물리 기반 상호 작용을 허용합니다. 속도는 플레이어가 걷고 있는지, 달리고 있는지, 웅크리고 있는지에 따라 다릅니다. 웅크리고 있는 것은 LeftControl 키로 전환하고, 달리고 있는 것은 LeftShift 키를 누르고 있는 동안 발생합니다.

점프

HandleJumping 메서드는 플레이어가 땅에 닿아 있는 경우, 플레이어가 점프 버튼(기본값: 스페이스 바)을 누를 때 위쪽으로 힘을 가합니다. 땅 감지는 "Ground" 태그가 붙은 개체와의 충돌을 확인하여 처리합니다.

카메라 제어

카메라의 회전은 마우스를 사용하여 제어되며, 카메라의 위치에 따라 1인칭 또는 3인칭 관점을 제공합니다. 시선 각도는 과도한 기울기를 방지하기 위해 고정되어 있어 플레이어를 혼란스럽게 할 수 있습니다.

결론

이 튜토리얼은 Unity에서 고급 플레이어 이동을 위한 기초를 제공하며, 물리 기반 제어, 달리기, 웅크리기, 카메라 관리와 같은 다양한 측면을 다룹니다. 이러한 기술은 다양한 게임 장르와 스타일에 맞게 추가로 사용자 지정하고 확장하여 반응성 있고 사실적인 제어로 플레이어 경험을 향상시킬 수 있습니다.

플레이어 움직임은 게임 플레이의 중요한 측면이며 만족스러운 플레이어 경험을 보장하기 위해 신중하게 조정해야 합니다. 다양한 값과 기능을 실험하여 프로젝트에 가장 적합한 설정을 찾으세요.