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() 함수는 게임에서 충돌을 감지하고 처리하기 위한 강력한 도구이며, 이를 사용하여 사실적이고 반응이 빠른 충돌 동작을 만들 수 있습니다. 활용법을 잘 익혀 두시기 바랍니다.
더 공부할 자료 - 개발 능력 다양화를 위한 학습의 필요성
유니티 엔진의 대안으로서, 인디 개발자들에게 선풍적인 인기를 끌고 있는 엔진이 바로 고도 엔진입니다. 혹시 고도 엔진을 배워 보려고 하신다면, 다음의 온라인 강의를 체크해 보시기 바랍니다.