如何通过改变物体的速度来产生定向阻力?

How to create directional drag by changing velocity of an object?

我正在尝试为我的游戏创建定向阻力,您可以在其中驾驶盘旋宇宙飞船(例如星球大战中的飞梭赛车)。已经统一的阻力对于悬停的船只、汽车等没有任何意义,因为它们通常从前面看是流线型的,而不是从侧面看。我不擅长物理学,但据我所知,你走得越快,阻力就会越大。我写了这个脚本,但它不起作用,一旦施加力,物体就会自行加速。

public Vector3 dragFactor;
private Rigidbody _rb;

void Start() {
    _rb = GetComponent<Rigidbody>();
}
void FixedUpdate () {
    Vector3 vel = _rb.velocity;
    if(vel.x>0)
        vel.x -= vel.x * dragFactor.x;
    else
        vel.x += vel.x * dragFactor.x;

    if (vel.y > 0)
        vel.y -= vel.y * dragFactor.y;
    else
        vel.y += vel.y * dragFactor.y;

    if (vel.z > 0)
        vel.z -= vel.z * dragFactor.z;
    else
        vel.z += vel.z * dragFactor.z;
    _rb.velocity = vel;
}

你知道我做错了什么或者可以改变什么吗?

阻力与表面积有关。虽然我不能给你一个编码的答案,因为我自己正在寻找一个,至少对于 angular 拖动。所以看起来你做对了。我会说手动应用拖动也会受到对象默认拖动的影响。所以如果你有 .1 你在游戏中看到的是 vel.x * rb.drag * dragFactor.x 这不是你想要的。所以你需要使 rb 运动并手动移动它,这样自然力就不会作用于它。

此外,您还需要乘以一些归一化变量,即 time.fixedDeltaTime

_vel.x -= vel.x * dragFactor.x * Time.fixedDeltaTime

我找到了这段动态修改拖动的代码

https://github.com/CoolOppo/Unity-Networking-FPS/blob/master/Assets/Sample%20Assets/Characters%20and%20Vehicles/Aircraft/Scripts/AeroplaneController.cs

具体

void CalculateDrag ()
{
    // increase the drag based on speed, since a constant drag doesn't seem "Real" (tm) enough
    float extraDrag = rigidbody.velocity.magnitude * dragIncreaseFactor;
    // Air brakes work by directly modifying drag. This part is actually pretty realistic!
    rigidbody.drag = (AirBrakes ? (originalDrag + extraDrag) * airBrakesEffect : originalDrag + extraDrag);
    // Forward speed affects angular drag - at high forward speed, it's much harder for the plane to spin
    rigidbody.angularDrag = originalAngularDrag * ForwardSpeed;
}

以上代码将帮助您以更高的速度修改阻力。

** 编辑,删除了对 isKinematic 的引用。除非你用速度修改位置,并应用重力,否则 isKinematic 是无用的。我希望我们可以使用 isKinematic 来防止应用默认拖动,最好只是确保刚体上的拖动为 0,并且您的脚本在固定更新中设置自定义拖动。