为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 SetAlphamaps 设置为某一特定纹理?

如何将 SetAlphamaps 设置为某一特定纹理?

PHP
不负相思意 2024-01-21 10:15:39
我想用特定的纹理改变我的地形的纹理。我对设置 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 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

返回的数据由GetAlphamaps

返回的数组是三维的 - 前两个维度表示地图上的 x 和 y 坐标,而第三个维度表示应用 alphamap 的 splatmap 纹理。

或者简单来说就是“float[x, y, l]哪里”

  • x= 宽度(以像素为单位)

  • y= 高度(以像素为单位)

  • l= 纹理层

假设您想将其设置为该像素坐标处的某个纹理,您要做的就是

  • 将纹理层的权重设置为1

  • 将所有其他层权重设置为0

假设您有 3 层,并且您希望第二层(=索引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, l] = values[l] == toLayer ? 1 : 0;

            }

        }

    }


    terrainData.SetAlphamaps (mapX, mapZ, splatmapData);

    terrain.Flush ();

}

现在你可以简单地称它为例如


ChangeTexture(somePosition, TerrainLayer.Green);


查看完整回答
反对 回复 2024-01-21
  • 1 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信