如何使用2D精灵修复Unity碰撞问题

时间:2019-09-13 14:30:37

标签: unity3d

所以我在这里制作了这款游戏:https://youtu.be/OxJEeOTldcM

我面对迷宫墙的对撞机的问题,在某些水平上(不仅是我在下面的视频中显示的那个),当球被迷宫撞向墙壁时,它会穿过墙壁。运动。 在这里您可以看到我在说什么:https://youtu.be/dVU3LWKuXJ0

我已经解决了这个问题,并通过使迷宫的旋转速度比我最初打算的要慢得多来妥协。我希望迷宫能够像球员的动作一样快地旋转,但这使球穿过了每一堵墙。

所以我创建这些关卡的方式是这样的:我有这些预制的PNG迷宫,将它们导入到关卡中,然后在它们上应用了Polygon Collider 2D。但是似乎仅Polygon Collider不能单独处理我的游戏碰撞。

不仅如此,我还开始在其中一些墙上用盒子对撞机层叠一些空的游戏对象,试图使它们更坚固。确实可以,但是还不够,而且球还在不断穿过其中一些。

球以及墙壁上都具有刚体,根据我在网上看到的有关不良碰撞检测的一些答案,我将其碰撞检测设置为“连续”。仍然不能解决问题。

我也曾尝试在Photoshop中将这些迷宫的壁增厚,但是在不破坏球应该进入的空间以及扭曲迷宫外观的前提下,我不能比现在更厚。

必须有一种方法可以解决Unity的这种严重冲突。我需要球停止穿过墙壁,因为这显然是我比赛的重要组成部分。 我还希望能够将迷宫的旋转度设置为与玩家的运动速度一样快,而不必限制其速度,但是老实说,如果我能以当前速度解决此碰撞问题,我将很高兴。 >

1 个答案:

答案 0 :(得分:1)

“穿过墙壁”的最常见原因不是不良碰撞。通常是由于对Unity的物理和框架分离了解得很少。

Unity在固定的更新周期上计算碰撞和物理,并根据CPU资源在动态更新周期上生成帧。通常,Monobehaviours中的FixedUpdate()和Update()会明确利用这些功能。

Unity中的所有操作都在这两个周期之一中发生。像变换这样的基于帧的逻辑发生在动态更新周期上,而像碰撞这样的物理逻辑发生在固定的udpate周期上。

您可能会使用变换旋转拼图。这种对变换的旋转发生在任何物理计算之外,并且如果旋转得足够快,您可能最终会在物理计算有机会运行并产生碰撞之前穿过墙壁进行修剪。当您具有很高的FPS(例如检查器的无上限FPS)时,这非常明显。但是,锁定FPS仅能掩盖问题,并且该错误仍然可能发生。

为解决您的问题,我恳请您改为对Rigidbody2D本身进行轮换更改。这样的事情应该起作用:

public class SimpleRotation: MonoBehaviour
{
    Rigidbody2D rigidBody2D;

    void Start()
    {
        rigidBody2D = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        if(rotateRight)
            rigidBody2D.rotation += 1.0f;
        if(rotateLeft)
            rigidBody2D.rotation -= 1.0f;
    }
}

还有一点需要注意的是,Unity仅更新框架上的输入,因此,如果您在FixedUpdate()期间读取输入,则可能会重复读取输入(或完全错过输入)。最好在Update()周期上读取输入,并设置一个变量以在方法之间传递逻辑。

相关问题