Programing/Unity(C#)

[Unity] 화면 밖으로 오브젝트 이동 불가하게 만들기

hye3193 2024. 1. 1. 02:02

그냥 단순히 input을 입력받아 이동시켜주다 보면 카메라 밖으로 벗어나게 되는 경우가 생기는데, 이를 방지하기 위한 방법

 

Vector2 minBounds;
Vector2 maxBounds;

void InitBounds()
{
    Camera mainCamera = Camera.main;
    minBounds = mainCamera.ViewportToWorldPoint(new Vector2(0, 0));
    maxBounds = mainCamera.ViewportToWorldPoint(new Vector2(1, 1));
}

Vector2 형태의 minBounds와 maxBounds를 정의해 준 다음

InitBounds 함수에서 이를 초기화해준다 (Start 함수에서 실행)

 

main 카메라가 비추고 있는 곳의 좌측 하단과 우측 상단 부분을 각각 min, max로 잡는다

이런 식이기 때문

 

그럼 minBounds에는 카메라가 비추는 곳의 (0, 0) 지점의 좌표가 들어가고, maxBounds에는 카메라에 비추는 곳의 (1, 1) 지점의 좌표가 저장된다

 

void Move()
{
    Vector2 delta = rawInput * moveSpeed * Time.deltaTime;
    Vector2 newPos = new Vector2();
    newPos.x = Mathf.Clamp(transform.position.x + delta.x, minBounds.x, maxBounds.x);
    newPos.y = Mathf.Clamp(transform.position.y + delta.y, minBounds.y, maxBounds.y);
    transform.position = newPos;
}

그리고 Move 함수에서(OnMove 함수와 별개) 위와 같이 코드를 작성해 준다 (Update 함수에서 실행)

Mathf.Clamp를 사용할 때 (value, min값, max값)을 차례로 입력해주면 되는데, 그럼 자동으로 min과 max 사이의 값만을 반환한다

min보다 value값이 작으면 min값을, max보다 value값이 크면 max 값을 반환한다

 

 

+) 화면 밖으로 오브젝트의 절반이 튀어나가는 문제

위와 같이 코드를 짜게 되면 오브젝트의 절반 가량은 여전히 화면 밖으로 벗어나게 되는데, 이는 중심점이 오브젝트의 가운데에 있기 때문에 중심을 기준이 되어 그렇다

 

newPos.x = Mathf.Clamp(transform.position.x + delta.x, minBounds.x + paddingLeft, maxBounds.x - paddingRight);
newPos.y = Mathf.Clamp(transform.position.y + delta.y, minBounds.y + paddingBottom, maxBounds.y - paddingTop);

paddingLeft/Right/Top/Bottom을 각각 추가해 준 뒤,

Move 함수 내 Clamp 부분에 padding을 추가해주면 된다