c# - Unity 2D脚本摩擦方程

标签 c# unity3d

我正在研究一个方形物体在被玩家插入后的摩擦力。 block 的运动完全通过使用 transform.Translate(velocity) 每帧的脚本控制,并且只有一个 boxcollider2D。我推测,因为我手动控制 block 的运动,每一帧都是我似乎无法让 boxcolliders2D 的物理 Material 2D 摩擦起作用的原因。

基本上,我正在尝试通过使用 transform.translate 或尽可能使用内置物理来重新创建类似于刚体的内置物理。到目前为止,我已经找到了这样的东西

newVelocity.x -= ( 1/(newVelocity.x * newVelocity.x)); 试图降低每帧的 velocity.x 直到它达到 0 并短路。显然,当 velocity.x 变成十进制数时,这就分崩离析了。我对我应该做些什么来实现类似于刚体的摩擦感到困惑,刚体刚开始时它会减慢一点,然后在停止时快得多。感谢您提供的所有帮助,在此先感谢您!

最佳答案

您可以比较计算速度变化前后的速度符号,并在符号变化时将速度设置为零,如下所示:

newVelocity.x -= ( 1 / (newVelocity.x * newVelocity.x));
if(Mathf.Sign(previousVelocity.x) != Mathf.Sign(newVelocity.x)) {
    newVelocity.x = 0f;
}

不过,有一件事是法向摩擦力不是使用上面的公式计算的,它的计算方式如下:

newVelocity.x -= frictionCoefficient*Time.fixedDeltaTime;

有了这个,您就不需要将速度与之前的速度进行比较,因为如果速度很低,您就可以说它为零。如果你愿意的话,你仍然可以比较之前的速度符号,但这可能更有效

if(newVelocity.x < 0.01f) {
    newVelocty.x = 0f;
}

关于c# - Unity 2D脚本摩擦方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841654/

相关文章:

c# - 整个应用程序所需的对象

c# - 系统.AccessViolationException :Attempted to read or write protected memory

unity3d - 如何在 Unity3d 中通过平面切割网格

c# - 将 GPS 坐标转换为 X、Y、Z 坐标

c# - 如何在 Unity 2D 中创建一个白色矩形?

c# - Unity 添加组件

c# - 如何避免 TreeView 中的重复值?

c# - 如何拆分和传输多个 NAudio 流

c# - ASP.NET - 何时使用自定义异常?

unity3d - Rigidbody AddForce 在 Photon Unity 中不起作用