이번 포스팅은 자세히 이해하지 않아도 괜찮으니 바쁘신 분들은 스크립트만 가져가셔도 괜찮습니다.
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 : 맵의 영역을 설정합니다.
'유니티 게임 개발' 카테고리의 다른 글
[유니티 강좌] 2D RPG 게임 만들기 - 12 / 아이템 (6) | 2021.03.24 |
---|---|
[유니티 강좌] 2D RPG 게임 만들기 - 11 / 간단한 적 AI (5) | 2021.03.21 |
[유니티 강좌] 2D RPG 게임 만들기 - 9 / 맵 생성, 타일 맵 (6) | 2021.03.18 |
[유니티 강좌] 2D RPG 게임 만들기 - 8 / 벽에 붙는 현상 (3) | 2021.03.15 |
[유니티 강좌] 2D RPG 게임 만들기 - 7 / 점프 (13) | 2020.06.07 |
댓글