[Go-Unity 3D] 16. Navigation Mesh - 3인칭 카메라 ⭐⭐⭐

업데이트:

카테고리:

태그: , ,


Navigation Mesh , 3인칭 카메라

고박사의 유니티 기초를 정리.

1. 3인칭시점 카메라

카메라 이동, 회전, 휠로 확대 축소


CameraController.cs

타겟 따라가기, 마우스 휠 확대 축소 , 우클릭후 회전

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    [SerializeField]
    private Transform   target;             // 카메라 추적 대상
    [SerializeField]
    private float       minDistance = 3;    // 카메라 - 타겟 최소 거리
    [SerializeField]
    private float       maxDistance = 30;   // 카메라 - 타겟 최대 거리
    [SerializeField]
    private float       wheelSpeed = 1000;   // 마우스 휠 스크롤 속도
    [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;           // 카메라 타겟 거리

    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; // target이 존재하지 않으면 실행 하지 않는다
            
        // 오른쪽 마우스를 누르고 있을 때
        if ( Input.GetMouseButton(1) )
        {
            // 마우스를 x, y축 움직임 방향 정보
            x += Input.GetAxis("Mouse X") * xMoveSpeed * Time.deltaTime; 
            y -= Input.GetAxis("Mouse Y") * yMoveSpeed * Time.deltaTime; 

            // 오브젝트의 위/아래(x축) 한계 범위 설정 
            y = ClampAngle(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;
        {
            // 카메라의 위치 정보 갱신
            // target의 위치를 기준으로 distance만큼 떨어져서 쫓아간다.
            transform.position = transform.rotation * new Vector3(0,0,-distance) + target.position;
        }
    }

    private float ClampAngle(float angle,float min, float max){
        if ( angle < -360 ) angle += 360;
        if ( angle > 360  ) angle -= 360;
        
        // Math.f.Clamp()를 이용해 angle이 min <= angle<=max 를 유지하도록
        return Mathf.Clamp(angle,min,max);
    }
}


  • 타겟 따라가기, 마우스 휠 확대 축소 , 우클릭후 회전





image


참고 : 유니티 TOP


📔

댓글남기기