[Unity] 3D 퍼즐 플랫포머 게임 개발-2

Connected Brain·2025년 3월 17일

Unity 3D를 활용한 Dungeon 만들기

필수요소

  1. 퍼즐 디자인
  2. 플레이어 캐릭터 및 컨트롤
  3. 퍼즐 해결 시스템
  4. 장애물 및 트랩
  5. 목표 지점
  6. 게임 진행 상태 및 저장
  7. 사운드 및 음악

플레이어 캐릭터 및 컨트롤

트러블 슈팅

  • 플레이어의 회전이 반영되어 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();
    }
    
}

0개의 댓글