유니티 Unity

[Unity] 지면과 오브젝트 사이의 Collision 물리

에헤이머꼬 2022. 10. 7. 13:35
반응형

 

이전에 메탈슬러그식 지형 이동 글을 쓸때

OnColliderEnter, OnColliderExit 함수와

관련해서 신기한 동작이 있어서

마지막에 이에 대한 글도 쓰겠다고 했었습니다.

 

[Unity] 메탈슬러그 식 지형 구현 및 캐릭터 이동 (tistory.com)

 

[Unity] 메탈슬러그 식 지형 구현 및 캐릭터 이동

메탈슬러그 식이라고 표현했지만 사실 비슷한 류의 게임들은 많이 있습니다. 예를 들면 메이플도 그와 비슷한 류가 되겠죠. 핵심은 하나입니다. "떨어질 때는 지형을 인식하지만 올라갈 때는 통

int-main.tistory.com

 

저는 캐릭터가 공중에 있을 때

캐릭터의 Turn 동작을 통제하고 싶었고

그래서 공중에 있을 때와 아닐 때를 구분하는

OnGround라는 변수를 만들었습니다.

 

그리고 심플하게 지면 오브젝트와

OnColliderEnter와 OnCollderExit로

OnGround를 갱신할려고 했습니다.

 

조건은 이러합니다.

Rigidbody2D(Bodytype은 Dynamic) 와 CircleCollider2D 컴포넌트를 가진 오브젝트가

BoxCollider2D 만을 가지고 있는 콜라이더 위를 걸을 때입니다.

영상은 Enter와 Exit를 디버그 로그로 찍은겁니다

 

 

분명히 지면과 붙은채 좌우만 이동하는데도

OnCollisionEnter와 OnColliderExit가

번갈아 발생하는 것을 볼 수 있습니다

다만 저는 RigidBody의 Velocity에

값을 대입해서 움직이는 방식으로 했는데

 

private void Walk(ref float horizontalInput)
{
    RenewVelocity(RefreshType.RefreshX, horizontalInput * _walkSpeed);
}
private void Run(ref float horizontalInput)
{
    RenewVelocity(RefreshType.RefreshX, horizontalInput * _runSpeed);
}

private enum RefreshType { RefreshX, RefreshY }
private Vector2 velocity;
private void RenewVelocity(RefreshType refreshType, float value) // velocity의 x 혹은 y 변화는 이 함수만 담당
{
    velocity = _rigidbody2D.velocity;
    switch (refreshType)
    {
        case RefreshType.RefreshX:
            velocity.x = value;
            break;
        case RefreshType.RefreshY:
            velocity.y = value;
            break;
        default:
            break;
    }
    _rigidbody2D.velocity = velocity;
}

 

신기한 것은 이 방식이 아닌

Translate로 이동하는 식으로 로직을 짜면

위와 같은 Enter, Exit 문제가 생기지 않는다는 것입니다.

 

private void Walk(ref float horizontalInput)
{
    transform.Translate(horizontalInput * _walkSpeed * Vector2.right * Time.deltaTime);
}
private void Run(ref float horizontalInput)
{
    transform.Translate(horizontalInput * _runSpeed * Vector2.right * Time.deltaTime);
}

 

rigidbody의 값을 건들이는 과정에서

중력에 의한 파고듬이 발생해서 그런게 아닌가....

뇌피셜로 예상할 뿐입니다.

 

유니티 Physic에 빠삭하신 분이 있다면 댓글로 원인을 알려주시면 감사하겠습니다ㅎㅎ

반응형