2014-07-21 17 views
-7

問題如下:通常,腳本應該在播放器周圍的立方體中生成16個預製件,當我啓動它時可以正常工作,因爲它調用啓動函數上的生成,但是當我第一人稱控制器會繼續執行另一個塊,它會每秒產生16個塊,這會產生很多滯後,並且非常不好,不應該產生那麼多預製塊,任何幫助都會非常讚賞。非常感謝你。我的自定義地形生成插件實例化到很多預製

我不認爲問這樣一個大問題,因爲這是允許的,但連續幾天試圖解決這個問題後,它似乎仍然沒有工作。因此,這裏是我得到:

  • 第一人稱控制器
  • 2腳本
    • 一個名爲infiniteTerrain其連接到第一人稱控制器
      腳本的簡短說明腳本:此腳本生成預製件圍繞球員的形狀爲一個 立方體。它還將這些塊保存到.txt文件中,以便在需要時加載 以最大限度地減少滯後量。
    • 一個名爲chunkRename其連接到所產生
      腳本的簡短說明每塊腳本:重命名塊,使他們可以很容易在其他腳本訪問。

下面是腳本:

infiniteTerrain.js

#pragma strict 

var terrains : GameObject[]; 
var newworld = true; 
var trees : GameObject[]; 
var vegetation : GameObject[]; 
var rivers : GameObject[]; 
var mountains : GameObject[]; 
var playerTerrainUnavailable = false; 
var x = 50; 
var z = 50; 
var y = 100; 
var cameraDirection : float; 
var chunkWidth = 50; 

var chunk1 = " "; 
var chunk2 = " "; 
var chunk3 = " "; 
var chunk4 = " "; 
var chunk5 = " "; 
var chunk6 = " "; 
var chunk7 = " "; 
var chunk8 = " "; 
var chunk9 = " "; 
var chunk10= " "; 
var chunk11= " "; 
var chunk12= " "; 
var chunk13= " "; 
var chunk14= " "; 
var chunk15= " "; 
var chunk16= " "; 
var chunk17= " "; 
var chunk18= " "; 
var chunk19= " "; 
var chunk20= " "; 
var chunk21= " "; 
var chunk22= " "; 
var chunk23= " "; 
var chunk24= " "; 
var chunk25= " "; 
var load1 = true; 
var load2 = true; 
var load3 = true; 
var load4 = true; 
var load5 = true; 
var load6 = true; 
var load7 = true; 
var load8 = true; 
var load9 = true; 
var load10 = true; 
var load11 = true; 
var load12 = true; 
var load13 = true; 
var load14 = true; 
var load15 = true; 
var load16 = true; 
var load17 = true; 
var load18 = true; 
var load19 = true; 
var load20 = true; 
var load21 = true; 
var load22 = true; 
var load23 = true; 
var load24 = true; 
var load25 = true; 

var canGenerate = true; 


function Start() { 
    if(newworld) { 
     generateOnStart(); 
     saveLoadedChunk(); 
     newworld = false; 
    }else{ 
     loadSavedWorld(); 
    } 
} 

function Update() { 

} 

function callGenerate() { 
    if(canGenerate) { 
    var canGenerate = false; 
    var gameObjects : GameObject[] = FindObjectsOfType(GameObject) as GameObject[]; 
     for (var i = 0; i < gameObjects.length ; i++) { 
      if(gameObjects[i].name.Substring(0,6) == "ACTIVE") 
       if(gameObjects[i].tag != "Player") { 
       var xco = gameObjects[i].transform.position.x; 
       var yco = gameObjects[i].transform.position.y; 
       var zco = gameObjects[i].transform.position.z; 
       generateFromMiddleOfChunk(xco, yco, zco); 
      }     
     } 
    } 
} 

function saveLoadedChunk() { 
    var loadedChunks : GameObject[] = FindObjectsOfType(GameObject) as GameObject[]; 
    var fileName = "C:/Reactor Games/chunks.txt";  

    var lines = System.IO.File.ReadAllLines(fileName); 

    var write = true; 

    var sw : System.IO.StreamWriter = new System.IO.StreamWriter(fileName, true); 
    for (var i = 0; i < loadedChunks.length ; i++) { 
     if(loadedChunks[i].name.Substring(0,5) == "Chunk" || loadedChunks[i].name.Substring(0,5) == "_TERR" || loadedChunks[i].name.Substring(0,5) == "ACTIV") { 
      if(loadedChunks[i].tag != "Player") { 
       var xco = loadedChunks[i].transform.position.x; 
       var yco = loadedChunks[i].transform.position.y; 
       var zco = loadedChunks[i].transform.position.z; 
       var stringToWrite = "Chunk (" + xco + ", " + yco + ", " + zco + ")"; 

       write = true; 
       for (var chunkName in lines) { 
        if(chunkName.Equals(stringToWrite)) { 
         write = false; 
         break; 
        } 
       } 

       if(write){sw.WriteLine(stringToWrite);}  
      } 
     } 
    } 
    sw.Flush(); 
    sw.Close(); 
} 

