如何使用数学比较和检测重叠的游戏对象前言
本文关键字:游戏 对象 重叠 检测 何使用 比较 | 更新日期: 2023-09-27 18:29:31
由于某些原因,当实例化对象重叠时,我的代码无法正确比较。我想做的是,生成具有不同位置和规模(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);
}
}
}
}
我不建议对这样的事情使用完全随机生成,因为它可以很容易地创建完全不可播放的东西,而使其可播放可能比尝试更有条理的方法更困难。
一个有趣的方法可能是本视频中显示的方法:https://www.youtube.com/watch?v=VkGG9Umag0M
这种方法是使用预先构建的、手动生成的可播放级别块,然后在运行时随机选择,来创建无限级别。
另一种方法可以是动态生成一系列"可行"平台。
我假设这是一款2D平台游戏,但同样的逻辑也适用于其他类型。
例如,以下顺序:
-
在左边缘添加一个平台(如果需要,随机Y位置和大小)。
-
在考虑上一个平台的末端位置和其他因素(如跳跃距离)的情况下,确定下一个平台在右侧和垂直方向的可行位置。这将给你一个最大位置,你可以在这个位置放置东西,并且仍然让玩家完成。你可以使用这个最大距离和可能的最小距离在它们之间选择一个随机值,并且仍然有一个没有重叠的可行平台。
-
重复步骤2,直到达到某种最终条件,如级别大小、平台数量等。
您还可以添加一个更复杂的逻辑,例如允许一个轴上重叠,只要另一个轴没有重叠,或者两个轴之间的间隔最小。这样你就可以得到两个几乎平行的平台,诸如此类的东西。
其他规则可能更复杂,需要玩家提供实际的具体解决方案,如双跳、跳墙等。在这种情况下,项目2可能只是众多生成策略中的一个。
这种类型的生成也将比冲突情况下的实际实例化和删除便宜得多。
注意:
如果你仍然想坚持100%的随机生成,但要保证平台之间的差距。只需假设一个围绕实际平台的"假想"边界。在测试碰撞时,不要只考虑当前的实点,只需向它们添加偏移即可。
你应该能够在没有物理的情况下测试交叉点,使用类似于这里显示的东西: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
}