3

おそらく非常にばかげたことで、私はいくつかの困難を抱えています。私は敵のゲームオブジェクトを持っており、それがどこにぶつかったか (衝突) に応じて、それが死ぬか、プレイが死ぬかのどちらかです。これを説明する最も簡単な方法は、例として古典的なスーパー マリオ ブラザーズゲームを使用することだと思います。

ご存知のように、プレイヤーが敵にぶつかると、敵の頭の上にジャンプしない限り、プレイヤーは負けます。その場合、敵は死ぬはずです。

コライダーを持つ敵

私の最初のアイデアは、ゲームオブジェクトに 2 つのコライダーを作成することでした。

  1. 青い境界線は BoxCollider2D を表します。これと衝突すると、プレイヤーが負けます (上から少し下にあることに注意してください)。
  2. 緑色の境界線は、子ゲーム オブジェクトの 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 モードの解決策 (私の質問には必要以上に複雑かもしれません) も検討されます。

みんなありがとう。

4

3 に答える 3

1

ゲーム開発者として、問題を解決したりゲームプレイを作成したりする方法は常にたくさんあります。まず最初に、オブジェクトとキャラクターのポリゴン コライダー 2D を作成する必要があります。ゲームでボックス シリンダーを使用しているように、写真を衝突​​させるだけではあまり良くありません。

良い選択は、プレイヤーにオブジェクトを取り付けて空にし、その位置をプレイヤーの足元に設定し、敵が死ぬかどうかをチェックすることです。

もう 1 つの選択肢は、オブジェクトが衝突する場合です。2 つのオブジェクトの位置を確認します。プレーヤーの数が高ければ、彼は殺します。そうしないと、敵がプレーヤーを殺します。

もっと考えれば、もっと多くの答えが見つかります。さまざまな方法を調べて、最も効率的な方法を見つける必要があります。

于 2015-02-17T02:24:59.780 に答える
0

必要なものを実装する 1 つの方法は、各コライダーを子独自のゲーム オブジェクトに配置し、IsTouching() メソッドを使用することです。

void OnTriggerEnter2D(Collider2D other){
    if(GameObject.Find("Top Trigger").GetComponent<BoxCollider2D>().IsTouching(other)){
        Destroy(transform.gameObject)
    }
    if(GameObject.Find("Bottom Trigger").GetComponent<BoxCollider2D>().IsTouching(other)){
        Destroy(other.gameObject)
    }
}
于 2017-02-16T21:32:49.690 に答える