如何通过改变物体的速度来创建方向拖动?

时间:2017-01-28 17:08:05

标签: c# unity3d game-physics

我正在尝试为我的游戏创建方向拖动,在那里您可以驾驶悬停的太空船(例如从星球大战中进行追踪)。已经在统一中的阻力对于悬停船只,汽车等没有任何意义,因为它们通常从前面流线型而不是侧面。我不擅长物理学,但据我所知,阻力越大越快。我编写了这个脚本,但它不起作用,一旦添加了强制对象就会自动加速。

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;
}

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

1 个答案:

答案 0 :(得分:1)

拖动与表面区域有关。虽然我不能给你一个编码的答案,因为我自己在寻找一个,至少对于角度阻力。所以看起来你做得对。我会说,手动应用拖动也会受到对象默认拖动的影响。所以如果你有.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,并且您的脚本在固定更新中设置自定义拖动。