我正在开发一种使用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重新分配,但我希望有更好的方法来做到这一点。如果没有,那就是统一设计缺陷或错误。
感谢您的回复。