지난 시간에는 고양이가 구름을 등반하여 깃발에 도착하는 것과 화면전환까지 마쳐서 게임을 다 만든 줄 알았다... 하지만 치명적인 버그가 발생하고 있었다는 것을 알았다.
[C# / Unity 를 이용한 게임 만들기] 고양이의 구름등반 2탄!
- 버그의 종류
a. 점프하는 도중에도 계속 점프할 수 있다.
b. 플레이어가 화면 밖으로 나가도 끝없이 떨어진다.
점프 중에 점프가 가능한 상황이다... 무한으로 점프를 해서 도착지점까지 이동하는게 가능하다.
하지만 이렇게 하면 구름을 구현한 의미가 없어지게 된다..
현재 PlayerController 스크립트에서 Spacebar를 누르면 위쪽 방향의 힘을 가하기 때문에 몇 번이고 더 점프할 수 있는 상황이다. 이를 막으려변 플레이어가 점프중인지 감지해서 점프 중일때는 힘이 미치지 않도록 해야한다.
그럼 이를 어떻게 접근해야 하는가?
플레이어가 점프 중인지 아는 방법은
다음과 같은 방법들이 존재한다. 여기서는 'Y축 방향의 속도가 0(정지하고 있다) 일 때만 점프한다'를 구현하도록 해보자!
<기존코드>
if (Input.GetKeyDown(KeyCode.Space)) // 스페이스바가 입력된 것만 인식한다.
{
this.rigi2D.AddForce(transform.up * this.jumpForce);
}
<변경 후 코드>
'Y축 방향의 속도가 0(정지하고 있다) 일 때만 점프한다' 에서 Y축 방향의 속도가 0 일때! 를 조건에 넣으면 된다.
if (Input.GetKeyDown(KeyCode.Space) && this.rigid2D.velocity.y == 0)
{
this.rigi2D.AddForce(transform.up * this.jumpForce);
}
PlayerController의 점프 조건문에 추가한 부분을 보면
플레이어 속도는 Rigidbody2D 클래스의 velocity 변수로 추출할 수 있다! (*매우중요)
** 이제 Spacebar가 눌려도 Y축 방향 속도가 0일때만 위쪽 방향으로 힘이 가해집니다. (버그해결!)
플레이어가 화면 밖으로 나가도 끝없이 떨어집니다. 이것을 막으려면 플레이어의 Y 좌표가 -10 미만이면 씬의 처음으로 돌아가도록 만들겁니다. 씬의 처음으로 돌아가려면 PlayerController 의 Update 메서드의 스크립트를 수정해야합니다.
<추가한 코드>
if (transform.position.y < -10) {
SceneManeger.LoadScene("GameScene");
}
이 스크립트에서는 플레이어의 Y좌표가 -10 미만이면 현재 씬인 GameScene을 로드합니다.
이처럼 LoadScene 메서드를 사용해 현재 씬을 로드하면 시작 지점으로 돌아갈 수도 있다!(*매우중요)
최종적으로 만들어진 고양이 게임의 버그또한 해결하는 시간을 가졌다.
2D 게임을 만드는 일에는 언제나 좌표와 관련하여 해결할 수 있는 방법이 있다는 것을 깨닫게 된 시간이었다.
출처 : 그림으로 이해하고 만들면서 익히는 유니티 교과서[개정5판] - 기타무라 마나미