Как установить SetAlphamaps для одной определенной текстуры? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу изменить текстуру моего ландшафта с определенной текстурой. я запутался, чтобы установить splatmapdata, кто-нибудь может мне помочь ??

private void ChangeTexture(Vector3 WorldPos)
{
    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(3, 3, 15, 15);
    terrainData.SetAlphamaps (mapX, mapZ, splatmapData);
    terrain.Flush ();
}

1 Ответ

1 голос
/ 30 сентября 2019

Данные, возвращаемые 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...