Unity如何生成圆形渐变衰减图 解决岛屿生成的方形轮廓问题
Unity圆形岛屿FallOff衰减图修复方案
问题根源
现有GenerateFallOffMap函数中使用切比雪夫距离(取x、y轴偏移绝对值的最大值)计算衰减值,该距离计算规则天然生成方形衰减区域,是岛屿轮廓为方形的核心原因。
修复代码
仅需修改GenerateFallOffMap函数中value的计算逻辑,替换为欧几里得距离即可得到圆形衰减效果,修改后的完整代码如下:
public float[,] GenerateFallOffMap(int mapSize) { float[,] fallOffMap = new float[mapSize , mapSize]; // 欧氏距离最大值归一化系数,正方形地图下对角距离最大值为√2≈1.4142 float normalizeFactor = Mathf.Sqrt(2); for (int x = 0; x < mapSize; x++) { for (int y = 0; y < mapSize; y++) { float fallOff_A = x / (float)mapSize * 2 - 1; float fallOff_B = y / (float)mapSize * 2 - 1; // 替换为欧几里得距离计算,并归一化到0~1区间 float value = Mathf.Sqrt(fallOff_A * fallOff_A + fallOff_B * fallOff_B) / normalizeFactor; fallOffMap[x,y] = Evaluate(value); } } return fallOffMap; } // 该函数无需修改,可调整a、b参数控制衰减曲线软硬 static float Evaluate(float value) { float a = 3; float b = 2.2f; return Mathf.Pow(value, a) / (Mathf.Pow(value, a) + Mathf.Pow(b - b * value, a)); }
效果调整建议
- 调整
Evaluate函数中的a参数:数值越大,岛屿边缘衰减越陡峭,岛屿轮廓越清晰;数值越小,边缘过渡越平缓。 - 调整
Evaluate函数中的b参数:数值越大,岛屿整体面积越大,衰减区域越靠近地图边缘。 - 若需要更大的岛屿,可在计算
value时乘以小于1的缩放系数,例如value = value * 0.8f,即可缩小衰减生效范围。
内容的提问来源于stack exchange,提问作者Filip Studený
相关产品推荐
相关产品推荐

