由于某些原因,我的代码在实例化的对象重叠时没有正确比较。 我想要做的是,生成具有不同位置和比例(X)的随机平台。 由于它是随机的,因此可能发生重叠。因此,为了解决这个问题,我试图比较每个平台,看看它是否重叠,何时重叠,它将自行删除并实例化另一个平台。
这个问题的补充是, 如果我解决了重叠问题,是否有可能使平台与X Y和Z相距一定距离。
所以。 。 我做错了什么? 我该怎么办?
void Platform_Position_Scale_Generator(int i) {
posX[i] = Random.Range(minPosRange, maxPosRange + 1);
posY[i] = Random.Range(minPosRange, maxPosRange + 1);
posZ[i] = 0;
scaleX[i] = Random.Range(minScaleRange, maxScaleRange + 1);
scaleY[i] = 1;
scaleZ[i] = 1;
}
void Platform_Generator(int i) {
platformPrefabPosition[i].x = posX[i];
platformPrefabPosition[i].y = posY[i];
platformPrefabPosition[i].z = posZ[i];
Instantiate(platformPrefab, platformPrefabPosition[i], Quaternion.identity);
platformPrefab.transform.localScale = new Vector3(scaleX[i], 1, 1);
}
// Error with this
void Detect_Collision(int i) {
for(int f = 0; f < i; f++) {
for(int s = f + 1; s < i; s++) {
bool xOverlap = (posX[s] > posX[f] && posX[s] < posX[f] + scaleX[i]) || (posX[f] > posX[s] && posX[f] < posX[s] + scaleX[i]);
bool yOverlap = (posY[s] > posY[f] && posY[s] < posY[f] + scaleY[i]) || (posY[f] > posY[s] && posY[f] < posY[s] + scaleY[i]);
if(xOverlap && yOverlap) {
Debug.Log("xOverlap: " + xOverlap + " yOverlap: " + yOverlap);
}
else {
//Debug.Log("xOverlap: " + xOverlap + " yOverlap: " + yOverlap);
}
}
}
}
答案 0 :(得分:0)
我不建议在这样的事情上使用完全随机的生成,因为它可以很容易地创建一些完全无法播放的东西,并且使其可玩性比尝试更有条理的方法更难。
一个有趣的方法可能是本视频中显示的方法: https://www.youtube.com/watch?v=VkGG9Umag0M
这种方法使用预先构建的手动生成的块级别可以播放,稍后在运行时随机选择,以创建无限级别。
另一种方法可能是动态生成一系列可行的&#34;平台。
我假设这是一款2D平台游戏,但同样的逻辑适用于其他类型。
例如,以下序列:
在左边添加一个平台(如果需要,随机Y位置和大小)。
确定下一个平台在右侧和垂直方向的可行位置,同时考虑前一平台的最终位置和其他内容,例如跳跃距离。这会给你一个最大的位置,你可以放置东西,但仍然让玩家成功。您可以使用最大值,也可以使用最小值。距离选择它们之间的随机值,并且仍然有一个没有重叠的可行平台。
重复步骤2,直到达到某种结束条件,例如等级大小,平台数量等。
您还可以添加更复杂的逻辑,例如允许在一个轴上重叠,只要在另一个轴上没有任何重叠,或两者之间的最小间隔。这样你就可以获得两个几乎平行的平台,以及类似的东西。
其他规则可能更复杂,期望来自玩家的实际特定解决方案,例如双跳,弹跳墙等。在这种情况下,您可以将第2项作为众多生成策略中的一种,从中选择从
在发生碰撞时,这种类型的生成也比实际实例化和删除要便宜得多。
注意:
如果您仍想坚持100%随机生成,但保证平台之间的差距。假设&#34;虚构&#34;实际平台周围的边界。不要只考虑当前的真实点,只需在测试碰撞时为它们添加偏移量。
您应该能够在没有物理的情况下测试交叉点,使用类似于此处显示的内容: http://answers.unity3d.com/questions/581014/2d-collision-detection-box-intersection-without-ph.html
if (object1.renderer.bounds.Intersects(object2.renderer.bounds)) {
// Do some stuff
}