강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

까만돌님의 프로필 이미지
까만돌

작성한 질문수

절대강좌 유니티6 - 네트워크 게임 개발 마스터클래스 (Part3) : Netcode로 개발하는 2D RPG

Relay API 활용 (2/3)

Warrior가 Gobin에게 달려가 충돌하면 Gobin이 뒤로 튀겨나가는 현상??

작성

·

22

0

Warrior가 Gobin에게 달려가 충돌하면 Gobin이 뒤로 튀겨나가는 현상이 있습니다.
ChaseState 상태에서는 뒤로 튀겨나가도 다시 앞으로 가는데 Warrior가 계속 밀다가 사망 상태가 되면 Gobin은 IdleState가 되면서 계속해서 뒤로 밀리는 현상이 있습니다.

아래와 같이 IdleState 상태로 진입하면 enemy.StopMoving(); 를 추가 해서 멈추도록 했는데

public void Enter(Enemy enemy)
{
    Logger.Log("Idle 진입");
    enemy.animator.SetBool(Enemy.hashIsRun, false);
    // Idle 상태 진입 시 물리 엔진으로부터 발생하는 이동/힘을 즉시 차단합니다.
    // Enemy.StopMoving()을 호출하면 리지드바디 속도를 0으로 만들어 밀림을 방지합니다.
    enemy.StopMoving();
}


이 것도다 정확한 방법을 알 수 있을까요?

 

답변 2

0

이재현님의 프로필 이미지
이재현
지식공유자

안녕하세요.

물리 충돌이 발생하는 Collision 에서는 막을 수 있는 방법은 mass와 drag 값을 순간적(충돌 순간)에 충돌 당하는 쪽에 크게(Infinity) 설정해서 밀리지 않도록 할 수 있습니다. 하지만 이 방법도 완전한 해결책은 아니구요. linarVeclocity 역시 0으로 처리하셔야 하면 효과가 있습니다. 아래 코드는 테스트한 코드는 아닙니다만, 이런식으로 처리하시면 밀리는 현상은 현저히 줄일수 있으실 겁니다.

private void OnCollisionEnter2D(Collision2D other)
{
    if (other.collider.CompareTag("Player"))
    {
        this.gameObject.GetComponent<Rigidbody2D>().mass = float.MaxValue;
        this.gameObject.GetComponent<Rigidbody2D>().linearVelocity = Vector2.zero;
    }
}

private void OnCollisionExit2D(Collision2D other)
{
    if (other.collider.CompareTag("Player"))
    {
        this.gameObject.GetComponent<Rigidbody2D>().mass = 1f; // 원래 질량으로 복원
        this.gameObject.GetComponent<Rigidbody2D>().linearVelocity = Vector2.zero;
    }        
}

 

0

안녕하세요, 인프런 AI 인턴입니다. 까만돌님.

질문해주신 “Warrior가 Gobin에게 달려가 충돌하면 Gobin이 뒤로 튀겨나가는 현상”에 대해 설명드리겠습니다. Unity에서 물리 기반으로 객체가 서로 충돌할 때 발생하는 물리 반응은 Rigidbody 컴포넌트 및 물리적 힘의 영향을 받습니다. Gobin이 뒤로 밀리는 현상은 객체 사이의 물리적 상호작용에서 일반적으로 발생할 수 있습니다.

문제 설명 및 해결 방안

문제 원인:

  1. 물리적 상호작용: 두 객체가 충돌하면서 생성된 힘이 Gobin을 뒤로 밀어내게 됩니다.
  2. 리지드바디 설정: Gobin의 Rigidbody 설정에 따라 관성이나 힘의 적용이 과도하게 적용될 수 있습니다.

해결 방법:

  1. Rigidbody를 사용한 속도 제어:

    • enemy.StopMoving();처럼 리지드바디의 속도를 0으로 설정하는 방법은 적절하며, 이를 통해 이동을 제어할 수 있습니다. 만약 이 방법이 이미 적용되고 있음에도 불구하고 문제가 해결되지 않는다면, 힘이나 이동 속도를 추가로 제어할 필요가 있습니다.
  2. 물리적 충돌 민감도 조정:

    • RigidbodyMassDrag 설정값을 조정하여 충돌 시 발생하는 힘의 크기를 조정할 수 있습니다. 적절한 값으로 설정하면 불필요한 밀림 현상을 줄일 수 있습니다.
  3. Physics Material 설정:

    • 두 충돌 객체에 부여된 Physics Material의 Bounciness 또는 Friction 값을 조절하여 충돌 시 반동이나 마찰을 줄일 수 있습니다.

기존 커뮤니티에서도 물리 충돌과 관련한 해결 방법이 아주 다양하게 논의되고 있으므로, 다음 링크를 참조하셔서 더 다양한 해결 방안을 연구해 볼 수 있습니다:
- 유니티 물리적 충돌 및 반응 최적화 방법

이 문제와 유사한 다른 사례들도 함께 확인하시면, 물리적 상호작용을 더 잘 이해하고 적용할 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

까만돌님의 프로필 이미지
까만돌

작성한 질문수

질문하기