我有一个球类游戏对象,我正在使用显式物理方程式进行反弹。我尝试使用统一的物理引擎,但这还不够准确。我正在设置球的位置:
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 :(得分:2)
根据提问者的要求,我特此添加所有细节,即使没有看到实际的,完整的和完整的代码,同时看到这个"摇动"要给出一个准确和正确的答案是很有挑战性的。我会尝试尽力而为。
所以,让我们这样做吧。
1。"摇晃"原因:很可能你设置了某种动画,以及强制定位/旋转/等等,这两个代码相互作用。如果您已设置/配置这些内容,请仔细检查AnimatorController和Animator以及Mecanim(也是一个好读:" Locomotion")。
您还可以在从Unity UI进行测试时保持Animator Window处于打开状态,以查看谁在做什么?#34;摇晃"对你有影响,并且更接近它为什么会发生。
如果这些没有帮助,从头开始:尽量减少你写的代码移动球,删除所有效果等,然后将它们添加回来逐一。迟早" shakieness"会回来(如果它坚持使用最干净的代码,见上文,Animator / Locomotion问题)
2。再想一想,不要重写Unity Physics ......例如,你提到了" ... 物理引擎有许多其他组件,如摩擦和使球反弹的滚动变化...... "。现在,这是你可以关闭的东西。完全如果你想。最简单的方法是在Physics Material上将所有内容设置为零(即摩擦和弹性),但如果你希望Unity忽略所有的实际物理,那么#34;并让你用你的GameObject做你想做的事,在isKinematic的Rigidbody属性中打勾。它有趣的部分,你仍然会在你想要的地方碰撞,AddForce等,但既不是重力也不是摩擦,或者是任何物理的"影响你。
如果你对Unity不熟悉(你似乎不是这样),我强烈建议先学习它,因为它是一个非常好的和非常强大的引擎 - 所以不要扔它的功能消失了,因为它们不像你最初期望的那样工作。例如,几周前Sebastian Lague刚刚开始了一个很棒的初学者系列。这个人是老师,他的视频既简短又有趣,而且信息十足,所以我可以推荐他的频道。
3。从您的代码开始,我会进行以下更改:
public static class GameConstants { //no monobehaviour == can be a "proper, global" singleton!
public static float GetGravity {
get { return [whatever you want]; }
//why not Physics.gravity, using locally when and where it's needed?
}
//etc, add your methods, properties and such
//use this approach if and only IF you access these values application wide!
//otherwise, instead of a """singleton""" logic you just implemented,
//consider adding an empty GameObject to the Scene, name it "GM" and
//attach a "GameManager" script to it, having all the methods and
//properties you'll need Scene-wide! You can also consider
//using PlayerPrefs (see help link below) instead of a global static
//class, so you save memory (but will need to "reach out" for the data)
}
private void FixedUpdate() { //FIXED update as you'll work with physics!
//float dTime = Time.time - timeSinceBounce; //not needed
//positioning like this is not recommended, use AddForce or set direction and velocity instead
ballPosition.x -= meterOffset / sensitivity;
ballPosition.y = ballInitialPosition.y + GameConstants.Instance.GetBallYVel ()
* Time.fixedDeltaTime - 0.5f * GameConstants.Instance.GetGravity () * Time.fixedDeltaTime * Time.fixedDeltaTime; //Yi+Vy*t-0.5(G)(time^2)
ballPosition.z = (-dTime * GameConstants.Instance.GetBallZVel ()
+ ballInitialPosition.z) * startConstant; //Zi + t*Vz
ball.transform.position = ballPosition;
}
但是说实话,
我只是抛弃那些代码,实现Unity {0}}示例提供的Unity示例,改变它(参见第2点)并从那里开始工作。
项目没有链接,但我在代码中提到:
Bouncing Ball,PlayerPrefs和Physics.gravity。
注意'速度'忽略了物理的一部分(加速,被拖动等等),即物体突然以你设定的速度开始移动(这就是为什么Unity5推荐AddForce而不是上面的链接 - )
你也可以通过Rigidbody.velocity来改变FixedUpdate()
频率,但我还不确定是否需要这种频率(即仅用于弹跳球)
我希望这会有所帮助,并且球会弹跳,跳跃和跳舞以及你想要它做的一切;)
干杯!