异质瓷砖和柏林噪声
本文关键字:柏林 噪声 | 更新日期: 2023-09-27 18:05:23
我正尝试着执行一款带有不同贴图的平铺游戏;不同大小的瓷砖。所有瓷砖的大小都是圆整的(到一米),使它更容易。我正在寻找一种算法,适合在伪随机顺序的瓷砖,要求当然一切都必须平铺。
下面是我写的几行,但是它不能按需要工作。不知何故,瓦片之间的间距不受尊重。
首先,我生成了一个柏林噪声的地图,这是在旅途中创建的。我用字典来做我的贴图。
瓷砖的对象米变量是正方形瓷砖的宽度和深度,单位是米。tiles数组中的第一个tile为空tile,用于指定跳过。
编辑:我现在看到在Unity中有一个缩放问题,当我在游戏中应用1的比例到一个平面时,它将导致10的大小。有人能解释一下吗?
for(int i=-viewSpreadMeters;i<=viewSpreadMeters;i++)
{
for(int j=-viewSpreadMeters;j<=viewSpreadMeters;j++)
{
int x = currentTerrainID[0] + i;
int y = currentTerrainID[1] + j;
if (!tileMap.ContainsKey(x, y)) {
int id = noiseMap[x, y];
int iteratedTiles = 0;
Restart:
for (int k = 1; k < tiles[id].meters; k++) {
for (int l = 1; l < tiles[id].meters; l++) {
int x2 = x + k;
int y2 = y + l;
if (tileMap.ContainsKey(x2, y2)) {
int prevMeters;
do {
iteratedTiles++;
print ("Iterated tiles" + iteratedTiles);
if (iteratedTiles >= tiles.Length - 1) {
id = 0;
goto EndLoop;
}
prevMeters = tiles[id].meters;
id++;
id %= tiles.Length;
if (id == 0) id++;
} while(tiles[id].meters >= prevMeters);
goto Restart;
}
}
}
EndLoop:
tileMap.Add(x, y, id);
for (int k = 1; k < tiles[id].meters; k++) {
for (int l = 1; l < tiles[id].meters; l++) {
int x2 = x + k;
int y2 = y + l;
tileMap.Add(x2, y2, 0);
}
}
}
}
}
上面的代码有一个错误,缺少一个continue。此外,我还需要块来使异构块工作。
缩放问题取决于你如何导入你的资产。如果贴图是通过编程创建的,那么它们的比例应该是1:1;然而,如果你是从DCC工具(如Max或Maya)导入它们,你需要检查模型导入设置中的"全局比例"设置——根据源应用程序和设置,全局比例可能会被设置为放大或缩小导入的单位,从1:100到100:1。
异构瓷砖是棘手的,因为你必须管理沿部分边缘的边缘匹配。您确定需要异构尺寸吗?