이전에 메탈슬러그식 지형 이동 글을 쓸때
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에 빠삭하신 분이 있다면 댓글로 원인을 알려주시면 감사하겠습니다ㅎㅎ
'유니티 Unity' 카테고리의 다른 글
[Unity] 로프 플레이 구현 (2) | 2022.10.06 |
---|---|
[Unity] 메탈슬러그 식 지형 구현 및 캐릭터 이동 (0) | 2022.10.01 |
[Unity] 제이슨 JsonUtility 사용법 (0) | 2022.09.08 |
[Unity] PUN 동기화 (0) | 2022.09.08 |