Unity의 OnCollisionEnter, OnTriggerEnter 종료

죄송합니다.

왠지 충돌로 히트하는 기사 대체로 잘못되어 있으므로, 자신을 위해서 검증해 남겨 둡니다.

검증 내용·결과는 마지막으로 돌립니다. 여가 시간은 봐.

결론


  • 충돌 검지에는 RigidBody가 필요하지만, 어느 쪽인지에 대해서 하면 된다.
    누구인가, 「둘 다 RigidBody가 필요」라고 말하고 있는 사람은.
  • 충돌 감지 중에 움직이는지 여부에 관계없이 두 콜백이 모두 호출됩니다.
  • 둘 다 isTrigger가 false이면 OnCollisionEnter, 그렇지 않으면 OnTriggerEnter가 호출됩니다.
  • 가능한 한 움직이는 사람에게 RigidBody를 추가하십시오 (결과 표의 참고 참조).

    그런데, Collider는 충돌을 검지하기 위한 컴퍼넌트이지만, RigidBody는 움직이기 위한 컴퍼넌트이기 때문에, 스테이지의 「움직이지 않는 벽」등에 사용하는 것은 추천하지 않는다. 다만 충돌 검지에는 RigidBody가 필요하다.

    추가



    충돌 판정은 Collider의 공간에 RigidBody가 포함된 경우에 호출된다. 오브젝트의 속도가 너무 빠르고 Collider 공간에 들어가는 프레임이 없는 경우, 불려 가지 않는다.

    예를 들면 t프레임으로 collider의 직전까지 와 있던 오브젝트가 t+1프레임으로 Collider보다 안쪽으로 이동했을 경우, 충돌은 발생하지 않는다.

    총탄과 같은 속도의 오브젝트의 경우, 1프레임의 이동량분의 Raycast로 근사하는 것으로만 충돌 검지가 가능하고, 자작하는 것이 빠르다.

    검증 환경



    Unity2020.3.1f1
    RigidBody의 CollisionDetection은 ContinuousSpeculative.

    코드



    ColliderTest.cs
    using UnityEngine;
    
    public class ColliderTest : MonoBehaviour
    {
        private void OnTriggerEnter(Collider other)
        {
            Debug.Log("OnTriggerEnterが起きたよ", gameObject);
        }
        private void OnCollisionEnter(Collision collision)
        {
            Debug.Log("OnCollisionEnterが起きたよ", gameObject);
        }
    }
    

    장면





    이 표의 전제


  • 여기서는 2개의 오브젝트 A, B로 한다.
  • 움직이는 객체는 한쪽이거나 둘 다 있습니다. 둘 다 움직이지 않는 경우 충돌하지 않는다.
  • Collider는 당연하지만, 둘 다 붙어 있다고 한다.
  • RigidBody 열의 0은 Rididbody 있어, ×는 없음.
  • isTrigger 열은 0은 isTrigger=true, ×는 false.
  • 콜백 열은 OnTriggerEnter가 호출되는 경우 T, OnCollisionEnter가 호출되는 경우 C, 둘 다 호출되지 않는 경우 x.

  • 결과




    움직이는 물체
    RigidBody(A)
    RigidBody(B)
    isTrigger(A)
    isTrigger(B)
    콜백(A)
    콜백(B)


    A
    ×
    ×
    ×
    ×
    ×
    ×

    A
    ×
    ×

    ×
    ×
    ×

    A
    ×
    ×
    ×

    ×
    ×

    A
    ×
    ×


    ×
    ×

    A

    ×
    ×
    ×
    C
    C

    A

    ×

    ×
    T
    T

    A

    ×
    ×

    T
    T

    A

    ×


    T
    T

    A
    ×

    ×
    ×
    C△
    C△

    A
    ×


    ×
    T
    T

    A
    ×

    ×

    T
    T

    A
    ×



    T
    T

    A


    ×
    ×
    C
    C

    A



    ×
    T
    T

    A


    ×

    T
    T

    A




    T
    T

    A, B
    ×
    ×
    ×
    ×
    ×
    ×

    A, B
    ×
    ×

    ×
    ×
    ×

    A, B
    ×
    ×
    ×

    ×
    ×

    A, B
    ×
    ×


    ×
    ×

    A, B

    ×
    ×
    ×
    C
    C

    A, B

    ×

    ×
    T
    T

    A, B

    ×
    ×

    T
    T

    A, B

    ×


    T
    T

    A, B
    ×

    ×
    ×
    C
    C

    A, B
    ×


    ×
    T
    T

    A, B
    ×

    ×

    T
    T

    A, B
    ×



    T
    T

    A, B


    ×
    ×
    C
    C

    A, B



    ×
    T
    T

    A, B


    ×

    T
    T

    A, B




    T
    T


    주) 결과 중 △는 매우 드물게 콜백이 확인되었다. 사용해서는 안됩니다.

    좋은 웹페이지 즐겨찾기