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