“ Unity”中的程序世界生成[关闭]

问题描述 投票:-3回答:1
欢迎大家,问题如下。

我在“ Unity”上书写了2D世界的生成,但是我不知道如何正确地或者更确切地说以什么顺序来书写世界的生成。确切地说,我该如何在“ Unity”中生成图块?我正在使用编程语言“ C#”。

c# unity3d 2d auto-generate procedural-generation
1个回答
0
投票
如果我正确理解了您,您想通过程序生成一个二维世界吗?

[通常,您需要随机生成多高的地形(通过Radom.Range(lowestHeight, heighestHeight);),然后必须将瓷砖放置在此高度,然后只需将瓷砖底部填充即可。之后,您只需要使用噪声贴图(每个像素都会生成一个介于0和1之间的随机数)(例如Perlin Noise或Simplex Noise)生成洞穴,然后将其分层放置在生成的地形上并移除每个Perlin Noise上的值低于某个阈值(例如0.5),甚至比您甚至可以尝试使用参数并稍微平滑世界的阈值低。为了产生噪声,您可以使用很多库,甚至可以编写自己的库。

现在总结所有内容:1.生成随机地形2.创建Perlin / Simplex噪声3.如果噪声图上的值在某个阈值以下,请移除用于洞穴的瓷砖4.一切顺利

我还没有测试过代码,只是从脑子里写的,我不能保证它可以100%正常工作随机地形生成:

int[] terrain; int maxOffset = 2; int lowesHeight = 0; int heighestHeight = 50; public void generateTerrain(int width){ terrain = int[width]; terrain[0] = Random.Range(lowestHeight, heighestHeight); for(int i = 1; i < terrain.len; i++){ terrain[i] = Random.Range(terrain[i-1] - maxOffset, maxOffeset); } }

然后您可以轻松地通过terrain[tilePosX]来获取每个图块的地形高度之后,您只需要填满所有内容即可:

public void fillUp(int[] terrainHeight){ for(int i = 0; i < terrainHeight.len; i++){ for(int j = terrainHeight[i]; j > 0; j--){ setTile(i, j); } } }

对于setTile(i, j),只需使用xPosition和yPosition的参数就可以创建一个函数,如果您甚至希望对用过的瓷砖也要使用(然后使用(h =您将瓷砖从例如污垢变成石头的位置)setTile(i, j, j < h ? Tile.STONE : Tile.DIRT);或类似的东西,您甚至可以像setTile(j < 30 ? j < 10 ? Tile.GROUND_TILE : Tile.STONE : Tile.DIRT)那样堆叠它,它虽然不漂亮,但应该可以使用。

我希望我能为您解决问题,并为我的英语不好而感到抱歉,如果代码无法正常工作,我对使用c#/ c ++进行编码是陌生的,通常是使用Java编写代码,可能是某些事情在c#中不起作用/ c ++,但我希望至少我能帮助您了解如何解决该问题,或者我可以帮助您找到自己的解决方案

视频链接:2D terrain generation3D terrain generationPerlin NoiseSimplex Noise

© www.soinside.com 2019 - 2024. All rights reserved.