Unity 카메라 이동 및 시점 변경 (1인칭, 3인칭)

2024. 12. 14. 05:47Unity

Unity 카메라 이동 및 시점 변경: 1인칭과 3인칭 전환

게임에서 카메라 시스템은 플레이어의 몰입도를 높이는 중요한 요소입니다. Unity를 사용하면 1인칭(FPS)과 3인칭(TPS) 카메라 시점을 쉽게 구현하고 전환할 수 있습니다.

이번 포스팅에서는 카메라 이동, 마우스 컨트롤, 1인칭-3인칭 시점 전환 구현 방법을 단계별로 소개합니다.


1. 1인칭 카메라 설정

1인칭 카메라는 플레이어의 시점에서 세상을 바라보는 방식입니다.

1) 기본 설정

  1. Main CameraPlayer 오브젝트의 자식으로 이동합니다.
  2. Main Camera를 플레이어 머리 위치에 배치합니다.
  3. 카메라의 Transform을 Player의 방향에 맞춥니다.

2) 마우스를 이용한 시점 조작

MouseLook 스크립트를 작성하여 카메라가 마우스 입력에 따라 움직이도록 설정합니다.

using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float mouseSensitivity = 100f;
    public Transform playerBody;

    private float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; // 마우스 커서 고정
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 상하 시점 제한

        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        playerBody.Rotate(Vector3.up * mouseX);
    }
}

3) 스크립트 연결

  1. Main Camera에 MouseLook 스크립트를 추가합니다.
  2. Player Body 필드에 Player 오브젝트를 연결합니다.

2. 3인칭 카메라 설정

3인칭 카메라는 캐릭터 뒤에서 따라가는 방식입니다.

1) 기본 설정

  1. Main Camera를 Player의 자식으로 설정하지 않고, 캐릭터 뒤에 배치합니다.
  2. CameraFollow 스크립트를 작성하여 카메라가 플레이어를 따라다니도록 설정합니다.

2) 카메라 따라가기 스크립트

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target; // 플레이어 위치
    public Vector3 offset; // 카메라 오프셋
    public float smoothSpeed = 0.125f; // 부드러운 이동 속도

    void LateUpdate()
    {
        Vector3 desiredPosition = target.position + offset;
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
        transform.position = smoothedPosition;

        transform.LookAt(target); // 캐릭터 바라보기
    }
}

3) 스크립트 연결

  1. Main Camera에 CameraFollow 스크립트를 추가합니다.
  2. Target 필드에 Player 오브젝트를 연결하고, Offset을 적절히 설정합니다 (예: (0, 5, -10)).

3. 1인칭-3인칭 시점 전환

1) 스크립트 작성

1인칭과 3인칭 카메라를 전환하는 스크립트를 작성합니다.

using UnityEngine;

public class CameraSwitch : MonoBehaviour
{
    public GameObject firstPersonCamera;
    public GameObject thirdPersonCamera;

    private bool isFirstPerson = true;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.V)) // V 키로 전환
        {
            isFirstPerson = !isFirstPerson;
            firstPersonCamera.SetActive(isFirstPerson);
            thirdPersonCamera.SetActive(!isFirstPerson);
        }
    }
}

2) 설정

  1. Main Camera를 복사하여 1인칭과 3인칭 카메라로 각각 설정합니다.
    • 1인칭 카메라: Player의 자식, 머리 위치.
    • 3인칭 카메라: Player의 뒤에 배치.
  2. CameraSwitch 스크립트를 Player에 추가합니다.
  3. First Person CameraThird Person Camera 필드에 각각의 카메라를 연결합니다.

4. 고급 카메라 기능

1) 회전 중심 조정

3인칭 카메라에서 회전 중심을 캐릭터로 설정하려면 Pivot 오브젝트를 추가합니다.

  • Pivot을 Player의 자식으로 생성하고, 카메라를 Pivot의 자식으로 설정합니다.
  • Pivot을 회전시켜 카메라 시점을 변경합니다.

2) 충돌 감지

using UnityEngine;

public class CameraCollision : MonoBehaviour
{
    public Transform target;
    public float minDistance = 2f;
    public float maxDistance = 5f;
    public LayerMask collisionMask;

    private Vector3 offset;

    void Start()
    {
        offset = transform.position - target.position;
    }

    void LateUpdate()
    {
        Vector3 desiredPosition = target.position + offset;
        RaycastHit hit;
        if (Physics.Raycast(target.position, offset.normalized, out hit, maxDistance, collisionMask))
        {
            desiredPosition = target.position + offset.normalized * hit.distance;
        }
        transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * 10f);
    }
}

3) 자유로운 시점 회전

마우스 입력으로 3인칭 카메라를 자유롭게 회전시키려면 다음 코드를 추가합니다:

public float rotationSpeed = 5f;

void Update()
{
    float horizontal = Input.GetAxis("Mouse X") * rotationSpeed;
    float vertical = Input.GetAxis("Mouse Y") * rotationSpeed;

    target.Rotate(Vector3.up * horizontal);
    offset = Quaternion.AngleAxis(vertical, Vector3.right) * offset;
}

 


5. 요약

  • 1인칭: 캐릭터의 시점에서 세상을 보는 방식.
  • 3인칭: 캐릭터를 뒤에서 따라가며 보여주는 방식.
  • 시점 전환: 간단한 스크립트를 통해 1인칭과 3인칭 카메라를 전환.
  • 고급 기능: 충돌 감지, 자유로운 시점 회전, 카메라 애니메이션 적용 가능.