티스토리 뷰

요즘 유니티글을 안올린 이유는 정확히 알지도 못하는데 괜히 게시글 쓰면 혹시나마 남에게 피해가 갈까봐 안올렸습니다. 그런데 생각해보니 애초에 개인 공부목적으로 글을 쓰는 것이니 이런 걱정을 왜 해야하나 싶더라구요. 그래서 다시 열심히 써볼려고 합니다. 화이팅 ~


현재 점프는 상당히 부자연 스럽습니다. 빠르게 연타하면 부들 부들 떨리는 모습이 보이기도 하죠. 보통 "점프"라는 개념은 그렇지 않죠. 떨리는 모습이 보이는 이유는 점프 입력 후 Rigidbody 2D에 의해 중력이 작용하기 때문입니다.

 

<출처: 금성 출판사>

점프는 도약시 힘이가해지며 점프를 하고있는 동안에는 점프를 할 수 없습니다. 지금 플레이어 게임 오브젝트처럼 점프를 한 순간에도 점프가 입력되 부들 부들 떨리는건 매우 부자연 스럽다고 할 수 있습니다.

정리를 해보자면,

점프는 도약시 힘이 가해짐 -> 점프 중에는 점프가 다시 되면 안됨 -> 땅에 닿으면 점프중이 아니므로 다시 점프 가능.

위와 같은 추론을 토대로 점프 기능을 구현해봅시다.

 

캐릭터 게임 오브젝트를 움직이게 해주는 C# 스크립트에 <m_fJumpForce> 멤버변수를 추가하였습니다. 이유는 간단합니다. 앞선 유니티 게시글에서 독수리와 여우의 속도를 다르게 적용하기 위해 <m_fSpeed> 멤버변수를 추가했었죠.

유니티에서 각각의 게임 오브젝트마다 변수의 값을 지정할 수 있습니다. 점프역시 움직이는 속도를 바꾸는 것처럼 멤버변수를 통해서 유니티로 바꿀 수 있게 하겠습니다.

 

캐릭터가 위쪽 방향키(UpArrow)를 사용해서 위로 이동하는 키를 바꾸었습니다. 잘 읽어보면 <Rigidbody2D>의 기능을 활용하는 것을 볼 수 있습니다.

function AddForce (force : Vector3, mode : ForceMode = ForceMode.Force) : void

Rigidbody2D의 AddForce 는 Rigidbody에 힘을 추가하는 함수입니다. Vector3 방향으로 힘을 추가할 수 있죠. 현재 사진에 보이는 코드로는 Vector3.up 방향으로 m_fJumpForce 만큼의 힘을 추가한다는 걸 알 수 있습니다.

정말 쉽게 설명하면 Vector3.up 방향으로 m_fJumpForce 만큼의 힘으로 중력을 가한다고 생각하시면 됩니다.

 

유니티에서 m_fJumpForce 의 값을 15 주었을 때 결과입니다. 뭔가 이상하죠? 처음 꿈틀 거릴때는 한 번 누른 것이고 위로 쭈욱 올라가는 것은 계속 누른 것입니다.

즉, 현재는 점프가 여러번 입력이 가능하다는 것입니다. 이걸 1번으로 고쳐야합니다. 이걸 한 번으로 바꾸는 방법이 어떤것이 있을까요?

 

<출처: 금성 출판사>

강의 초반에 땅에 닿으면 점프중이 아니므로 점프가 다시 가능하다고 했습니다. 그러므로 땋에 닿을때만 점프가 입력되게 하면 점프가 1번만 되겠죠?

 

bool 형 멤버변수 m_bJump를 추가했습니다. 그리고 새로운 함수 OnCollisionEnter2D를 추가하였습니다.

OnCollisionEnter2D는,

Collider2D가 추가된(상속된) 오브젝트가 다른 Collider2D에 충돌했을 때 호출됩니다. 즉, 위에 추가한 OnCollisionEnter2D 함수는 다른 Collider2D가 추가된 오브젝트와 충돌했을 때 m_bJump에 false를 대입합니다.

 

원래 점프(?)키에 해당하던 코드에 조건을 추가하였습니다. m_bJump 변수가 true가 아니라면 가능하게.

그리고 m_bJump 변수에 true를 대입합니다. 그러면 공중으로 점프를 하게되고 m_bJump 변수가 true기 때문에 점프키를 더 입력할 수 없습니다. 땅에 닿는다면 Collider2D를 가진 오브젝트와 충돌하게 되므로 m_bJump 변수는 false가 됩니다. 그러므로 다시 점프할 수 있죠.

 

m_fJumpForce 변수의 값을 200 주었을 때 화면입니다. 이제 점프가 잘 되는군요. 

댓글