2017-06-02 10 views
0

敵から発射された弾丸が私のPlayerシールドから跳ね返ります。OnTriggerEnterまたはOnCollisionEnterのオブジェクトをインスタンス化して実行する

私は自分のキャラクターをセットアップし、敵は時間間隔で私に向かって発砲します。 次に、プレーヤーのシールドを有効にして(BoxColliderをオンにして)、ボタンを押します。

Bullet(IsTrigger)がPlayers Players(IsNotTrigger)と衝突するとき、このBulletを削除してから、Shieldから敵の方向に新しいBulletをインスタンス化します。 また、Bulletを破壊する問題もあります。

OnTriggerEventまたはOnColliderEventが発生したとき(両方を試したとき)、数百の弾丸がMy Shieldから表示されます。私はどのようにして1つの弾丸を敵に向けて発射させることができますか?

以下は、自分のプレイヤーシールドのGameObjectにあるスクリプトの一部です。 理想的には、弾丸が物体に衝突したらそれを破壊したいと思う。

+0

bulletReturnプレハブには「武器」タグがありますか? – Woltus

+0

ええ、「武器」のタグを持っています –

+0

あなたの新しい弾は、適切に新しいものを作り出します。弾丸がたくさん出ます。 – Woltus

答えて

1

私は問題にアプローチだろうが、私は改善のためのいくつかのアイデアを共有し、その後、ご希望のソリューションに固執する方法はありませんストラカン監督、

void OnTriggerEnter(Collider col) { 
if (col.tag == "Weapon") { 

    attack(col); 
    } 
} 

private void attack(Collider col) { 

if (!GameManager.instance.GameOver) { 

bulletReturnClone = Instantiate(bulletReturn, transform.position, transform.rotation) as GameObject; 
bulletReturnClone.GetComponent<Rigidbody>().velocity = transform.forward * 25f; 
// the following line of code should remove the bullet from the shield collider in order to prevent any future problems like spawning multiple bullets or instantly destroying the newly created bullet 
bulletReturnClone.GetComponent<Transform>().position *= bulletReturnClone.GetComponent<Rigidbody>().velocity; 
Destroy(col.gameObject); 
    } 
} 

あなたのトリガー(弾丸)を武器としてタグ付けされている場合は弾丸を破壊し、新しいものをインスタンス化し、それはVelocityの変更によってあなたのシールドポインティングの方向に弾丸を反映してあなたの意図的な目標を達成する必要があり、このコード。それは動作しますが、それはちょっとした開発のようです。あなたが別の観点から問題に近づくと、はるかに良いかもしれません - 盾の弾丸ではありません。

あなたは弾丸です。あなたがしているのは、あなたが撮影された方向に飛ぶことだけです。地形に衝突すると、停止/消滅します。この地形が盾であれば、あなたは停止/消滅しませんが、あなたの方向を変えます(反映されます)。 ...長いストーリーの短い...トリガーコライダーを持つべき人は、盾ではなく弾丸です。弾丸スクリプトのOnTriggerEnter(Collider col)はそれを破壊しますが、col.tag == "Shield"の場合、弾丸はその無駄なインスタンス化と変換をすべて行わずに方向を変更します。 私は第2解決策のコードを書くのが面倒です。あなたは私のポイントを持っている場合は、簡単に書き留めることができるはずです。試行錯誤を通じて学ぶことは、あなたが発展するのに役立ちます(私が怠け者になることを言い訳します)。

+0

あなたの答えは大変ありがとうございます。 新しいオブジェクトをインスタンス化するのではなく、Objectを反映する方が簡単です。 最後の段落に基づいて回答を受け入れました。 もう一度ありがとうございます。 –

1

なぜ新しいスピードで弾丸を再生成したいのですか?

シールドジオメトリに応じて、反発係数を調べることができ、弾丸の運動エネルギーを現実的な速度に反映させることができます。

さまざまな衝突プリミティブに応じて、その計算の複雑さはシールドジオメトリの複雑さに比例することに注意してください。

  • 球球
  • 球プレーン
  • 球地形(地形は、任意の不均一な表面を表すことができ)

それとも "のいくつかの並べ替えに弾丸を収集しようとしています別の時間にそれらを解放するために "充電"メカニック?

+0

あなたのお返事ありがとうございました。 私は当初、弾丸を反映させることを考えていましたが、新しい弾丸を破壊してインスタンス化する方が簡単だと思いました。 敵が自分のプレイヤーのすぐ前にいて、弾を撃ったと想像してください。私は自分の盾(箱コライダー)を使って弾丸を敵に戻すようにしたい。 弾丸(OnTriggerEvent)がShieldと衝突するようにします。それから、私は弾を破壊し、次にシールドの場所から新しい弾をインスタンス化し、これを敵の位置に戻すことができます。 –

+1

でも、ゲームプログラマーにとっては、実践の面ではうってつけです。そのようなことをしている処理サイクルが多すぎるかもしれません。しかし、単に "働かせる"ことができたら、シールド上に弾丸のリストを実装し、 'event_tick()' 'if(list.Count> 0)'に弾丸を追い出すだけです。残念ながら、私はUnreal Engineの多くの鉱石の経験と同じ構文を知らない。しかし、あなたがまだ苦労しているなら、私はそれをチェックしようとします。 – thanatorr

+0

ありがとうございました。 私はBoxColliderからオブジェクトを反射することに決めました。これは、オブジェクトを繰り返しインスタンス化するよりも簡単です。 もう一度ありがとうございます。 –

関連する問題