Unity Physics 충돌 관련

용준·2023년 9월 2일
0

Unity

목록 보기
6/19

오브젝트가 오브젝트를 계속 밀어내는 현상

  • 두 오브젝트(추적자, 목적지)에 Rigidbody 컴포넌트를 입혔을 경우
    서로 부딪힐 때 충돌이 발생하여 추적자가 목적지의 위치를 밀어내게 됩니다.
    이로 인해 목적지의 position은 계속 변경되고 추적자는 반복하여 목적지를 뒤쫓습니다.
  • 일정 거리차에 도달했을 경우 멈추게 하지 않는다면 Rigidbody와 NavMeshAgent 두 컴포넌트의 공통적인 문제가 발생하는데 아래 두 가지 해결 방법이 있습니다.

해결방법 1

코드로 두 오브젝트의 일정 거리를 구해서 인접했을 경우 NavMesh의 isStopped 함수로 추적을 멈추게 할 수 있습니다.

해결방법 2

Rigidbody의 Constraints - Freeze Position의 X, Z 값을 고정시키면 외부에 의해 밀려나지 않습니다.


오브젝트 충돌 시 화면이 기울어지는 현상

코드 혹은 컴포넌트 설정을 통해 해결할 수 있습니다.

해결방법 1 (코드로 조절)

public class Player : MonoBehaviour
{

Rigidbody rigid;

    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
    }
    
    private void FixedUpdate()
    {
    	FreezeRotation();
    }
    
    void FreezeRotation()
    {
        rigid.freezeRotation = true;
    }
}

해결방법 2

Constraints - Freeze Rotation의 X, Y, Z값을 모두 체크하면 됩니다.


오브젝트 충돌 시 한 쪽이 밀리는 현상

  • 충돌체에 의해 이동시키는 힘이 반대로 발산됩니다.

해결방법 1

Rigidbody rigid;

    void Start()
    {
        rigid = GetComponent<Rigidbody>();
    }
    
    private void FixedUpdate()
    {
        FreezeVelocity();
    }
    
    void FreezeVelocity()
    {
        rigid.velocity = Vector3.zero;
        rigid.angularVelocity = Vector3.zero;
    }
  • Rigidbody의 velocity, angularVelocity의 값을 0으로 고정시키면 됩니다.

Rigidbody body type


Rigidbody 충돌 발생조건

  • 충돌은 두 오브젝트 모두 Collider가 있어야 하고 둘 중 하나 이상 Rigidbody 필요합니다.
  • 두 오브젝트 중 하나의 오브젝트만 움직이고 싶으면 움직이는 오브젝트가 Rigidbody 필요합니다.

함께 참고하면 좋은 글 (1) (2) (3) (4) (5)


0개의 댓글