【发布时间】:2016-05-24 00:56:40
【问题描述】:
我有一个球类游戏对象,我正在使用明确的物理方程进行弹跳。我尝试使用统一的物理引擎,但不够准确。我这样设置球的位置:
float dTime = Time.time - timeSinceBounce;
ballPosition.x -= meterOffset / sensitivity;
ballPosition.y = ballInitialPosition.y + GameConstants.Instance.GetBallYVel ()
* dTime - (float)0.5 * GameConstants.Instance.GetGravity () * dTime * dTime; //Yi+Vy*t-0.5(G)(time^2)
ballPosition.z = (-dTime * GameConstants.Instance.GetBallZVel ()
+ ballInitialPosition.z) * startConstant; //Zi + t*Vz
ball.transform.position = ballPosition;
此代码在 Update() 方法中运行。当检测到碰撞时,重置时间和初始位置,这有效。目前,球可以正常反弹,但在快速移动时会摇晃。 FPS 为 80。我不认为我的方程式是错误的,因为它反弹得当,只是晃动。去除奶昔的最佳方法是什么?谢谢!
编辑 1:我决定编写自己的物理引擎,因为 Unity 的物理引擎有很多其他组件,例如摩擦和滚动,这些组件会使球的反弹发生变化。相机的 x 和 y 也是固定的,唯一改变的是相机的 z 位置。 在固定更新中效果更好
【问题讨论】:
-
你可以写0.5f,你不应该(float)0.5。至于您的问题:您的意思是 Unity Physics 不够“准确”?你做了什么?另外,如果你做物理,你应该使用 FixedUpdate() 而不是 Update()。另一个注意事项:你有 Time.deltaTime 和 Time.fixedDeltaTime,你不必自己计算。 “摇晃”一般是由于强制某种动画而发生的,这与您所做的运动背道而驰。例如。您一直强制球面向“x”方向,但您在更新时旋转它以使其看起来像移动(或类似)
-
我认为
meterOffset或sensitivity在 FixedUpdate 中进行了更新,因此它们在几帧中保持相同的值(默认情况下,物理每秒更新 50 次,而您有 80 fps) -
我不确定你能比内置物理做得更好。 “不够准确”是什么意思?如果我查看您的代码,它似乎很基本,我不明白为什么内置引擎会出错。
-
请参阅编辑。 @Mark FixedUpdate 似乎也让它变得更好,如果你愿意,请随时回答这个问题。
标签: c# unity3d game-physics