如何使用数学比较和检测重叠的gameObject Prefabs

时间:2014-11-07 16:39:26

标签: c# arrays loops unity3d overlapping

由于某些原因,我的代码在实例化的对象重叠时没有正确比较。 我想要做的是,生成具有不同位置和比例(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);
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

我不建议在这样的事情上使用完全随机的生成,因为它可以很容易地创建一些完全无法播放的东西,并且使其可玩性比尝试更有条理的方法更难。

一个有趣的方法可能是本视频中显示的方法: https://www.youtube.com/watch?v=VkGG9Umag0M

这种方法使用预先构建的手动生成的块级别可以播放,稍后在运行时随机选择,以创建无限级别。

另一种方法可能是动态生成一系列可行的&#34;平台。

我假设这是一款2D平台游戏,但同样的逻辑适用于其他类型。

例如,以下序列:

  1. 在左边添加一个平台(如果需要,随机Y位置和大小)。

  2. 确定下一个平台在右侧和垂直方向的可行位置,同时考虑前一平台的最终位置和其他内容,例如跳跃距离。这会给你一个最大的位置,你可以放置东西,但仍然让玩家成功。您可以使用最大值,也可以使用最小值。距离选择它们之间的随机值,并且仍然有一个没有重叠的可行平台。

  3. 重复步骤2,直到达到某种结束条件,例如等级大小,平台数量等。

  4. 您还可以添加更复杂的逻辑,例如允许在一个轴上重叠,只要在另一个轴上没有任何重叠,或两者之间的最小间隔。这样你就可以获得两个几乎平行的平台,以及类似的东西。

    其他规则可能更复杂,期望来自玩家的实际特定解决方案,例如双跳,弹跳墙等。在这种情况下,您可以将第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
     }