yanlongcong 2021-11-28 10:55 采纳率: 0%
浏览 159
已结题

unity3d中,如何使用柏林噪音算法在有限地形中生成动态随机物体.

现有固定大小地形中随机动态效果(图1). 想要将移动的波浪变为多数单个物体(如长方体,且地形平坦.图2)

img

img

现有地形代码 Terrain Generator
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TerrainGenerator : MonoBehaviour
{
    public int depth = 20;

    public int width = 256;
    public int height = 256;

    public float scale = 20f;

    public float offsetX = 200f;
    public float offsetY = 200f;

    public float velocity = 5f;

    private void Start()
    {
        offsetX = Random.Range(0f, 99999f);
        offsetY = Random.Range(0f, 99999f);
    }
    // Start is called before the first frame update
    void Update()
    {
        Terrain terrain = GetComponent<Terrain>();
        terrain.terrainData = GenerateTerrain(terrain.terrainData);
        
        offsetX += velocity * Time.deltaTime;
    }

    TerrainData GenerateTerrain(TerrainData terrainData)
    {
        terrainData.heightmapResolution = width + 1;

        terrainData.size = new Vector3(width, depth, height);
        terrainData.SetHeights(0, 0, GenerateHeights());

        return terrainData;
    }

    float[,] GenerateHeights()
    {
        float[,] heights = new float[width, height];
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                heights[x, y] = CalculateHeight(x, y);
            }
        }

        return heights;
    }

    float CalculateHeight(int x, int y)
    {
        float xCoord = (float)x / width * scale + offsetX;
        float yCoord = (float)y / height * scale + offsetY;

        return Mathf.PerlinNoise(xCoord, yCoord);
    }
}


  • 写回答

1条回答 默认 最新

  • 陈言必行 Unity领域优质创作者 2021-11-30 09:59
    关注

    基础逻辑:

    1. 每秒生成一个长方体(时间根据timer控制)
    2. 随机物体大小(最大大小根据depth,width,height)
    3. 控制生成物体向前运动(速度根据velocity控制)
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CubeGenerator : MonoBehaviour
    {
        // 长方体长宽高 最大值
        public int depth = 20;
        public int width = 256;
        public int height = 256;
        
        // 控制移动速度
        public float velocity = 5f;
    
        //public float offsetX = 200f;
        //public float offsetY = 200f;
        
        // 间隔过长时间生成物体
        private float timer = 1f;
        private float time = 0f;
        
        // 生成物体集合
        List<Transform> cubeList = new List<Transform>();
        
        private void Start()
        {
            //offsetX = Random.Range(0f, 99999f);
            //offsetY = Random.Range(0f, 99999f);
        }
        
        void Update()
        {
            time += Time.deltaTime;
            // 满足条件生成物体
            //if (Input.GetKeyDown(KeyCode.A))
            // 每秒生成一个物体
            if(time - timer >= 0)
            {
                Transform terrain = CreateCube();
                cubeList.Add(terrain);
                time = 0;
            }
            
            // 物体移动
            for (int i = 0; i < cubeList.Count; i++)
            {
                cubeList[i].Translate(Vector3.forward * velocity * Time.deltaTime);
            }
        }
        
        // 创建物体
        Transform CreateCube()
        {
            // 创建Cube
            Transform cubeTrans = GameObject.CreatePrimitive(PrimitiveType.Cube).transform;
            //Instantiate(gameobjectPrefabs);
            cubeTrans.localPosition = Vector3.zero;
            // 随机大小
            cubeTrans.localScale = new Vector3(Random.Range(0.1f, width), Random.Range(0.1f, depth), Random.Range(0.1f, height));
            return cubeTrans;
        }
    } 
    
    评论
    1人已打赏

报告相同问题?

问题事件

  • 请采纳用户回复 12月8日
  • 系统已结题 12月6日
  • 创建了问题 11月28日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。