おそらく非常にばかげたことで、私はいくつかの困難を抱えています。私は敵のゲームオブジェクトを持っており、それがどこにぶつかったか (衝突) に応じて、それが死ぬか、プレイが死ぬかのどちらかです。これを説明する最も簡単な方法は、例として古典的なスーパー マリオ ブラザーズゲームを使用することだと思います。
ご存知のように、プレイヤーが敵にぶつかると、敵の頭の上にジャンプしない限り、プレイヤーは負けます。その場合、敵は死ぬはずです。
私の最初のアイデアは、ゲームオブジェクトに 2 つのコライダーを作成することでした。
- 青い境界線は BoxCollider2D を表します。これと衝突すると、プレイヤーが負けます (上から少し下にあることに注意してください)。
- 緑色の境界線は、子ゲーム オブジェクトの BoxCollider2D を表します。これと衝突すると、ゲーム オブジェクトが停止します。
以下は、私が使用したコードの簡略版です。
// Collider #1
public void OnCollisionEnter2D(Collision2D collision)
{
// Trigger 'Game-Over' logic
}
// Collider #2
public void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Player")
{
Destroy(this.gameObject);
}
}
この種の方法は機能しますが、コライダー #1と衝突した直後にコライダー #2もトリガーされ、敵が破壊されている間、プレイヤーも負けます。
私は RigidBody2D の値をいじって、プレイヤーが上から敵に当たったときに 2 番目のコライダーに入らないようにしました。 )。
私は RayCasts を調べましたが、これは複雑すぎて、かなり些細なことのように見えます (プレーヤーの 4 つの側面と 4 つの頂点すべてに光線をキャストします - プレーヤーにボックス コライダーがあると仮定します)。
私が「今のところ」頼ったのは、私が不満を持っている単純なコード片を持つ単一のコライダーであり、常に機能するとは限りません。
public void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Player")
{
float yVelocity = collision.gameObject.transform.rigidbody2D.velocity.y;
if (yVelocity < 0)
{
Debug.Log("Enemy will lose..." + yVelocity);
Destroy(this.gameObject);
}
else
{
// Trigger 'Game-Over' logic
}
}
}
私は現在 2D モードで作業していますが、3D モードの解決策 (私の質問には必要以上に複雑かもしれません) も検討されます。
みんなありがとう。