首页 文章

实例化地形区域内的对象

提问于
浏览
0
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";
        }
    } 
}

现在有些游戏对象不在地形区域 . 我想要做的是保持克隆处于随机位置,但仅限于地形区域内 .

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

1 回答

  • 2

    我注意到你正在创建 Random 类的新实例 . 唐't do that with Unity' s 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到位的地方 . 您 must 使用此功能以完美地生成不在地形下的位置 . 您需要 #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);
    }
    

相关问题