问题是:通常情况下,脚本应该在玩家周围的立方体中生成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");
}
}
首先,将您的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,所以不要使用gameobject . find()//它太昂贵了所以假设标记为"Player"的对象具有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");
}
最后,从你的代码来看,你想让你的生成基于玩家当前的位置。与其在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);
}
}
我找不到你在哪里保存你的块,但你会想要这样做,你只生成新的块,需要