【问题标题】:Unity/C# - Change size of brush for painting terrainUnity/C# - 更改画笔大小以绘制地形
【发布时间】:2018-10-26 13:09:20
【问题描述】:

我正在编写一个运行时地形编辑器以实现统一,但遇到了问题。 起初我只想用 textrue 绘制地形。我找到了这段代码,它运行良好:

脚本:TerrainPainter

void Paint(Vector3 point)
{
    mapX = (int)(((point.x - terrainPosition.x) / terrainData.size.x) * heightmapWidth);
    mapY = (int)(((point.z - terrainPosition.z) / terrainData.size.z) * heigtmapHeight);

    splatmapData[mapY, mapX, 0] = element[0, 0, 0] = 0;
    splatmapData[mapY, mapX, 1] = element[0, 0, 1] = 1;

    terrain.terrainData.SetAlphamaps(mapX, mapY, element);
}

但现在我想用不同的尺寸/厚度进行绘画。我有另一个脚本,名为 Terrainmodifier,我用它来升高和降低地形。我有这句话要提高:

脚本:地形修饰符

    public void RaiseTerrain(Terrain terrain, Vector3 location, float effectIncrement)
{
    int offset = areaOfEffectSize / 2;

    //--1--
    Vector3 tempCoord = (location - terrain.GetPosition());
    Vector3 coord;

    coord = new Vector3(
        (tempCoord.x / GetTerrainSize().x),
        (tempCoord.y / GetTerrainSize().y),
        (tempCoord.z / GetTerrainSize().z)
        );

    Vector3 locationInTerrain = new Vector3(coord.x * terrainHeightMapWidth, 0, coord.z * terrainHeightMapHeight);
    // End --1--

    // --2--
    int terX = (int)locationInTerrain.x - offset;
    int terZ = (int)locationInTerrain.z - offset;
    // End --2--

    // --3--
    float[,] heights = targetTerrainData.GetHeights(terX, terZ, areaOfEffectSize, areaOfEffectSize);

    for (int xx = 0; xx < areaOfEffectSize; xx++)
    {
        for (int yy = 0; yy < areaOfEffectSize; yy++)
        {
            heights[xx, yy] += (effectIncrement * Time.smoothDeltaTime);
        }
    }

    targetTerrainData.SetHeights(terX, terZ, heights);
}

所以我想我可以用它作为辅助并转移它。所以我使用 GetAlphamaps() 而不是 GetHeights() 并添加了变量 areaOfEffectSize

脚本:TerrainPainter

    void Paint(Vector3 point)
{

    // --1--
    mapX = (int)(((point.x - terrainPosition.x) / terrainData.size.x) * heightmapWidth);
    mapY = (int)(((point.z - terrainPosition.z) / terrainData.size.z) * heigtmapHeight);
    // End --1--

    // --2--
    int terX = (int)mapX - (areaOfEffectSize / 2);
    int terY = (int)mapY - (areaOfEffectSize / 2);
    // End --2--

    // --3--
    splatmapData = terrainData.GetAlphamaps(terX, terY, areaOfEffectSize, areaOfEffectSize);

    for(int xx = 0; xx < areaOfEffectSize; xx++)
    {
        for (int yy = 0; yy < areaOfEffectSize; yy++)
        {
            splatmapData[yy, xx, 1] = element[0, 0, 1] = 1;
        }
    }
    terrain.terrainData.SetAlphamaps(terX, terY, element);
}

希望某人能帮助我找出我的错误。如何更改“画笔”的大小?

编辑:我将 cmets 写入代码中以查看转移/相关的行。

【问题讨论】:

  • “但它不起作用”有点含糊。请说明您希望它做什么,以及它做什么。
  • 嘿,我想改变我的“画笔”的大小。所以我还创建了一个变量 areaOfEffectSize 并使用了 GetAlphamaps,因为在我的 Terrainmodifier-Script 中我使用了 GetHeights。但它仍然以相同的厚度/尺寸绘制

标签: c# unity3d terrain heightmap


【解决方案1】:

哦,伙计们,我犯了一个愚蠢的错误。通过将 splatmapData 传递给 SetAlphamaps 解决了这个问题 -.- 所以解决办法是:

[..]

        for (int xx = 0; xx < areaOfEffectSize; xx++)
    {
        for (int yy = 0; yy < areaOfEffectSize; yy++)
        {
            splatmapData[yy, xx, 0] = 0;
            splatmapData[yy, xx, 1] = 1;
        }
    }
    terrain.terrainData.SetAlphamaps(terX, terY, splatmapData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多