回答:
キャラクターでリジッドボディを使用している場合は、箱から出すことができます。:)
したがって、階層は次のようになります。
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)
}
これを解決する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);
}
}
このようにして、子に衝突が発生したときに通知を受け取る必要があります
単にtopオブジェクトを子に渡して、その上で直接関数を呼び出すことができます。これにより、親の伝播に依存する必要がないことが保証されます。だからあなたは愚かなことをしてしまうことはありませんtransform.parent.parent
ただし、GetComponentInParentを使用してこのプロセスを自動化できます。これにより、最初に見つかったスクリプトが取得されます。それを衝突オブジェクトにキャッシュし、キャッシュされたオブジェクトの関数を直接呼び出します。
あるいは、UnityEvents(Messagesを使用しないでください)を使用して、関数を子オブジェクトにバインドすることもできます。ユニティイベントを使用すると、任意のリスナーを追加できるため、ヒットしている子オブジェクトを最上位のオブジェクトに通知するだけではありません。
Unity Answers(Ashish Dwivediによって書かれた)からの直接の引用:
子にスクリプトを追加し、その中に親オブジェクトのスクリプトの参照を含めます。次に、(OnCollisionEnter2DChild、OnCollisionStay2DChild、OnCollisionExit2DChild)のような親スクリプトに3つのメソッドを記述し、衝突オブジェクトを渡すことによって子オブジェクトスクリプトにあるメソッド(OnCollisionEnter2D、OnCollisionStay2D、OnCollisionExit2D)からそれぞれのメソッドを呼び出します。
衝突のチェックを実行して、どのヒットボックスがヒットしたかを確認し、必要に応じて影響ポイントを取得することもできます。
注: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
}