3

我正在开发一个游戏,它使用基于 Unity 块的程序地形生成。我的地形必须在运行时进行 splatmapped,所以我开发了一种算法来做到这一点。

我使用“块”预制件,每次世界生成器决定创建新片段时都会实例化。每个块都有一个地形组件以及我的脚本来执行 splatmapping(以及未来的高度生成)。问题是,当我实例化预制件时,预制件仍然使用相同的包含高度和 splatmaps 的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 是一个只读数组,更改其元素似乎无济于事(我在两个调试 .pngs 中得到相同的输出文件)

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

感谢您的任何回复。

4

0 回答 0