2016-05-28 13 views
0

私は、プレイヤーに向かって移動する複数の敵を持っています。私は彼らがお互いにマージするのを止めようとしています。つまり、お互いの間にある種の最小距離を維持しています。私は何をしようとしていること(unity3dフォーラムから)これです:Unity3d複数のゲームオブジェクト間の最小距離を維持するC#

enemy1.transform.position = (enemy1.transform.position - 
enemy2.transform.position).normalized * distance + enemy2.transform.position; 

しかし、私は> = 3体の敵を持っているとき、私はすべての敵の組み合わせにこれを適用する場合でも、彼らはまだ束までのように見えます。

私はこれがうまくいかないし、拡大縮小しないので、より良い方法が必要です。

答えて

0

敵のプレハブの周りには、事実上トリガー要素であるクワッドボックスが置かれています。次に、あなたが設定した敵のスクリプト(タグタイプを使用して想像する)が、クワッドボックスを使用して、適切なコードを実行して、敵を近づけないようにし、このトリガーボックスと実際に重なる敵を防ぎます。

あなたの質問では、敵のユニットを具体的に参照するのではなく、具体的には非常におそらくコードの悪い方法であるように見えるように見えます。名前付き参照エンティティ。

using UnityEngine; 
    using System.Collections; 

    public class ExampleClass : MonoBehaviour 
{ 

    private Transform otherEntity; 
    public float distance = 50.0f; 
    private Transform thisEntity; 

    void OnTriggerEnter(Collider other) 
    { 
     otherEntity = other.GetComponent<Transform>(); 
     thisEntity = GetComponent<Transform>(); 
     thisEntity.position = (thisEntity.position - otherEntity.position).normalized * distance + otherEntity.position; 
    } 
} 

私は上記のコードをテストしたが、あなたが参照するコード変換の値は、これは、バージョン5.1のリリース以来、ユニティでALOTを変更したとして、参照先エンティティのためのゲームコンポーネントからロードし、あなたのしているを使用していませんあなたのコードのソースは2012年に与えられた答えでした!

thisEntityは、スクリプトが添付されているオブジェクトです(通常は敵の1つです)。 otherEntityはクワッドトリガーの対象です(クワッドはトリガーエレメントとして参照する必要があります)。

Entity変数の値は、トリガーが入力されると設定する必要があります。正しいother要素。

(私は私の方法論と完全に間違っているかもしれないが、私はこのことができます願っています。)多く、これは私が探していたアイデアの一種である

+0

感謝。 – shell

+1

'GetComponent ' 'obj.transform'よりも遅くなければならず、省略形を書くことはstですこのクラスのベストプラクティスとみなされます(他のコンポーネントでは非推奨です)。また、 'otherEntity'をメンバ変数として宣言すると、何も得られません。関数内でのみ使用されている場合(これは通常、衝突ハンドラに当てはまります)、読みやすくするためにローカルにする必要があります。 'thisEntity'をキャッシュすれば少し時間が節約されるかもしれませんが、もしそうなら' Awake() 'にキャッシュされます。 (それもローカル変数にしても問題ありません。)メモを取る、@シェル – piojo

+1

@piojo私はメモリから純粋に書いていましたが、obj.transformが上で概説したケースでは識別可能であるとは確信していませんでした。 「確かに。私は 'thisEntity'をキャッシュする必要があることに同意します(各トリガーの火災で再確立する必要はありません)。フィードバックの応援 – Martin

関連する問題