Unity:親スクリプトから、子オブジェクトで発生する衝突を検出する方法は?


12

私はこの構造で敵を持っています

      • 左腕
      • 右腕

等々。

体の各部分にコライダーも持っています。「敵」オブジェクトにスクリプトを添付しました。そのスクリプトで、身体、頭、腕、左などの衝突(弾丸)の可能性を遮断したいと思います。

これを行う方法はありますか?

回答:


16

キャラクターでリジッドボディを使用している場合は、箱から出すことができます。:)

したがって、階層は次のようになります。

  • キャラクター(リジッドボディと制御スクリプトあり)
    • 子供(おそらくコライダーがある)
      • (たぶんコライダーがいる)

OnCollisionEnterメッセージは、リジッドボディを含む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

これを解決する1つの方法は、2つのスクリプトを持つことです。1つはEnemyオブジェクト用で、もう1つは子用です(Enemyオブジェクトの子に割り当てる必要があります)。

親スクリプト

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を何度も呼び出すつもりの良い習慣であり、トリッキーな「チェーンの親の送信先を見つける」ロジックを1回だけ実行する必要があるようにすることができます。また、transform.parentは直接の親のみを取得することにも注意してください
Lunin

2

単にtopオブジェクトを子に渡して、その上で直接関数を呼び出すことができます。これにより、親の伝播に依存する必要がないことが保証されます。だからあなたは愚かなことをしてしまうことはありませんtransform.parent.parent

ただし、GetComponentInParentを使用してこのプロセスを自動化できます。これにより、最初に見つかったスクリプトが取得されます。それを衝突オブジェクトにキャッシュし、キャッシュされたオブジェクトの関数を直接呼び出します。

あるいは、UnityEvents(Messagesを使用しないでください)を使用して、関数を子オブジェクトにバインドすることもできます。ユニティイベントを使用すると、任意のリスナーを追加できるため、ヒットしている子オブジェクトを最上位のオブジェクトに通知するだけではありません。


1

Unity AnswersAshish Dwivediによって書かれた)からの直接の引用

子にスクリプトを追加し、その中に親オブジェクトのスクリプトの参照を含めます。次に、(OnCollisionEnter2DChild、OnCollisionStay2DChild、OnCollisionExit2DChild)のような親スクリプトに3つのメソッドを記述し、衝突オブジェクトを渡すことによって子オブジェクトスクリプトにあるメソッド(OnCollisionEnter2D、OnCollisionStay2D、OnCollisionExit2D)からそれぞれのメソッドを呼び出します。


1

衝突のチェックを実行して、どのヒットボックスがヒットしたかを確認し、必要に応じて影響ポイントを取得することもできます。

注:rigidbodyは、衝突チェックスクリプトがあるのと同じオブジェクトに配置されます。

この例では、ターゲットに「発射物」がヒットするヒットボックスを確認しています。

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.