답변:
캐릭터와 함께 리지드 바디를 사용하는 경우 즉시 사용할 수 있습니다. :)
따라서 계층 구조는 다음과 같습니다.
OnCollisionEnter 메시지는 Rigidbody가 포함 된 GameObject에서 실행되어 각 충돌기에 붙어있는 추가 릴레이 스크립트를 작성할 필요없이 부모 제어 스크립트에 도달합니다.
충돌에 관여 한 자식 충돌체를 찾아야하는 경우 다음과 같이 수행 할 수 있습니다.
void OnCollisionEnter(Collision collision) {
Collider myCollider = collision.contacts[0].thisCollider;
// Now do whatever you need with myCollider.
// (If multiple colliders were involved in the collision,
// you can find them all by iterating through the contacts)
}
이 문제를 해결하는 한 가지 방법은 두 개의 스크립트를 사용하는 것입니다. 하나는 Enemy 개체 용이고 다른 하나는 자식 용입니다 (Enemy obj의 자식에게 할당해야 함).
부모 스크립트
using UnityEngine;
public class ParentScript : MonoBehaviour
{
public void CollisionDetected(ChildScript childScript)
{
Debug.Log("child collided");
}
}
자식 스크립트
using UnityEngine;
public class ChildScript : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
transform.parent.GetComponent<ParentScript>().CollisionDetected(this);
}
}
이런 식으로 자녀에게 충돌이 발생할 때마다 알림을 받아야합니다
상단 객체를 단순히 어린이에게 전달하고 그 위에 직접 함수를 호출 할 수 있습니다. 이렇게하면 부모 전파에 의존 할 필요가 없습니다. 그래서 당신은 바보 같은 일을 끝내지 않습니다.transform.parent.parent
그러나 GetComponentInParent 로이 프로세스를 자동화 할 수 있습니다. 찾은 첫 번째 스크립트를 검색합니다. 그런 다음 충돌 객체에 캐시하고 해당 캐시 객체에서 함수를 직접 호출하십시오.
또는 UnityEvents (Messages 사용하지 않음)를 사용하여 하위 객체에 함수를 바인딩 할 수 있습니다. 단일 이벤트를 사용하면 임의의 리스너를 추가 할 수 있으므로 히트중인 하위 오브젝트의 최상위 오브젝트에 알리는 것 이상을 수행 할 수 있습니다.
Unity Answers의 직접 인용문 ( Ashish Dwivedi 작성 ) :
자식에 스크립트를 추가하고 그 안에 부모 개체의 스크립트에 대한 참조가 있습니다. 이제 (OnCollisionEnter2DChild, OnCollisionStay2DChild, OnCollisionExit2DChild)와 같은 상위 스크립트에 3 개의 메소드를 작성하고 충돌 오브젝트를 전달하여 하위 오브젝트 스크립트에있는 메소드 (OnCollisionEnter2D, OnCollisionStay2D, OnCollisionExit2D)에서 각 메소드를 호출하십시오.
충돌을 검사하고 어떤 적중 상자가 적중되었는지 확인하고 필요한 경우 영향 지점을 얻을 수도 있습니다.
참고 : 강체는 충돌 검사 스크립트가있는 동일한 객체에 배치됩니다.
이 예제는 대상에 '발사체'가 치는 히트 박스를 확인합니다.
private void OnCollisionEnter(Collision collision)
{
if (collision.contacts[0].otherCollider.transform.gameObject.name == "HeadShot")
//DO STUFF
if (collision.contacts[0].otherCollider.transform.gameObject.name == "BodyShot")
//DO STUFF
}