程序地形生成不复制splatmaps

时间:2015-07-09 13:06:30

标签: unity3d terrain procedural-generation unity5

我正在开发一种使用Unity的基于块的程序性地形生成的游戏。我的地形必须在运行时进行splatmap,因此我开发了一种算法来实现这一点。

我使用“chunk”预制件,每次世界生成器决定创建新片段时都会实例化。每个块都有一个terrain组件以及我的脚本来执行splatmapping(以及将来生成高度)。问题是,当我实例化预制件时,预制件仍然使用包含高度和splatmaps的相同TerrainData对象,因此一个块中的每个更改也会影响其他块。

我发现我可以从预制件中实例化terrainData来克隆它,它解决了一半的问题。现在我可以独立更改高度图,但splatmaps似乎仍然连接。

void Start() 
{
    map = GetComponentInParent<MapGenerator>();
    terrain = GetComponent<Terrain>();

    //Copy terrain data, solves heightmap problems
    terrain.terrainData = GameObject.Instantiate(terrain.terrainData);

    //Try to generate new splatmaps
    for (int i = 0; i < terrain.terrainData.alphamapTextures.Length; i++)
    {
        //Debug before changing
        File.WriteAllBytes(Application.dataPath + "/../SPLAT_" + i + ".png", terrain.terrainData.alphamapTextures[i].EncodeToPNG());
        //Try to change
        terrain.terrainData.alphamapTextures[i] = new Texture2D(terrain.terrainData.alphamapHeight, terrain.terrainData.alphamapWidth);
        //Debug after changing
        File.WriteAllBytes(Application.dataPath + "/../SPLAT_x" + i + ".png", terrain.terrainData.alphamapTextures[i].EncodeToPNG());
    }

    //Calculate chunk offset
    offset = new Vector2(transform.localPosition.x * (terrain.terrainData.alphamapHeight / terrain.terrainData.size.x),
        transform.localPosition.z * (terrain.terrainData.alphamapWidth / terrain.terrainData.size.z));

    //Splatting usually happens here
    //SplatMap();   
}

不幸的是,这段代码不起作用。 alphamapTextures是一个只读数组,改变它的元素似乎什么都不做(我在两个debug .pngs中得到相同的输出文件)

我知道我可以使用反射并强制alphamapTextures重新分配,但我希望有更好的方法来做到这一点。如果没有,那就是统一设计缺陷或错误。

感谢您的回复。

0 个答案:

没有答案