2016-10-17 9 views
1

私のゲームでは、多くの敵があり、このスクリプトを置いて、位置の配列から要素をランダムに選択してnavmeshの行き先を設定します。しかし、すべての敵が同じ位置に移動することがあるため、以前に生成された配列インデックスをスキップして新しいインデックスを見つけることを試みています。これに対する提案はありますか?私はgotoステートメントを使用したくありません。ここで重複のない配列からランダムな位置を選択

は、私がこれまで行っているコードです:あなたが試すことができます

void move_on_fired_positions() 
{ 
    navmesh.Resume(); 
    again: 
    new_position = Random.Range (0, firedpoints.Length); 

    if (prev_num != new_position) { 
     navmesh.SetDestination (firedpoints [new_position].position); 
     prev_num = new_position; 
    } else 
    { 
     goto again; 
    } 
} 
+0

Hmは解決策を考えましたが、明確にするために、「firedpoints」は何ですか?どのように人口を集め、一度敵がそのポジションの1つに向かうと、ゲームの残りの部分で他の敵には利用できないと考えられるのか、それとも再び使用のために解放するいくつかの条件があるのでしょうか? – Serlite

+0

はい、一度敵がその位置の1つに移動すると、他の敵には利用不可能でなければならず、再度使用するための条件はありません(条件も必要です)。そしてfiredpointsはpublicですTransform arrayインスペクタ。 @Serlite –

+0

私は、next_positionメソッド(新しい位置の変換を返す)を持つposition_distributorクラスが必要であり、navmesh、setdestinationはこのディストリビュータクラスメソッドを呼び出して新しい位置を取得すると考えています。しかし、私は初心者のためにこれをすることができません:-( –

答えて

2

ことの一つは、利用可能な位置の動的なリストではなく、配列を保っています。 (これはUnityエディタのインターフェースでも同様にシリアル化され、同じ方法で変更されます)。この方法では、リストから敵に割り当てられた位置を削除することができます。ここではそれがどのように見えるかのアイデアです:

public List<Transform> firedpoints; 

// Returns available firing position, if any 
public Transform GetRandomFiringPosition() 
{ 
    if (firedpoints.Count > 0) 
    { 
     // Get reference to transform, then remove it from list 
     int newPositionIndex = Random.Range (0, firedpoints.Length); 
     Transform returnedPosition = firedpoints[newPositionIndex]; 
     firedpoints.RemoveAt(newPositionIndex); 
     return returnedPosition; 
    } 
    else 
    { 
     // Or you can specify some default transform 
     return null; 
    } 
} 

// Makes firing position available for use 
public void RegisterFiringPosition(Transform newPosition) 
{ 
    firedpoints.Add(newPosition); 
} 

このコードは、敵がへの参照を持つべきである(または、あなたはコードを少し変更することができますし、どのシーンで単一のオブジェクト上のスクリプトにする必要がありますクラスをシングルトンにして、そのメソッドを直接参照せずに呼び出すことができます)。敵が新しい位置を必要とするときはいつでも、GetRandomFiringPosition()を呼び出し、返されたTransformを将来の参照用に変数に格納することができます。

ポジションを再び利用できるようにする条件を決定していませんが、持っていればRegisterFiringPosition()に電話してリストに戻すことができます。素晴らしい副作用として、これはまた、例えば、プレイヤーによって誘発されたイベントに応答して、新しい位置を敵に割り当てることを可能にする。

希望すると便利です。ご質問がある場合はお知らせください。

+0

はい、ありがとう、あなたは私を助けます。あなたは私に進むべき正しい道を与えます。 –

関連する問題