Terrain运行时动态更新地形Texture
我实现了一个demo,可以让物体在地形上随便移动,在地形上路径所经过地方的纹理会被改变、
完整代码
实现原理
- 获取地形对象 (可以把脚本挂在地形上)
// 类中成员变量的声明
private Terrain m_terrain = null;
// 在Start()中从地形对象中获取Terrain组件
m_terrain = GetComponent<Terrain>();
- 在
terrainData
下获取alphamap
的信息
// 在Start()中获取获取alphamap的宽和高
// 默认都是正方形纹理
m_terrainAlphaWidth = m_terrain.terrainData.alphamapWidth;
m_terrainAlphaHeight = m_terrain.terrainData.alphamapHeight;
// 获取地形大小(正方形)
Vector3 terrainDataSize = m_terrain.terrainData.size;
// 获取地形大小与alphamap的转换算子,后面做地形上物体位置映射到alphamap上的位置时做转换所需
// private float D2ARate = 0;
D2ARate = terrainDataSize.x / m_terrainAlphaWidth;
- 根据物体所在的位置坐标更新地形的纹理
我实现的的方式是在协程中替换纹理
public IEnumerator CoTerrainUpdate()
{
// Replacing the terrain texture with the scorch mark texture?
float y = moveObject.position.x / D2ARate;
float x = moveObject.position.z / D2ARate;
UpdateTexture((int) Math.Ceiling(x), (int) Math.Ceiling(y, m_scorchmarkTexture);
UpdateTexture((int) Math.Floor(x), (int) Math.Floor(y),m_scorchmarkTexture);
UpdateTexture((int) Math.Ceiling(x), (int) Math.Floor(y),m_scorchmarkTexture);
UpdateTexture((int) Math.Floor(x), (int) Math.Ceiling(y),m_scorchmarkTexture);
m_terrain.terrainData.SetAlphamaps(0, 0, m_terrainTexture;
yield return null;
}
这里要特别注意:
float y = moveObject.position.x / D2ARate;
float x = moveObject.position.z / D2ARate;
世界坐标x -> alphamap
的y
世界坐标y -> alphamap
的x