본문 바로가기

Programming/유니티

유니티 (Unity) Rigidbody2d 게임 카메라 이동

ㄴ유니티(Unity) 2d 물리 게임 이동충돌
ㄴ유니티(Unity) META-INF/kotlinx_coroutines_core.version
ㄴ유니티(Unity) Rigidbody2d의 Addforce와 밀림방지
ㄴ유니티(Unity) - 아이폰, 안드로이드 권한 세팅 화면으로 이동하기
ㄴ유니티 (Unity) - Button의 OnClick Listener 사용법
ㄴ유니티(Unity) 프로젝트 점프게임 만들기 : [7] 플랫폼 생성

카메라 이동

넓은 공간을 사용하는 게임을 만들 때 카메라를 이동하여 맵의 이곳저곳을 살펴봐야 하는 경우가 생깁니다. 이때 드래그로 카메라를 움직이는 기능은 필수요소가 됩니다. 자주 사용되지만 다시 만들기 귀찮은 카메라 이동 로직을 공유합니다.

----

----

단순한 카메라 움직임

단순하게 카메라만 움직이기 위해서는 프레임마다 드래그 한 위치 값을 카메라에 대입시켜 주면 됩니다. 

[SerializeField] Transform camTransform;
void Update () {
	camTransform.position = Input.mousePosition;
}

하지만 카메라의 움직임이 부드럽지 못하고 순간이동하는 어색한 연출을 하게 됩니다.

그렇기 때문에 카메라가 터치한 위치로 바로 이동하는 것이 아닌 드래그 한 만큼만 이동하도록 해야 자연스러운 움직임을 보입니다.

Vector3 dragPrePos;
Vector3 camPrePos;
bool isPressed = false;

void Update()
{
	if (Input.GetMouseButtonDown(0)){
		dragPrePos = Input.mousePosition;
		camPrePos = camTransform.position;
		isPressed = true;
	}
	if (Input.GetMouseButtonUp(0)){
		isPressed = false;
	}

	if (isPressed){
		var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z);
                camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
	}
}

이렇게 하면 드래그 한 만큼만 카메라가 이동하기 때문에 화면이 자연스럽게 움직이게 됩니다. 

물리를 적용한 오브젝트를 사용 시

만약 오브젝트에 Rigidbody를 사용하여 FixedUpdate를 통해 이동을 갱신하고 있는 게임이라면 Update와 갱신 싱크가 맞지 않아 오브젝트가 렉 걸린 것처럼 움직이는 것을 볼 수 있습니다. 이런 때에는 Input에 대한 정보를 Update 함수에서 처리하고 위치 갱신은 FixedUpdate에서 처리해 주면 됩니다.

void Update()
{
	if (Input.GetMouseButtonDown(0)){
		dragPrePos = Input.mousePosition;
		camPrePos = camTransform.position;
		isPressed = true;
	}
	if (Input.GetMouseButtonUp(0)){
		isPressed = false;
	}
}

void FixedUpdate ()
{
	if (isPressed){
		var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z);
                camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
	}
}

드래그 속도 조절

여기까지만 해도 무난하게 카메라 이동을 연출할 수 있지만 조금 더 화면을 천천히 움직이고 싶다면 movePos 값에 offset 값을 더해주면 됩니다.

if (isPressed)
{
    var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z) * Time.deltaTime * 0.5f;
    camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
}

Time.deltaTime 값을 곱해주고 여기에 적절한 수치를 곱해주면 됩니다. 저는 0.5f를 곱해주었습니다.