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

더 공부할 자료 - 개발 능력 다양화를 위한 학습의 필요성

유니티 엔진의 대안으로서, 인디 개발자들에게 선풍적인 인기를 끌고 있는 엔진이 바로 고도 엔진입니다. 혹시 고도 엔진을 배워 보려고 하신다면, 다음의 온라인 강의를 체크해 보시기 바랍니다.

초보자를 위한 고도엔진 게임 개발 입문