我正在尝试为我的游戏创建方向拖动,在那里您可以驾驶悬停的太空船(例如从星球大战中进行追踪)。已经在统一中的阻力对于悬停船只,汽车等没有任何意义,因为它们通常从前面流线型而不是侧面。我不擅长物理学,但据我所知,阻力越大越快。我编写了这个脚本,但它不起作用,一旦添加了强制对象就会自动加速。
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;
}
你知道我做错了什么或可以改变什么吗?
答案 0 :(得分:1)
拖动与表面区域有关。虽然我不能给你一个编码的答案,因为我自己在寻找一个,至少对于角度阻力。所以看起来你做得对。我会说,手动应用拖动也会受到对象默认拖动的影响。所以如果你有.1你在游戏中看到的是什么
vel.x * rb.drag * dragFactor.x
这不是你想要的。所以你需要制作rb运动学并手动移动它,这样自然力就不适用于它。
此外,您还希望乘以一些规范化变量,即time.fixedDeltaTime
_vel.x - = vel.x * dragFactor.x * Time.fixedDeltaTime
我发现这段代码可以动态修改拖动
具体地
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,并且您的脚本在固定更新中设置自定义拖动。