[Skill] 3인칭 카메라



3인칭 카메라를 만드는 방법에 대해 살펴보자.

우선 카메라의 이동, 회전을 제어하는 CameraController 스크립트를 만들어보자.

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

public class CameraController : MonoBehaviour
{
    [SerializeField]
    private Transform target;       // 카메라가 추적하는 대상
    [SerializeField]
    private float minDistance = 3;  // 카메라와 target의 최소 거리
    [SerializeField]
    private float maxDistance = 30; // 카메라와 target의 최대 거리
    [SerializeField]
    private float wheelSpeed = 2500;     // 마우스 휠 스크롤 속도
    [SerializeField]
    private float xMoveSpeed = 500;     // 카메라의 y축 회전 속도
    [SerializeField]
    private float yMoveSpeed = 250;     // 카메라의 x축 회전 속도
    private float yMinLimit = 5;        // 카메라의 x축 회전 제한 최소 값
    private float yMaxLimit = 80;   // 카메라의 x축 회전 제한 최대 값
    private float x, y;     // 마우스 이동 방향 값
    private float distance;     // 카메라와 target의 거리


    private void Awake()
    {
        // 최초 설정 된 target과 카메라의 위치를 바탕으로 distance 값 초기화
        distance = Vector3.Distance(transform.position, target.position);
        // 최초 카메라의 회전 값을 x,y 변수에 저장
        Vector3 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }

    private void Update()
    {
        if (target == null) return; // 타겟이 조재하지 않으면 실행 하지 않는다.

        // 오른쪽 마우스를 누르고 있을 때
        if (Input.GetMouseButton(1))
        {
            // 마우스를 x, y축 움직임 방향 정보
            x+=Input.GetAxis("Mouse X") * xMoveSpeed * Time.deltaTime;
            y -= Input.GetAxis("Mouse Y") * yMoveSpeed * Time.deltaTime;

            // 오브젝트의 위/아래(x축) 한계 범위 설정
            y = Mathf.Clamp(y, yMinLimit, yMaxLimit);

            // 카메라의 회전(Rotation) 정보 갱신
            transform.rotation = Quaternion.Euler(y, x, 0);
        }

        // 마우스 휠 스크롤을 이용해 target과 카메라의 거리 값(distance) 조절
        distance-=Input.GetAxis("Mouse ScrollWheel") * wheelSpeed* Time.deltaTime;

        // 거리는 최소, 최대 거리를 설정해서 그 값을 벗어나지 않도록 한다.
        distance = Mathf.Clamp(distance, minDistance,maxDistance);
    }

    private void LateUpdate()
    {
        if(target==null) return;

        // 카메라의 위치(Position) 정보 갱신
        // target의 위치를 기준으로 distance만큼 떨어져서 쫒아간다
        transform.position=transform.rotation*new Vector3(0,0,-distance)+target.position;   
    }
}





© 2022. by KSC

Powered by sora