2017-04-05 5 views
-1
void CreateCubesBesideWaypoints() 
    { 
     const int lightCount = 20; 
     Vector3[] lightPositions = new Vector3[lightCount]; 

     for (int i = 0; i < waypoints.Length - 1; i++) 
     { 
      posToChunkDistances(waypoints[i].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
      for (int x = 0; x < lightPositions.Length; x++) 
      { 
       lightPrefab.GetComponent<Renderer>().material.color = Color.red; 
       GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
       cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
       cloneLightPrefab.tag = "LightPrefab"; 
       //cloneLightPrefab.transform.SetParent(lightPrefab.transform); 
      } 
     } 
    } 

この方法でうまくいきます。しかし、私がラインを使用している場合:なぜ私はクローン/複製オブジェクトのメモリ使用量が98%になっていますか?

cloneLightPrefab.transform.SetParent(lightPrefab.transform); 

次に、メモリ使用量は98%に達しています。私はPCを再起動する必要があります。 lightPrefabはこのスクリプトにドラッグするキューブGameObjectです。 そして、私がしたいことは、lightPrefabの下にあるすべての新しいcloneLightPrefabゲームオブジェクトを子として配置することです。

そして、ライン上の内側のループでは、サブ質問:あなたのコードで非常に多くの問題ので、この答えは長くなりますがあり

for (int x = 0; x < lightPositions.Length - 1; x++) 
+0

lightPrefab.GetComponent ().material.color = Color.red;何度も電話してください...あなたはそれを動かすことができます。 –

答えて

3

for (int x = 0; x < lightPositions.Length; x++) 

が、私はそれを変更する必要があります。

です。まず、外側のループ:for (int i = 0; i < waypoints.Length - 1; i++)は必要ありません。それを削除してください。それは私の最後の答えには含まれていなかったので、なぜあなたがそこにそれを追加したのかはわかりません。これにより、ループで費やす時間が増えます。あなたがlightPrefab.GetComponent<Renderer>().material.color = Color.red;をしたとき

。あなたは、あなたが代わりにクローン化されたオブジェクトを変更しなければならないプレハブを変更しています。 cloneLightPrefab.GetComponent<Renderer>().material.color = Color.red;

。インスタンス化されたオブジェクトの親をプレハブに設定しないでください。それはcloneLightPrefab.transform.SetParent(lightPrefab.transform);でやっていることです。

空のGameObjectを作成し、インスタンス化するすべてのライトオブジェクトの親として使用します。 GameObject parentObject = new GameObject("LightParentObj");、次にcloneLightPrefab.transform.SetParent(parentObject.transform);

すでにわからない場合は、プレハブの作成方法についてはthisの投稿を参照してください。

あなたの固定されたコードは、より次のようになります。

void CreateCubesBesideWaypoints() 
{ 
    const int lightCount = 20; 
    Vector3[] lightPositions = new Vector3[lightCount]; 

    posToChunkDistances(waypoints[0].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
    GameObject parentObject = new GameObject("LightParentObj"); 
    for (int x = 0; x < lightPositions.Length; x++) 
    { 
     GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
     cloneLightPrefab.GetComponent<Renderer>().material.color = Color.red; 
     cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
     cloneLightPrefab.tag = "LightPrefab"; 
     cloneLightPrefab.transform.SetParent(parentObject.transform); 
    } 
} 

が、私はそれを変更する必要がありますについて(int型のx = 0; X < lightPositions.Length - 1; のx ++)

いいえ

for (int x = 0; x < lightPositions.Length; x++)の場合、 ループは0から始まり、lightPositions.Length - 1で終了します。

for (int x = 0; x < lightPositions.Length - 1; x++)に変更すると、ループは0から始まり、lightPositions.Length - 2で終わります。基本的に、ループは配列内のすべての項目をループしません。

私はあなたがコード化を続ける前に、あなたはGoogleに連絡し、forの配列をC#でループすると思います。それはそれらの基本的なものの一つですを知っている必要があります。

:あなたは<=代わりの<を使用する場合、for (int x = 0; x < lightPositions.Length - 1; x++)を使用する細かいかもしれ回の

一つがあります。例えば、for (int x = 0; x <= lightPositions.Length - 1; x++)。この場合、ループは配列内のすべての項目をループします。

+0

私は外側のループをした理由は、私が行う場合です:posToChunkDistances(waypoints [0] .transform.position、waypoints [waypoints.Length - 1] .transform.position、lightPositions、lightCount);キューブは1つのウェイポイントにのみ配置されます。しかし、ウェイポイントでは私はウェイポイントを1つ以上持っています。だから私はfor(int i = 0; i

+0

実際にはありません。ウェイポイントは '0'インデックスから始まり、' waypoints.Length - 1'で終わります。 'posToChunkDistances'関数は2つの位置をとります:1. 'waypoints [0] .transform.position'の位置の始まり。 2.「waypoints.Length - 1」の位置の終わり。それらの2つの位置に渡すと、その2つの位置の間にポイントが生成されます。これらのポイントの距離は等しく、それはあなたが望むものです。 – Programmer

+0

生成された均等点を 'lightPositions'配列変数に格納します。ループして、それらの位置のそれぞれに光をインスタンス化します。私が 'waypoints'をうまくループしていない主な理由は、ラインが均等に作られているかどうかわからないからです。生成するポイント数を制御することもできません。 – Programmer

関連する問題