function generateFromMiddleOfChunk(xco : int, yco : int, zco : int) { 
    //V1 
    chunk1 = "Chunk (" + xco.ToString() + ", " + yco.ToString() + ", " + zco.ToString() + ")"; 
    chunk2 = "Chunk (" + (xco + chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco+chunkWidth).ToString() + ")"; 
    chunk3 = "Chunk (" + (xco + chunkWidth).ToString() + ", " + yco.ToString() + ", " + zco.ToString() + ")"; 
    chunk4 = "Chunk (" + (xco + chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco * -1).ToString() + ")"; 
    chunk5 = "Chunk (" + (xco + chunkWidth * -1).ToString() + ", " + yco.ToString() + ", " + (zco+chunkWidth).ToString() + ")"; 
    chunk6 = "Chunk (" + (xco + chunkWidth * -1).ToString() + ", " + yco.ToString() + ", " + zco.ToString() + ")"; 
    chunk7 = "Chunk (" + (xco + chunkWidth * -1).ToString() + ", " + yco.ToString() + ", " + (zco * -1).ToString() + ")"; 
    chunk8 = "Chunk (" + xco.ToString() + ", " + yco.ToString() + ", " + (zco + chunkWidth).ToString() + ")"; 
    chunk9 = "Chunk (" + xco.ToString() + ", " + yco.ToString() + ", " + (zco * -1).ToString() + ")"; 
    chunk10= "Chunk (" + (xco + chunkWidth * -2).ToString() + ", " + yco.ToString() + ", " + (zco + 2 * chunkWidth).ToString() + ")"; 
    chunk11= "Chunk (" + (xco + chunkWidth * -2).ToString() + ", " + yco.ToString() + ", " + (zco + chunkWidth).ToString() + ")"; 
    chunk12= "Chunk (" + (xco + chunkWidth * -2).ToString() + ", " + yco.ToString() + ", " + zco.ToString() + ")"; 
    chunk13= "Chunk (" + (xco + chunkWidth * -2).ToString() + ", " + yco.ToString() + ", " + (zco * -1).ToString() + ")"; 
    chunk14= "Chunk (" + (xco + chunkWidth * -2).ToString() + ", " + yco.ToString() + ", " + (zco + -2 * chunkWidth).ToString() + ")"; 
    chunk15= "Chunk (" + (xco + chunkWidth * -1).ToString() + ", " + yco.ToString() + ", " + (zco + 2 * chunkWidth).ToString() + ")"; 
    chunk16= "Chunk (" + (xco + chunkWidth * -1).ToString() + ", " + yco.ToString() + ", " + (zco + -2 * chunkWidth).ToString() + ")"; 
    chunk17= "Chunk (" + xco.ToString() + ", " + yco.ToString() + ", " + (zco + 2 * chunkWidth).ToString() + ")"; 
    chunk18= "Chunk (" + xco.ToString() + ", " + yco.ToString() + ", " + (zco + -2 * chunkWidth).ToString() + ")"; 
    chunk19= "Chunk (" + (xco + chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco + 2 * chunkWidth).ToString() + ")"; 
    chunk20= "Chunk (" + (xco + chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco + -2 * chunkWidth).ToString() + ")"; 
    chunk21= "Chunk (" + (xco + 2 * chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco + 2 * chunkWidth).ToString() + ")"; 
    chunk22= "Chunk (" + (xco + 2 * chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco + chunkWidth).ToString() + ")"; 
    chunk23= "Chunk (" + (xco + 2 * chunkWidth).ToString() + ", " + yco.ToString() + ", " + zco.ToString() + ")"; 
    chunk24= "Chunk (" + (xco + 2 * chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco * -1).ToString() + ")"; 
    chunk25= "Chunk (" + (xco + 2 * chunkWidth).ToString() + ", " + yco.ToString() + ", " + (zco + -2 * chunkWidth).ToString() + ")"; 

    var chunksInScene : GameObject[] = FindObjectsOfType(GameObject) as GameObject[]; 
    var myArray : boolean[] = new boolean[25]; 

    for (var i = 0; i < chunksInScene.length ; i++) { 
     if(chunksInScene[i].name.Substring(0,5) == "Chunk" || chunksInScene[i].name.Substring(0,5) == "_TERR" || chunksInScene[i].name.Substring(0,5) == "ACTIV") { 
       if(chunksInScene[i].tag != "Player") { 

       if(myArray[0] && chunksInScene[i].Equals(chunk1)) 
       {load1 = false; myArray[0] = false;continue;} 

       if(myArray[1] && chunksInScene[i].Equals(chunk2)) 
       {load2 = false; myArray[1] = false; continue;} 

       if(myArray[2] && chunksInScene[i].Equals(chunk3)) 
       {load3 = false; myArray[2] = false; continue;} 

       if(myArray[3] && chunksInScene[i].Equals(chunk4)) 
       {load4 = false; myArray[3] = false; continue;} 

       if(myArray[4] && chunksInScene[i].Equals(chunk5)) 
       {load5 = false; myArray[4] = false; continue;} 

       if(myArray[5] && chunksInScene[i].Equals(chunk6)) 
       {load6 = false; myArray[5] = false; continue;} 

       if(myArray[6] && chunksInScene[i].Equals(chunk7)) 
       {load7 = false; myArray[6] = false; continue;} 

       if(myArray[7] && chunksInScene[i].Equals(chunk8)) 
       {load8 = false; myArray[7] = false; continue;} 

       if(myArray[8] && chunksInScene[i].Equals(chunk9)) 
       {load9 = false; myArray[8] = false; continue;} 

       if(myArray[9] && chunksInScene[i].Equals(chunk10)) 
       {load10 = false; myArray[9] = false; continue;} 

       if(myArray[10] && chunksInScene[i].Equals(chunk11)) 
       {load11 = false; myArray[10] = false; continue;} 

       if(myArray[11] && chunksInScene[i].Equals(chunk12)) 
       {load12 = false; myArray[11] = false; continue;} 

       if(myArray[12] && chunksInScene[i].Equals(chunk13)) 
       {load13 = false; myArray[12] = false; continue;} 

       if(myArray[13] && chunksInScene[i].Equals(chunk14)) 
       {load14 = false; myArray[13] = false; continue;} 

       if(myArray[14] && chunksInScene[i].Equals(chunk15)) 
       {load15 = false; myArray[14] = false; continue;} 

       if(myArray[15] && chunksInScene[i].Equals(chunk16)) 
       {load16 = false; myArray[15] = false; continue;} 

       if(myArray[16] && chunksInScene[i].Equals(chunk17)) 
       {load17 = false; myArray[16] = false; continue;} 

       if(myArray[17] && chunksInScene[i].Equals(chunk18)) 
       {load18 = false; myArray[17] = false; continue;} 

       if(myArray[18] && chunksInScene[i].Equals(chunk19)) 
       {load19 = false; myArray[18] = false; continue;} 

       if(myArray[19] && chunksInScene[i].Equals(chunk20)) 
       {load20 = false; myArray[19] = false; continue;} 

       if(myArray[20] && chunksInScene[i].Equals(chunk21)) 
       {load21 = false; myArray[20] = false; continue;} 

       if(myArray[21] && chunksInScene[i].Equals(chunk22)) 
       {load22 = false; myArray[21] = false; continue;} 

       if(myArray[22] && chunksInScene[i].Equals(chunk23)) 
       {load23 = false; myArray[22] = false; continue;} 

       if(myArray[23] && chunksInScene[i].Equals(chunk24)) 
       {load24 = false; myArray[23] = false; continue;} 

       if(myArray[24] && chunksInScene[i].Equals(chunk25)) 
       {load25 = false; myArray[24] = false; continue;} 
      } 
     } 
    } 

    //V1 
    if(load1){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco, yco, zco), Quaternion.identity);} 
    //V2 
    if(load2){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth, yco, zco + chunkWidth), Quaternion.identity);} 
    if(load3){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth, yco, zco), Quaternion.identity);} 
    if(load4){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth, yco, zco * -1), Quaternion.identity);} 
    if(load5){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -1, yco, zco + chunkWidth), Quaternion.identity);} 
    if(load6){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -1, yco, zco), Quaternion.identity);} 
    if(load7){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -1, yco, zco * -1), Quaternion.identity);} 
    if(load8){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco, yco, zco + chunkWidth), Quaternion.identity);} 
    if(load9){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco, yco, zco * -1), Quaternion.identity);} 
    //V3 
    if(load10){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -2, yco, zco + 2 * chunkWidth), Quaternion.identity);} 
    if(load11){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -2, yco, zco + chunkWidth), Quaternion.identity);} 
    if(load12){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -2, yco, zco), Quaternion.identity);} 
    if(load13){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -2, yco, zco * -1), Quaternion.identity);} 
    if(load14){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -2, yco, zco + -2 * chunkWidth), Quaternion.identity);} 
    if(load15){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -1, yco, zco + 2 * chunkWidth), Quaternion.identity);} 
    if(load16){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth * -1, yco, zco + -2 * chunkWidth), Quaternion.identity);} 
    if(load17){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco, yco, zco + 2 * chunkWidth), Quaternion.identity);} 
    if(load18){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco, yco, zco + -2 * chunkWidth), Quaternion.identity);} 
    if(load19){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth, yco, zco + 2 * chunkWidth), Quaternion.identity);} 
    if(load20){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + chunkWidth, yco, zco + -2 * chunkWidth), Quaternion.identity);} 
    if(load21){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + 2 * chunkWidth, yco, zco + 2 * chunkWidth), Quaternion.identity);} 
    if(load22){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + 2 * chunkWidth, yco, zco + chunkWidth), Quaternion.identity);} 
    if(load23){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + 2 * chunkWidth, yco, zco), Quaternion.identity);} 
    if(load24){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + 2 * chunkWidth, yco, zco * -1), Quaternion.identity);} 
    if(load25){Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(xco + 2 * chunkWidth, yco, zco + -2 * chunkWidth), Quaternion.identity);}  
    yield WaitForSeconds(5); 
    var canGenerate = true; 
} 


