Unity : 부모 스크립트에서 자식 객체에서 발생하는 충돌을 감지하는 방법은 무엇입니까?


12

나는이 구조를 가진 적이있다

    • 신체
      • 머리
      • 왼쪽 팔
      • 오른팔

등등.

나는 또한 신체의 각 부분에 대한 충돌체를 가지고 있습니다. 내 "적"오브젝트에 스크립트를 첨부했으며 그 스크립트에서 바디, 헤드, 팔, 왼쪽 등에 대한 충돌 (총알)을 가로 채고 싶습니다.

이것을 할 수있는 방법이 있습니까?

답변:


16

캐릭터와 함께 리지드 바디를 사용하는 경우 즉시 사용할 수 있습니다. :)

따라서 계층 구조는 다음과 같습니다.

  • 캐릭터 (Rigidbody 및 제어 스크립트가 있음)
    • 어린이 (충돌기가있을 수 있음)
      • 손자 (아마도 충돌자가있을 수 있음)

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)
}

5

이 문제를 해결하는 한 가지 방법은 두 개의 스크립트를 사용하는 것입니다. 하나는 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);
     }
 }

이런 식으로 자녀에게 충돌이 발생할 때마다 알림을 받아야합니다


2
이와 같은 솔루션을 사용하고 이러한 충돌이 많이 발생하는 경우 어린이에게 수신 부모의 GameObject를 캐시하도록 권장합니다. 동일한 GetComponent를 많이 호출 할 때마다 좋은 습관이며, "체인을 보낼 부모를 찾는"논리를 한 번만 수행하면됩니다. 또한 transform.parent는 직계 부모 만 가져옵니다 .
Lunin

2

상단 객체를 단순히 어린이에게 전달하고 그 위에 직접 함수를 호출 할 수 있습니다. 이렇게하면 부모 전파에 의존 할 필요가 없습니다. 그래서 당신은 바보 같은 일을 끝내지 않습니다.transform.parent.parent

그러나 GetComponentInParent 로이 프로세스를 자동화 할 수 있습니다. 찾은 첫 번째 스크립트를 검색합니다. 그런 다음 충돌 객체에 캐시하고 해당 캐시 객체에서 함수를 직접 호출하십시오.

또는 UnityEvents (Messages 사용하지 않음)를 사용하여 하위 객체에 함수를 바인딩 할 수 있습니다. 단일 이벤트를 사용하면 임의의 리스너를 추가 할 수 있으므로 히트중인 하위 오브젝트의 최상위 오브젝트에 알리는 것 이상을 수행 할 수 있습니다.


1

Unity Answers의 직접 인용문 ( Ashish Dwivedi 작성 ) :

자식에 스크립트를 추가하고 그 안에 부모 개체의 스크립트에 대한 참조가 있습니다. 이제 (OnCollisionEnter2DChild, OnCollisionStay2DChild, OnCollisionExit2DChild)와 같은 상위 스크립트에 3 개의 메소드를 작성하고 충돌 오브젝트를 전달하여 하위 오브젝트 스크립트에있는 메소드 (OnCollisionEnter2D, OnCollisionStay2D, OnCollisionExit2D)에서 각 메소드를 호출하십시오.


1

충돌을 검사하고 어떤 적중 상자가 적중되었는지 확인하고 필요한 경우 영향 지점을 얻을 수도 있습니다.

참고 : 강체는 충돌 검사 스크립트가있는 동일한 객체에 배치됩니다.

이 예제는 대상에 '발사체'가 치는 히트 박스를 확인합니다.

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    
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.