Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity/C#-更改绘制地形的笔刷大小_C#_Unity3d_Terrain_Heightmap - Fatal编程技术网

Unity/C#-更改绘制地形的笔刷大小

Unity/C#-更改绘制地形的笔刷大小,c#,unity3d,terrain,heightmap,C#,Unity3d,Terrain,Heightmap,我正在为unity编写一个运行时地形编辑器,但遇到了问题。 起初,我只想用文字描绘地形。我发现了这段代码,它工作得很好: 脚本:TerrainPainter void Paint(Vector3 point) { mapX = (int)(((point.x - terrainPosition.x) / terrainData.size.x) * heightmapWidth); mapY = (int)(((point.z - terrainPosition.z) / terr

我正在为unity编写一个运行时地形编辑器,但遇到了问题。 起初,我只想用文字描绘地形。我发现了这段代码,它工作得很好:

脚本: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);
}
    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);
}
    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);
}
但现在我想画不同尺寸/厚度的画。我还有另一个脚本,叫做Terrainmodifier,我用它来升高和降低地形。在这里,我有以下几句话要表达:

脚本:Terrainmodifier

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);
}
    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);
}
    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);
}
public void RaiseTerrain(地形、矢量3位置、浮动效应增量)
{
int offset=有效面积/2;
//--1--
Vector3 tempCoord=(位置-terrain.GetPosition());
矢量3坐标;
坐标=新矢量3(
(tempCoord.x/GetTerrainSize().x),
(tempCoord.y/GetTerrainSize().y),
(tempCoord.z/GetTerrainSize().z)
);
矢量3位置Interrain=新矢量3(坐标x*地形高度宽度,0,坐标z*地形高度);
//完--1--
// --2--
int terX=(int)locationInTerrain.x-偏移量;
int terZ=(int)locationInTerrain.z-偏移量;
//完(二)--
// --3--
float[,]heights=targetTerrainData.GetHeights(terX、terZ、Area of EffectSize、Area of EffectSize);
对于(int xx=0;xx
所以我想我可以用它作为一种帮助,并转移它。因此,我选择了GetAlphamaps()而不是GetHeights(),并添加了变量Area of EffectSize

脚本: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);
}
    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);
}
    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);
}
void绘制(矢量3点)
{
// --1--
mapX=(int)((point.x-terrainPosition.x)/terrainData.size.x)*高度贴图宽度);
mapY=(int)((point.z-terrainPosition.z)/terrainData.size.z)*heigtmapHeight);
//完--1--
// --2--
int-terX=(int)mapX-(有效面积/2);
int-terY=(int)mapY-(有效面积/2);
//完(二)--
// --3--
splatmapData=terrainData.GetAlphamaps(terX、terY、Area of EffectSize、Area of EffectSize);
对于(int xx=0;xx
希望某人能帮我找到我的错误。如何更改“笔刷”的大小


编辑:我在代码中写了注释以查看传输的/相关的行。

哦,伙计们,我犯了一个愚蠢的错误。通过将splatmapData传递到SetAlphamaps-,解决了此问题- 因此,解决方案是:

[……]

for(int xx=0;xx
“但它不起作用”有点含糊不清。请说明你期望它做什么,它做什么。嘿,我想改变我的“刷子”的大小。所以我还创建了一个effectSize的可变区域并使用了GetAlphamaps,因为在Terrainmodifier脚本中我使用了GetHeights。但它仍然以相同的厚度/尺寸绘制