function generateOnStart() { 
    //MOET EEN FUNCTION WORDEN DIE ALS DE SPELER EEN NIEUWE WERELD START, DAT ER AL EEN KLEIN TERREIN KOMT 
    //V1 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(0, 0, 0), Quaternion.identity); 
    //V2 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(50, 0, 50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(50, 0, 0), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(50, 0, -50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-50, 0, 50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-50, 0, 0), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-50, 0, -50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(0, 0, 50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(0, 0, -50), Quaternion.identity); 
    //V3 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-100, 0, 100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-100, 0, 50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-100, 0, 0), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-100, 0, -50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-100, 0, -100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-50, 0, 100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(-50, 0, -100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(0, 0, 100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(0, 0, -100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(50, 0, 100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(50, 0, -100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(100, 0, 100), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(100, 0, 50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(100, 0, 0), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(100, 0, -50), Quaternion.identity); 
    Instantiate(terrains[Random.Range(0,terrains.length)], Vector3(100, 0, -100), Quaternion.identity); 
} 

chunkRename.js

#pragma strict 

function Start() { 
    this.name = "Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 


} 

function OnTriggerEnter (col : Collider) { 
    if(col.gameObject.tag == "Player") { 
     this.name = "ACTIVE_Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 
    } 
} 

function OnTriggerExit (col : Collider) { 
    if(col.gameObject.tag == "Player") { 
     this.name = "Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 
     gameObject.Find("First Person Controller").SendMessage("callGenerate"); 
    } 
} 
+0

