Создайте ландшафт из перлин-шума

Поэтому я пытался создать мир бесконечного и динамичного поколения, похожего на Minecraft, и использовал Perlin Noise, чтобы получить случайный, но гладкий ландшафт. Я использую Unity (версия 5.0.2f1, в настоящее время), поэтому извините за любые вещи, не связанные с чистым JavaScript.

(Просто чтобы быть в безопасности, я напомню людям, которые не знакомы с Unity Game Engine, что Start() называется первый кадр и yield; говорит двигателю перейти к следующему кадру, не дожидаясь завершения.)

Что происходит, так это то, что оба Start() функция и конструктор на самом деле работают, но конструктор не может вызвать GenerateFloor(),

Любая помощь приветствуется. Спасибо теперь.

Код (UnityScript):

#pragma strict

/*
This creates only one chunk so it should be called once for each chunk to be generated
*/

var size = 256; //"Blocks" in a chunk, note that a chunk has to be a square prism because the size is square rooted to generate each side.

var x : float;
var y : float;
var z : float;

var currentX : float;//Note : The first block in the
var currentZ : float;//chunk is (0, 0) and not (1, 1).

public var seed : int;

var heightMap : Vector3[];

print(Mathf.PerlinNoise(currentX, currentZ));

function Start(){
    TerrainGenerator(new Vector3(10, 20, 30));
    print("Start() is working"); //For debug
}

function TerrainGenerator(coords : Vector3){
    x = coords.x;
    y = coords.y;
    z = coords.z;
    print("Constructor worked.");//For debug
}

function Generate(){
    GenerateFloor();
    GenerateCaves();
}

function GenerateFloor(){
    print("GenerateFloor() was called");//For debug
    if(!(seed > 0)){
        Debug.LogError("Seed not valid. Seed: " + seed + " .");
        seed = Random.Range(0, 1000000000000000);
        Debug.LogError("Generated new seed. Seed: " + seed + ".");
    }
    for(var i = 0; i < heightMap.length; i++){
        if(currentX == Math.Sqrt(size)){
            currentX = 0;
            currentZ++;
        }
        else if(currentX > Math.Sqrt(size)) Debug.LogError("How did this happen?! currentX = " + currentX + " size = " + size + " .");
        var height = Mathf.PerlinNoise(currentX, currentZ);
        heightMap[currentX * currentZ] = new Vector3(currentX, height, currentZ);
        print("For loop worked");//For debug
        yield;
    }
}

function GenerateCaves(){
    //Coming soon
}

1 ответ

Вы не должны использовать Конструкторы с Unity, так как сам Unity создаст экземпляр и затем вызовет функцию Start(). Используйте Start() и Awake (), чтобы делать то, что вы обычно делаете в конструкторе (например, вызывать функцию генерации ландшафта). Я также настоятельно рекомендую вам взять C#.

Таким образом, мой подход заключается в установке x,y,z и размера в инспекторе GameObject, к которому прикреплен ваш скрипт. Затем в Start() вызовите функцию Generate().

Другие вопросы по тегам