实例化地形区域内的对象

Instantiate objects within the terrain area

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Teleport : MonoBehaviour {

    public Vector3 terrainArea;
    public float spinSpeed = 2.0f;
    public int cloneTeleportations;
    public GameObject prefab;

    private bool rotate = false;
    private bool exited = false;
    private Transform[] teleportations;
    private Random rnd = new Random();

    private void Start()
    {

        GameObject go = GameObject.Find("Terrain");            
        Terrain terrain = go.GetComponent(Terrain);
        terrainArea = terrain.terrainData.size;

        for (int i = 0; i < cloneTeleportations; i++)
        {
            GameObject Teleportaion = Instantiate(prefab, new Vector3(Random.Range(i * 10.0F, i * 50.0F), 0, Random.Range(i * 10.0F, i * 50.0F)), Quaternion.identity);
            Teleportaion.transform.parent = this.transform;
            Teleportaion.transform.tag = "Teleportation";
        }
    } 
}

现在一些游戏对象超出了地形区域。 我想做的是让克隆体在随机位置,但只在地形区域内。

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

我注意到您正在创建 Random class 的新实例。不要用 Unity 的 Random API. Just use Random.Range 来生成随机数。

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

1.求X位置:

Min = terrain.terrainData.size.x.

Max = terrain.transform.position.x + terrain.terrainData.size.x.

最终的随机X应该是:

randX = UnityEngine.Random.Range(Min, Min + Max);

2.求Z位置:

Min = terrain.transform.position.z;

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

最终的随机Z应该是:

 randZ = UnityEngine.Random.Range(Min, Min + Max);

3.求Y位置:

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

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

这就是 Terrain.SampleHeight 发挥作用的地方。您必须使用此功能才能完美生成不在地形下的位置。您需要 #1#2 的结果才能使用:

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

如果你想对y轴应用偏移,你现在可以在这个时候做。

yVal = yVal + yOffset;

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

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);
}