유니티 기초 강좌: 1인칭 시야와 회전 기능

유니티는 최신 게임 개발의 많은 측면을 혁신적으로 변화시켜주는 강력한 엔진입니다. 본 강좌에서는 1인칭 시야를 구현하고, 해당 시야에서 회전 기능을 추가하는 방법에 대해 자세히 설명하겠습니다. 이 내용을 통해 유니티에서 첫 번째 게임 플레이 경험을 만들어 보는 기회를 제공합니다.

1. 유니티 설치 및 기본 설정

유니티를 이용하기 위해서는 먼저 공식 웹사이트에서 유니티 허브를 다운로드하여 설치해야 합니다. 설치 후 새로운 프로젝트를 생성하고, “3D” 템플릿을 선택하세요. 3D 템플릿은 1인칭 시야와 같은 시점 기반의 게임을 만드는 데 적합합니다.

2. 1인칭 캐릭터 컨트롤러 설정

유니티에서 1인칭 게임을 구현하려면 캐릭터 컨트롤러를 설정해야 합니다. 이는 플레이어가 게임의 환경을 탐험할 수 있는 방법입니다. 다음 단계로 진행합니다.

2.1 캐릭터 컨트롤러 추가

프로젝트의 Hierarchy 창에서 우클릭 후 “3D Object” > “Capsule”을 선택하여 캡슐을 생성합니다. 이것을 플레이어로 사용합니다. 캡슐의 이름을 ‘Player’로 변경하세요.

2.2 카메라 추가

Hierarchy에서 캡슐 위에 카메라를 추가해야 실제 1인칭 시야를 만들 수 있습니다. Player 오브젝트를 선택한 후, 우클릭하고 “Camera”를 선택하여 카메라를 추가하세요. 카메라는 Capsule 오브젝트의 자식으로 배치되어야 합니다.

2.3 카메라 위치 조정

카메라의 위치를 플레이어의 머리 높이에 맞게 조정합니다. 일반적으로 Y축 물리값을 1.5로 설정합니다. Transform 컴포넌트를 사용하여 카메라의 위치를 조정하세요.

3. 회전 기능 구현

이제 플레이어가 보기 방향을 조정할 수 있도록 회전 기능을 추가하겠습니다. 이를 위해 C# 스크립트를 작성해야 합니다.

3.1 새 스크립트 생성

Project 창에서 우클릭 후 “Create” > “C# Script”를 선택하여 새 스크립트를 만들고, 이름을 “PlayerController”로 지정합니다. 이 스크립트를 Player 오브젝트에 드래그하여 추가하세요.

3.2 스크립트 내용 작성

PlayerController 스크립트를 열고, 다음 코드를 작성하여 플레이어의 이동 및 회전 기능을 구현합니다:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f;
    public float sensitivity = 2.0f;

    private float rotationY = 0.0f;

    void Update()
    {
        // 회전
        float mouseX = Input.GetAxis("Mouse X") * sensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity;

        rotationY -= mouseY;
        rotationY = Mathf.Clamp(rotationY, -90f, 90f); // 시야의 제한

        Camera.main.transform.localRotation = Quaternion.Euler(rotationY, 0, 0);
        transform.Rotate(Vector3.up * mouseX);

        // 이동
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");
        Vector3 move = transform.right * moveX + transform.forward * moveZ;
        CharacterController controller = GetComponent();
        controller.Move(move * speed * Time.deltaTime);
    }
}

            

3.3 스크립트 설명

위 코드에서 다음과 같은 기능을 구현했습니다:

  • Mouse Input: 마우스 이동에 따라 회전을 계산합니다.
  • Vertical and Horizontal Input: WASD 키 입력을 통해 플레이어의 위치를 조정합니다.
  • CharacterController: 이동 중 물리적 충돌 처리를 위한 유니티의 CharacterController를 사용합니다.

4. 물리 설정 및 개선 사항

기본적인 1인칭 플레이어 컨트롤러가 완성 되었으니, 다음으로는 몇 가지 개선 사항과 물리 설정을 다루겠습니다.

4.1 중력 조정

CharacterController를 사용하여 중력을 추가해야 합니다. PlayerController 스크립트에 중력과 점프 기능을 추가합니다:

private Vector3 velocity;

void Update()
{
    ...
    // 중력 추가
    if (controller.isGrounded)
    {
        velocity.y = -0.5f;
    }
    else
    {
        velocity.y += Physics.gravity.y * Time.deltaTime;
    }
    controller.Move(velocity * Time.deltaTime);
}

            

4.2 점프 기능 추가

점프를 구현하기 위해서는 스페이스 키 입력을 감지하여 플레이어가 점프할 수 있도록 해야 합니다. 아래 코드를 추가하세요.

if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    velocity.y = Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
}

            

4.3 시각적 개선

카메라의 시점을 자연스럽게 설정하기 위해, 플레이어가 움직일 때의 애니메이션을 추가하는 것도 좋습니다. 이를 위해 Animator와 Animation Clip을 사용하는 방법을 고려해보세요.

5. 추가 사항 및 최적화

플레이어의 감각을 더욱 현실감 있게 하기 위해 다음의 추가 사항을 고려할 수 있습니다.

5.1 사운드 효과 추가

이동 시 소리와 점프 시 소리를 추가하면 더욱 몰입감을 줄 수 있습니다. AudioSource 컴포넌트를 활용해 사운드를 추가하는 방법을 학습하세요.

5.2 인터페이스 및 HUD 구성을 위한 Canvas 사용

플레이어에게 필요한 정보를 제공하기 위해 UI Canvas를 추가해보세요. HUD는 생명력, 미니맵, 점수 등을 나타낼 수 있습니다.

5.3 최적화

애셋이나 스크립트의 성능 저하를 방지하기 위해 Profiler를 사용하여 성능을 분석하고 최적화합니다. Unity의 메모리 사용량이나 CPU 사용량을 모니터링하여 최적의 상태로 조정할 수 있습니다.

결론

이번 강좌를 통해 유니티의 기본적인 1인칭 시야와 회전 기능 구현에 대해 알아보았습니다. 이러한 기초적인 내용을 바탕으로, 본인의 창의력을 더하여 다양한 게임을 제작해보시기 바랍니다.

유니티는 무궁무진한 가능성을 지닌 플랫폼입니다. 많은 연습과 시도를 통해 유니티에서의 능력을 키워가세요. 앞으로의 더 많은 강좌를 통해 다양한 기능과 게임 개발의 심화 과정을 배워보겠습니다. 즐거운 개발 되세요!