2017-02-23 6 views
-1

階層に2つのキューブを追加しました。 最初のスクリプトを添付しました。 2番目の立方体を壁のホルダーのインスペクタにドラッグしました。私は迷路を作成しようとしていますが、ゲームを実行しているときにCPU使用量やメモリ使用量が過負荷になっています。どうすれば修正できますか?

ゲームを実行しているときに私のPC全体がスタックしていました。パソコンをシャットダウンして再起動しなければなりませんでした。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class MazeGenerator : MonoBehaviour { 

    public GameObject wallHolder; 
    public float wallLength = 1.0f; 
    public int xSize = 5; 
    public int ySize = 5; 

    private Vector3 initialPos; 

    // Use this for initialization 
    void Start() 
    { 
     CreateWalls(); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void CreateWalls() 
    { 
     wallHolder = new GameObject(); 
     wallHolder.name = "Maze"; 

     initialPos = new Vector3((-xSize/2) + wallLength/2, (-ySize/2) + wallLength/2); 
     Vector3 myPos = initialPos; 
     GameObject tempWall; 

     //For x axis 
     for (int i = 0; i < ySize; i++) 
     { 
      for (int j = 0; j <= xSize; j++) 
      { 
       myPos = new Vector3(initialPos.x + (j * wallLength) - wallLength/2, 0.0f, initialPos.z + (i * wallLength) - wallLength/2); 
       tempWall = Instantiate(wallHolder, myPos, Quaternion.identity) as GameObject; 
       tempWall.transform.parent = wallHolder.transform; 
      } 
     } 

     //for y axis 
     for (int i = 0; i <= ySize; i++) 
     { 
      for (int j = 0; j < xSize; j++) 
      { 
       myPos = new Vector3(initialPos.x + (j * wallLength), 0.0f, initialPos.z + (i * wallLength) - wallLength); 
       tempWall = Instantiate(wallHolder, myPos, Quaternion.Euler(0.0f, 90.0f, 0.0f)) as GameObject; 
       tempWall.transform.parent = wallHolder.transform; 
      } 
     } 
    } 
} 
+1

私はまだ実際のコードを見ていませんが、一目で2倍のネストされたループは2dの迷路で奇妙に見えます。それはY軸で「移動する」ループではなく、 X軸で動くか? –

+1

あなたは何が起こっているかを見るのに十分なコードを提供していません。あなたは私たちに[mcve]を与える必要があります。 – Enigmativity

答えて

1

wallHolderプロパティをどのように割り当てて参照しているかには奇妙なことがあります。どのように扱っているかに細心の注意を払ってください。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class MazeGenerator: MonoBehaviour { 

    public GameObject wallObjectRoot; 
    public GameObject wallObjectReference; 
    public float wallLength = 1.0f; 
    public int xSize = 5; 
    public int ySize = 5; 

    private Vector3 initialPos; 

    // Use this for initialization 
    void Start() 
    { 
     if (wallObjectReference == null || wallObjectRoot == null){ 
      Debug.LogError("WallHolder properties need to be assigned to MazeGenerator"); 
     } 

     CreateWalls(); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void CreateWalls() 
    { 


     initialPos = new Vector3((-xSize/2) + wallLength/2, (-ySize/2) + wallLength/2); 

     //For x axis 
     for (int i = 0; i < ySize; i++) 
     { 
      for (int j = 0; j <= xSize; j++) 
      { 
       Vector3 spawnPos = new Vector3(initialPos.x + (j * wallLength) - wallLength/2, 0.0f, initialPos.z + (i * wallLength) - wallLength/2); 
       GameObject wallObject = Instantiate(wallObjectReference, spawnPos, Quaternion.identity); 
       wallObject.transform.parent = wallObjectRoot.transform; 
      } 
     } 

     //for y axis 
     for (int i = 0; i <= ySize; i++) 
     { 
      for (int j = 0; j < xSize; j++) 
      { 
       Vector3 spawnPos = new Vector3(initialPos.x + (j * wallLength), 0.0f, initialPos.z + (i * wallLength) - wallLength); 
       GameObject wallObject = Instantiate(wallObjectReference, spawnPos, Quaternion.Euler(0.0f, 90.0f, 0.0f)); 
       wallObject.transform.parent = wallObjectRoot.transform; 
      } 
     } 

    } 
} 

がMazeGeneratorというタイトルのオブジェクトにMazeGeneratorスクリプトを入れて:そうのようにそれを打破するために良いでしょう。インスペクタを使用して、シーン内のGameObjectをwallObjectRootに割り当て、プロジェクトからのPrefabをwallObjectReferenceに割り当てます。シーンのgameObjectをwallObjectReferenceに使うこともできますが、それはちょっとしたことです。

また、Windowsのタスクマネージャ(Ctrl + Shift + Esc)からキャンセルすることで、フリーズする場合は、ユニティプロセスを終了することができます。

関連する問題