При создании ландшафта Unity3d создается множество префиксов

#algorithm #unity3d #unityscript

#алгоритм #unity-игровой движок #unityscript

Вопрос:

У меня есть блок кода в моей функции ‘Update ()’, которая получает активный фрагмент в моей сцене, когда она находит этот фрагмент, она передает эти координаты функции ‘generateFromMiddleOfChunk ()’. Эта функция будет генерировать все фрагменты в радиусе 3 вокруг проигрывателя, она делает это с помощью 25 функций ‘Instantiate ()’ и формулы. Но он должен создавать экземпляры только тех фрагментов, где их еще нет. Он этого не делает, если бы кто-нибудь мог взглянуть на мой код, я был бы очень признателен за это. Прошу прощения за очень повторяющийся код и множество Debug.Log() функций. Мы высоко ценим любую помощь, большое вам спасибо.

Джорди,

У меня есть этот блок кода в моей Update() функции:

 function Update() {
    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;
            Debug.Log(xco.ToString() yco.ToString() zco.ToString());
            generateFromMiddleOfChunk(xco, yco, zco);
            }                   
    }
}
  

Этот блок кодов получает фрагмент в моей сцене и получает его координаты x, y и z, он передает эти координаты generateFromMiddleOfChunk() функции. Эта функция выглядит следующим образом:

 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[];

    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") {
                    var oldXco = chunksInScene[i].transform.position.x;
                    var oldYco = chunksInScene[i].transform.position.y;
                    var oldZco = chunksInScene[i].transform.position.z;

                    oldChunk1 = "Chunk ("   oldXco.ToString()   ", "   oldYco.ToString()   ", "   oldZco.ToString()   ")";
                    oldChunk2 = "Chunk ("   (oldXco   chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco chunkWidth).ToString()   ")";
                    oldChunk3 = "Chunk ("   (oldXco   chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   oldZco.ToString()   ")";
                    oldChunk4 = "Chunk ("   (oldXco   chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco * -1).ToString()   ")";
                    oldChunk5 = "Chunk ("   (oldXco   chunkWidth * -1).ToString()   ", "   oldYco.ToString()   ", "   (oldZco chunkWidth).ToString()   ")";
                    oldChunk6 = "Chunk ("   (oldXco   chunkWidth * -1).ToString()   ", "   oldYco.ToString()   ", "   oldZco.ToString()   ")";
                    oldChunk7 = "Chunk ("   (oldXco   chunkWidth * -1).ToString()   ", "   oldYco.ToString()   ", "   (oldZco * -1).ToString()   ")";
                    oldChunk8 = "Chunk ("   oldXco.ToString()   ", "   oldYco.ToString()   ", "   (oldZco   chunkWidth).ToString()   ")";
                    oldChunk9 = "Chunk ("   oldXco.ToString()   ", "   oldYco.ToString()   ", "   (oldZco * -1).ToString()   ")";
                    oldChunk10= "Chunk ("   (oldXco   chunkWidth * -2).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   2 * chunkWidth).ToString()   ")";
                    oldChunk11= "Chunk ("   (oldXco   chunkWidth * -2).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   chunkWidth).ToString()   ")";
                    oldChunk12= "Chunk ("   (oldXco   chunkWidth * -2).ToString()   ", "   oldYco.ToString()   ", "   oldZco.ToString()   ")";
                    oldChunk13= "Chunk ("   (oldXco   chunkWidth * -2).ToString()   ", "   oldYco.ToString()   ", "   (oldZco * -1).ToString()   ")";
                    oldChunk14= "Chunk ("   (oldXco   chunkWidth * -2).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   -2 * chunkWidth).ToString()   ")";
                    oldChunk15= "Chunk ("   (oldXco   chunkWidth * -1).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   2 * chunkWidth).ToString()   ")";
                    oldChunk16= "Chunk ("   (oldXco   chunkWidth * -1).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   -2 * chunkWidth).ToString()   ")";
                    oldChunk17= "Chunk ("   oldXco.ToString()   ", "   oldYco.ToString()   ", "   (oldZco   2 * chunkWidth).ToString()   ")";
                    oldChunk18= "Chunk ("   oldXco.ToString()   ", "   oldYco.ToString()   ", "   (oldZco   -2 * chunkWidth).ToString()   ")";
                    oldChunk19= "Chunk ("   (oldXco   chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   2 * chunkWidth).ToString()   ")";
                    oldChunk20= "Chunk ("   (oldXco   chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   -2 * chunkWidth).ToString()   ")";
                    oldChunk21= "Chunk ("   (oldXco   2 * chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   2 * chunkWidth).ToString()   ")";
                    oldChunk22= "Chunk ("   (oldXco   2 * chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   chunkWidth).ToString()   ")";
                    oldChunk23= "Chunk ("   (oldXco   2 * chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   oldZco.ToString()   ")";
                    oldChunk24= "Chunk ("   (oldXco   2 * chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco * -1).ToString()   ")";
                    oldChunk25= "Chunk ("   (oldXco   2 * chunkWidth).ToString()   ", "   oldYco.ToString()   ", "   (oldZco   -2 * chunkWidth).ToString()   ")";
            }
        }
    }

    if(oldChunk1.Equals(chunk1)){load1 = false;}
    if(oldChunk2.Equals(chunk2)){load2 = false;}
    if(oldChunk3.Equals(chunk3)){load3 = false;}
    if(oldChunk4.Equals(chunk4)){load4 = false;}
    if(oldChunk5.Equals(chunk5)){load5 = false;}
    if(oldChunk6.Equals(chunk6)){load6 = false;}
    if(oldChunk7.Equals(chunk7)){load7 = false;}
    if(oldChunk8.Equals(chunk8)){load8 = false;}
    if(oldChunk9.Equals(chunk9)){load9 = false;}
    if(oldChunk10.Equals(chunk10)){load10 = false;}
    if(oldChunk11.Equals(chunk11)){load11 = false;}
    if(oldChunk12.Equals(chunk12)){load12 = false;}
    if(oldChunk13.Equals(chunk13)){load13 = false;}
    if(oldChunk14.Equals(chunk14)){load14 = false;}
    if(oldChunk15.Equals(chunk15)){load15 = false;}
    if(oldChunk16.Equals(chunk16)){load16 = false;}
    if(oldChunk17.Equals(chunk17)){load17 = false;}
    if(oldChunk18.Equals(chunk18)){load18 = false;}
    if(oldChunk19.Equals(chunk19)){load19 = false;}
    if(oldChunk20.Equals(chunk20)){load20 = false;}
    if(oldChunk21.Equals(chunk21)){load21 = false;}
    if(oldChunk22.Equals(chunk22)){load22 = false;}
    if(oldChunk23.Equals(chunk23)){load23 = false;}
    if(oldChunk24.Equals(chunk24)){load24 = false;}
    if(oldChunk25.Equals(chunk25)){load25 = false;}
    Debug.Log("1"   chunk1   oldChunk1   load1);
    Debug.Log("2"   chunk2   oldChunk2   load2);
    Debug.Log("3"   chunk3   oldChunk3   load3);
    Debug.Log("4"   chunk4   oldChunk4   load4);
    Debug.Log("5"   chunk5   oldChunk5   load5);
    Debug.Log("6"   chunk6   oldChunk6   load6);
    Debug.Log("7"   chunk7   oldChunk7   load7);
    Debug.Log("8"   chunk8   oldChunk8   load8);
    Debug.Log("9"   chunk9   oldChunk9   load9);
    Debug.Log("10"   chunk10   oldChunk10   load10);
    Debug.Log("11"   chunk11   oldChunk11   load11);
    Debug.Log("12"   chunk12   oldChunk12   load12);
    Debug.Log("13"   chunk13   oldChunk13   load13);
    Debug.Log("14"   chunk14   oldChunk14   load14);
    Debug.Log("15"   chunk15   oldChunk15   load15);
    Debug.Log("16"   chunk16   oldChunk16   load16);
    Debug.Log("17"   chunk17   oldChunk17   load17);
    Debug.Log("18"   chunk18   oldChunk18   load18);
    Debug.Log("19"   chunk19   oldChunk19   load19);
    Debug.Log("20"   chunk20   oldChunk20   load20);
    Debug.Log("21"   chunk21   oldChunk21   load21);
    Debug.Log("22"   chunk22   oldChunk22   load22);
    Debug.Log("23"   chunk23   oldChunk23   load23);
    Debug.Log("24"   chunk24   oldChunk24   load24);
    Debug.Log("25"   chunk25   oldChunk25   load25);
    /*    
    //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);}     
    */
}
  

Комментарии:

1. Вау… Существует гораздо более простой и эффективный способ сделать это… Генерация рельефа Google voxel 🙂

2. Хммм, я вижу, это действительно намного проще сделать, но я не хочу, чтобы мой ландшафт был блочным

3. Ох… Я предположил, что вы делаете заблокированный ландшафт из-за «куба», который находится в названии этого вопроса… Концепция для обычного ландшафта по-прежнему аналогична, так что вы могли бы разобраться с этим, используя те же методы, которые только что изменили…

4. Хорошо, спасибо вам за вашу помощь 🙂 Но видите ли вы что-нибудь, что могло бы вызвать это странное поведение? Я изменю название, это действительно сбивает с толку.

5. Извините, понятия не имею. Я только что удалил тег javascript, поскольку unityscript не является javascript

Ответ №1:

http://answers.unity3d.com/questions/177931/tutorial-minecraft-chunks.html

Это ссылка на UnityAnswers с руководством о том, как создавать фрагменты в Unity3D. Вы можете посмотреть там больше информации и, надеюсь, получить ответ на свой вопрос.