Данные, возвращаемые GetAlphamaps
Возвращенный массив является трехмерным - первые два измерения представляют координаты x и y на карте, а третье обозначаеттекстура splatmap, к которой применяется альфа-карта.
Или простыми словами a float[x, y, l]
, где
x
= ширина в пикселях y
= высота в пикселях l
= Texture-Layer
Итак, давайте предположим, что вы хотите установить определенную текстуру с этими пиксельными координатами, что вы делаете
- установите вес слоя текстуры на
1
- установите вес всех остальных слоев на
0
Итак, скажем, у вас есть, например, 3Слои, и вы хотите, чтобы второй (= index 1
) был полностью взвешенной текстурой:
float[,,] splatmapData = terrainData.GetAlphamaps(mapX, mapZ, 15, 15);
// Iterate over x-y coordinates within the array
for(var y = 0; i < 15; y++)
{
for(var x = 0; x < 15; x++)
{
// Set first layers weight to 0
splatmapData[x, y, 0] = 0;
// Set second layer's weight to 1
splatmapData[x, y, 1] = 1;
// Set third layer's weight to 0
splatmapData[x, y, 2] = 0;
}
}
terrainData.SetAlphamaps(mapX, mapZ, splatmapData);
Затем я бы реализовал enum
для слоев, например, скажем
public enum TerrainLayer
{
Default = 0,
Green,
Red
}
, поэтому вы можете просто передать соответствующий индекс слоя в качестве параметра - немного более безопасный, чем передача int
сами значения:
private void ChangeTexture(Vector3 worldPos, TerrainLayer toLayer)
{
print ("changeTexture");
int mapX = (int)(((worldPos.x - terrainPos.x) / terrainData.size.x) * terrainData.alphamapWidth);
int mapZ = (int)(((worldPos.z - terrainPos.z) / terrainData.size.z) * terrainData.alphamapHeight);
float[,,] splatmapData = terrainData.GetAlphamaps(mapX, mapZ, 15, 15);
for(var z = 0; z < 15; z++)
{
for(var x = 0; x < 15; x++)
{
// This ofcourse would be more efficient if you do this only once
// e.g. in Awake since the enum won't change on runtime
var values = (TerrainLAyer[])Enum.GetValues(typeof(TerrainLayer));
// Iterate through the enum and
for(var l = 0; l < values.Length; l++)
{
// set all layers to 0 except the toLayer
splatmapData[x, z, 0] = values[l] == toLayer ? 1 : 0;
}
}
}
terrainData.SetAlphamaps (mapX, mapZ, splatmapData);
terrain.Flush ();
}
Теперь вы бы просто назвали его, например,
ChangeTexture(somePosition, TerrainLayer.Green);