实例化地形区域内的对象
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);
}
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);
}