Unity 3D를 활용한 Dungeon 만들기
필수요소
- 퍼즐 디자인
- 플레이어 캐릭터 및 컨트롤
- 퍼즐 해결 시스템
- 장애물 및 트랩
- 목표 지점
- 게임 진행 상태 및 저장
- 사운드 및 음악
플레이어 캐릭터 및 컨트롤
트러블 슈팅
- 플레이어의 회전이 반영되어 transform.forward가 계산되어야 하는데 이것이 현재 플레이어의 회전과 일치하지 않는 문제가 발생하였다.
- 추측하기론 현재 카메라 등의 움직임은 LateUpdate에서 그리고 플레이어의 움직임은 FixedUpdate에서 갱신하는데 이 과정에서 transform.forward이 회전에 따라 갱신되지 않는 상황이 발생하는 것으로 보았다.
- 이를 해소하기 위해 같은 역할을 하는 프로퍼티를 따로 작성하였다.
/// <summary>
/// 플레이어의 정면 방향을 반환
/// </summary>
public Vector3 Forward
{
get
{
float curDegree = camRotY;
float x = Mathf.Sin(curDegree * Mathf.Deg2Rad);
float z = Mathf.Cos(curDegree * Mathf.Deg2Rad);
return new Vector3(x, 0, z).normalized;
}
}
/// <summary>
/// 플레이어의 오른쪽 90도 방향을 반환
/// </summary>
public Vector3 Right
{
get
{
float curDegree = camRotY - 90f;
float x = Mathf.Sin(curDegree * Mathf.Deg2Rad);
float z = Mathf.Cos(curDegree * Mathf.Deg2Rad);
return new Vector3(x, 0, z).normalized;
}
}
- 마우스 입력에 따른 회전을 처리하는 camRotY 변수를 이용해 정확한 forward와 right 방향을 계산하여 해당 벡터를 활용해 이동을 처리하여 앞선 문제를 해결하였다. 다만 이는 임시 방편일 것 같아 근본적인 원인을 알아볼 필요가 있을 것 같다. 이를 토대로 작성한 이동 함수는 아래와 같다.
void Move(Vector2 movementInput)
{
//움직일 수 없는 상태에서는 움직이지 않도록 함
if (!canMove) return;
//입력이 없으면 속도를 0이 되도록 함
if (movementInput == Vector2.zero)
{
rigidbody.velocity = new Vector3(0f, rigidbody.velocity.y, 0f);
playerSFXController.StopWalkSound();
}
else
{
//마우스 입력에 따라 변경된 카메라 회전 값에 따라 Forward와 Right를 구한 방향으로 이동 방향을 구함
Vector3 moveVelocity = (Forward * movementInput.y + Right * -movementInput.x).normalized * playerData.Speed;
moveVelocity.y = rigidbody.velocity.y;
//해당 방향으로 이동
rigidbody.velocity = moveVelocity;
playerSFXController.PlayWalkSound();
}
}