Unity의 OnCollisionEnter() 함수는 MonoBehaviour 클래스의 중요한 부분으로, 두 콜라이더 간에 충돌이 감지되면 Unity에서 자동으로 호출합니다. 손상 적용 또는 음향 효과 재생과 같은 충돌 이벤트를 처리하는 데 사용됩니다.

다음은 OnCollisionEnter() 함수로 작업할 때 염두에 두어야 할 몇 가지 주요 사항입니다.

OnCollisionEnter() 함수를 사용하려면 GameObjects에 Collider 컴포넌트가 연결되어 있어야 하며 그 중 적어도 하나에는 Rigidbody 컴포넌트도 연결되어 있어야 합니다. 그렇지 않으면 충돌이 감지되지 않습니다.

public class Example : MonoBehaviour
{
    void Start()
    {
        // 개체에 Collider 컴포넌트 추가
        gameObject.AddComponent<SphereCollider>();

        // 개체에 Rigidbody 컴포넌트 추가
        gameObject.AddComponent<Rigidbody>();
    }
}

OnCollisionEnter() 함수는 Collision(충돌) 유형의 매개변수를 사용합니다. 여기에는 두 충돌체의 접촉점 및 상대 속도와 같은 충돌에 대한 정보가 포함됩니다.

public class Example : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {

        Vector3 pointOfContact = collision.contacts[0].point;

        Vector3 relativeVelocity = collision.relativeVelocity;        
    }
}

OnCollisionEnter() 함수는 충돌이 처음 발생할 때 한 번 호출되며 충돌체가 더 이상 접촉하지 않을 때까지 다시 호출되지 않습니다.

public class Example : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {

        Debug.Log("Collision detected!");
    }
}

collider가 연결된 GameObject에 액세스하기 위해 collision.gameObject를 사용한 다음 GetComponent() 함수를 사용하여 Transform, Rigidbody, 그리고 GameObject의 다른 컴포넌트에 액세스할 수 있습니다. .

public class Example : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Transform otherTransform = collision.gameObject.GetComponent<Transform>();
        Example otherScript = collision.gameObject.GetComponent<Example>();
    }
}

collider가 연결된 GameObject의 Collider 컴포넌트에 액세스하기 위해 collision.collider를 사용할 수 있으며 그 다음 isTrigger 속성을 확인하여 이것이 트리거 충돌기인지 물리 충돌기인지 확인할 수 있습니다. 이것은 충돌 유형을 결정하고 각 유형에 대해 서로 다른 동작을 적용하는 데 사용할 수 있습니다.

public class Example : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        // 다른 개체의 Collider 컴포넌트에 액세스
        Collider otherCollider = collision.collider;
        // 콜라이더가 트리거 콜라이더인지 확인
        if(otherCollider.isTrigger)
        {
            Debug.Log("트리거 콜라이더와의 충돌이 감지되었습니다!");
        }
        else
        {
            Debug.Log("물리 충돌체와의 충돌이 감지되었습니다!");
        }
    }
}

collision.relativeVelocity를 사용하여 접촉 지점에서 두 충돌체의 상대 속도에 액세스할 수 있습니다. 이는 충돌의 힘을 결정하고 소리를 재생하는 것과 같이 충돌의 힘에 따라 다른 동작을 적용하는 데 사용할 수 있습니다.

public class Example : MonoBehaviour
{
    public AudioClip[] collisionSounds;

    void OnCollisionEnter(Collision collision)
    {
        // 충돌 대상의 속도에 액세스
        Vector3 relativeVelocity = collision.relativeVelocity;
        // 상대 속도를 사용하여 충돌의 힘을 결정.
        float collisionForce = relativeVelocity.magnitude;
        // 충돌력에 따른 다양한 동작 적용
        if(collisionForce > 10)
        {
            // 음향 효과 재생
            AudioSource.PlayClipAtPoint(collisionSounds[0], transform.position);
            // 파티클 생성
            Instantiate(particleEffect, collision.contacts[0].point, Quaternion.identity);
            // 피해 적용
            GetComponent<Health>().TakeDamage(collisionForce);
        }
    }
}

또한 충돌의 접점과 노멀에 대한 정보를 포함하는 ContactPoint 구조체의 배열에 액세스하기 위해 collision.contacts 를 사용할 수 있습니다. 이는 충돌 방향을 결정하고 특정 방향으로 힘이나 임펄스를 적용하는 데 사용 가능합니다.

public class Example : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        // 접촉 지점에 엑세스
        Vector3 pointOfContact = collision.contacts[0].point;
        // 충돌의 노멀 값에 엑세스
        Vector3 collisionNormal = collision.contacts[0].normal;
        // 정보를 사용하여 충돌 처리
        GetComponent<Rigidbody>().AddForce(collisionNormal * 10, ForceMode.Impulse);
    }
}

Unity의 OnCollisionEnter() 함수는 게임에서 충돌을 감지하고 처리하기 위한 강력한 도구이며, 이를 사용하여 사실적이고 반응이 빠른 충돌 동작을 만들 수 있습니다. 활용법을 잘 익혀 두시기 바랍니다.