본문 바로가기
유니티 게임 개발

[유니티 강좌] 2D RPG 게임 만들기 - 10 / 따라오는 카메라, 영역 설정

by 호일이 2021. 3. 18.

 이번 포스팅은 자세히 이해하지 않아도 괜찮으니 바쁘신 분들은 스크립트만 가져가셔도 괜찮습니다.

 

public class CameraFollow : MonoBehaviour
{
    public Transform target;

    public float smoothSpeed = 3;
    public Vector2 offset;
    public float limitMinX, limitMaxX, limitMinY, limitMaxY;
    float cameraHalfWidth, cameraHalfHeight;

    private void Start()
    {
        cameraHalfWidth = Camera.main.aspect * Camera.main.orthographicSize;
        cameraHalfHeight = Camera.main.orthographicSize;
    }

    private void LateUpdate()
    {
        Vector3 desiredPosition = new Vector3(
            Mathf.Clamp(target.position.x + offset.x, limitMinX + cameraHalfWidth, limitMaxX - cameraHalfWidth),   // X
            Mathf.Clamp(target.position.y + offset.y, limitMinY + cameraHalfHeight, limitMaxY - cameraHalfHeight), // Y
            -10);                                                                                                  // Z
        transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * smoothSpeed);
    }
}

 

코드 설명

 카메라가 이동할 수 있는 영역을 지정하기 위해선 먼저 카메라의 x축 길이, y축 길이를 알아야 합니다.

 

cameraHalfWidth = Camera.main.aspect * Camera.main.orthographicSize;
cameraHalfHeight = Camera.main.orthographicSize;

 코드로 간단하게 구할 수 있습니다.

 Camera.main.aspect는 해상도 width/height를 계산한 비율을 나타내는 속성입니다.

 Camera.main.orthographicSize는 카메라의 Size입니다.

 실제로 16/9*5를 하면 카메라 x축의 절반 값이 나옵니다.

 

public float limitMinX, limitMaxX, limitMinY, limitMaxY;

 맵의 최소, 최대 값을 받아서 영역을 지정합니다. 귀찮지만 하나하나 적어야 합니다.

 

Vector3 desiredPosition = new Vector3(
    Mathf.Clamp(target.position.x + offset.x, limitMinX + cameraHalfWidth, limitMaxX - cameraHalfWidth),   // X
    Mathf.Clamp(target.position.y + offset.y, limitMinY + cameraHalfHeight, limitMaxY - cameraHalfHeight), // Y
    -10); // Z

 Mathf.Clamp(값, 최솟값, 최댓값)으로 최솟값, 최댓값을 넘지 않게 지정할 수 있습니다.

 

Mathf.Clamp의 간단한 예제

float num = Mathf.Clamp(150, 100, 200); 

->num의 값은 150

float num2 = Mathf.Clamp(50, 100, 200);

->num2의 값은 100

float num3 = Mathf.Clamp(250, 100, 200);

->num3의 값은 200

 

transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * smoothSpeed);

 Vector3 Vector3.Lerp(시작 위치, 도착할 위치, t)를 사용해서 부드럽게 이동할 수 있습니다.

 t : 0에 가까울수록 시작 위치를 반환, 1과 가까울수록 도착할 위치를 반환

 

 

사용법

 메인 카메라에 스크립트를 붙이고 Target을 소드맨으로 설정합니다.

 Smooth Speed : 숫자가 작을수록 느리게 움직입니다.

 Offset : 현재 카메라 위치를 수정합니다.

 Limit Min, Max : 맵의 영역을 설정합니다.

 

실행 화면

 

반응형

댓글