C# 实例化地形区域内的对象 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共类传送:单行为{ 公共矢量3 terrainArea; 公共浮动转速=2.0f; 公共互联网传输; 公共游戏对象预制; 私有布尔旋转=假; 私有布尔退出=假; 私人传送; 私有随机rnd=新随机(); 私有void Start() { GameObject go=GameObject.Find(“地形”); 地形地形=go.GetComponent(地形); terrainArea=地形.terrainData.size; for(int i=0;i

C# 实例化地形区域内的对象 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共类传送:单行为{ 公共矢量3 terrainArea; 公共浮动转速=2.0f; 公共互联网传输; 公共游戏对象预制; 私有布尔旋转=假; 私有布尔退出=假; 私人传送; 私有随机rnd=新随机(); 私有void Start() { GameObject go=GameObject.Find(“地形”); 地形地形=go.GetComponent(地形); terrainArea=地形.terrainData.size; for(int i=0;i,c#,unity3d,unity5,C#,Unity3d,Unity5,现在一些游戏对象已经离开了地形区域。 我想做的是保持克隆体处于随机位置,但只在地形区域内 如何实例化地形区域内的对象?我注意到您正在创建Random类的新实例。不要在Unity的API中这样做。只是用来生成随机数 至于在地形上生成随机游戏对象: 1。查找X位置: 最终随机X应为: Min = terrain.terrainData.size.x. Max = terrain.transform.position.x + terrain.terrainData.size.x. Min = te

现在一些游戏对象已经离开了地形区域。 我想做的是保持克隆体处于随机位置,但只在地形区域内


如何实例化地形区域内的对象?

我注意到您正在创建
Random
类的新实例。不要在Unity的API中这样做。只是用来生成随机数

至于在地形上生成随机游戏对象:

1。查找X位置:

最终随机X应为:

Min = terrain.terrainData.size.x.

Max = terrain.transform.position.x + terrain.terrainData.size.x.
Min = terrain.transform.position.z;

Max = terrain.transform.position.z + terrain.terrainData.size.z;

2。找到Z位置:

最终随机Z应为:

Min = terrain.terrainData.size.x.

Max = terrain.transform.position.x + terrain.terrainData.size.x.
Min = terrain.transform.position.z;

Max = terrain.transform.position.z + terrain.terrainData.size.z;

3。查找Y位置:

y轴不必是随机的。不过,如果需要,可以将其设置为随机值

它只需要在地形上,这样实例化的对象就不会在地形下

这就是我们的目标。必须使用此功能才能完美生成不在地形下的位置。您需要#1#2的结果才能使用此选项:

 randZ = UnityEngine.Random.Range(Min, Min + Max);
如果要将偏移应用于y轴,此时可以执行此操作

yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));

下面是一个一般的例子。您必须使用此示例来扩展当前代码

yVal = yVal + yOffset;

我没有看到地形区域…@MelO'Hagan对,我用地形大小部分更新了我的问题。很抱歉
public GameObject prefab;
public Terrain terrain;
public float yOffset = 0.5f;

private float terrainWidth;
private float terrainLength;

private float xTerrainPos;
private float zTerrainPos;


void Start()
{
    //Get terrain size
    terrainWidth = terrain.terrainData.size.x;
    terrainLength = terrain.terrainData.size.z;

    //Get terrain position
    xTerrainPos = terrain.transform.position.x;
    zTerrainPos = terrain.transform.position.z;

    generateObjectOnTerrain();
}

void generateObjectOnTerrain()
{
    //Generate random x,z,y position on the terrain
    float randX = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
    float randZ = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
    float yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));

    //Apply Offset if needed
    yVal = yVal + yOffset;

    //Generate the Prefab on the generated position
    GameObject objInstance = (GameObject)Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity);
}