1 minute read

카메라가 보는 방향을 기준으로 이동하기

스크린샷 2024-05-28 215130
3인칭 게임으로 만드니까 카메라가 보는 방향을 기준으로 wasd를 누르면 이동하고 싶었다.
그래서 고민을 거듭하며 방법을 찾다가 우선 카메라의 방향을 받아왔다.
카메라의 방향은 Vector3 이고, x, z 가 Vector2로 전환 될 때 중요한 방향이다.
그렇기에 이 두가지를 transform.forward, transform.right로 받아서 여기에 입력받은 wasd에 해당하는 context 값을 조합해 이동을 구현하였다.
하는 중에 계산 순서나 특히 어떤 값에 어떤 값을 곱해야할지 고민을 많이 했는데, 중요한 점은 context로 받은 값은 bool값 마냥 앞으로 갈지 옆으로 갈지를 정해주기만 하는 값이지 이 값 자체가 중요한 것이 아니라는 것이었다.
이런 생각을 하고 나자 어떻게 해야할지 생각이 났고, forward의 값은 context의 y값을, right의 값은 context의 x값을 곱해주기만 하여 어느 값을 쓸 것인지 선택만 해주고, 최종 적으로 x,z값을 x,y값으로 치환해주기만 하면 되는 것이었다.

public void OnMove(InputAction.CallbackContext context)
{
	_moveVector = context.ReadValue<Vector2>();

	Vector3 cameraForward = Camera.main.transform.forward * _moveVector.y;
	Vector3 cameraRight = Camera.main.transform.right * _moveVector.x;

	cameraForward.Normalize();
	cameraRight.Normalize();

	float dirY = cameraForward.z + cameraRight.z;
	float dirX = cameraForward.x + cameraRight.x;

	_moveVector = new Vector2(dirX, dirY).normalized * _walkSpeed;

	if (_moveVector != Vector2.zero)
	{
		float rotY = Mathf.Atan2(_moveVector.x, _moveVector.y) * Mathf.Rad2Deg; ;
		transform.rotation = Quaternion.Euler(0, rotY, 0);
	}
}

UGUI

Canvas에 보면 Canvas Scaler에 스케일 조절이 되는데 이를 Scale With Screen Size로 바꿔줘야 다양한 해상도에 적용이 된다.
밑에 Reference는 기준 (개발중인) 화면이다.
이걸 안하면 모든 플레이어는 화면이 다르기때문에 게임이 정상 작동 될리가 없다.
스크린샷 2024-05-29 162211
밑에 Screen Match Mode는 해상도가 바뀌면 맞춰줄 방법이다.
기본세팅은 가로또는 세로 맞추기로 현재는 가로로 되어있다.
Expand, Shrink는 비율을 맞추는데 화면에 긴 방향에 따라 긴쪽을 늘리거나/짧은 쪽을 줄여서 맞춘다.
그때그때 맞는 방법을 해보면서 찾아서 쓰면 된다.

이렇게 비율을 맞추고 나면, 앵커랑 피봇도 맞춰야지 위치가 이상해지지 않는다.