实例化地形区域内的对象
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
类的新实例。 不要使用Unity的Random
API。 只需使用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
到位的地方。 您必须使用此function才能完美地生成不在地形下的位置。 您需要#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); }