它違反規則嗎?我很抱歉我要編輯它。 – Jordi

+5

這段代碼亂七八糟。我類似於問你是否聽說過數組,但後來發現你已經在某些地方使用了它們。嚴重:使用塊[25]不是25個不同的變量。 – LearnCocos2D

回答

6

首先,改變你的25行實例化的這樣:

for (int i = -2; i< 3; i++) 
    { 
     for (int j = -2; j < 3; j++) 
     { 
      Instantiate(terrains[Random.Range(0,terrains.length)], 
          Vector3(j*50, 0, i*50), Quaternion.identity); 
     } 
    } 

其次,你已經在這個調用遊戲對象,所以不要用GameObject.Find()//它的價格昂貴 所以假設被標記爲「玩家」的對象有FPS控制器,更改:

if(col.gameObject.tag == "Player") { 
    this.name = "Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 
    gameObject.Find("First Person Controller").SendMessage("callGenerate"); 
} 

要:

if(col.gameObject.tag == "Player") { 
    this.name = "Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 
    col.gameObject.SendMessage("callGenerate"); 
} 

最後,它看起來像要基於已關閉的其中t你們這一代代碼他的球員目前是。而不是在OnTriggerExit做到這一點,把它放在OnTriggerEnter(),然後通過觸發器對象對你的作用,從需要找到在callGenerate方法活動對象爲您節省:

function OnTriggerEnter (col : Collider) { 
if(col.gameObject.tag == "Player") { 
    this.name = "ACTIVE_Chunk (" + this.transform.position.x + ", " + this.transform.position.y + ", " + this.transform.position.z + ")"; 
    col.gameObject.SendMessage("callGenerate", this.gameObject); 
    } 
} 

function callGenerate(go: GameObject) { 
    if(canGenerate) { 
     canGenerate = false; //you were redeclaring this variable here, 
     //which is mostly likely why you had more generation going on than desired 
     generateFromMiddleOfChunk(go.transform.position); 
    } 
} 

我不能找到你正在保存塊的位置,但是你會想要這樣做,只能生成所需的新塊。

相關問題