我正在尝试将一个物体移动到一个位置,但是,根据它的速度,我希望它能超过它的目标并反弹回来。
这就是我现在将物体移向另一个物体的方式:
void FixedUpdate() {
transform.position = Vector2.Lerp (transform.position, blackhole.transform.position, Time.deltaTime * 25f);
}
这显然不能解释“过冲”效应。然而,我一直无法实现它,因为在尝试使用物理时,我的所有尝试最终都会使我的物体无限期地围绕它的目标进行轨道运动,而不是只传递一次并在其内部移动。
答案 0 :(得分:1)
有几种方法可以解决这个问题。内森建议使用" gravity"通过每一步施加力量,我称之为物理学"解。您当前的解决方案只需设置位置即可调用"补间"解。两者都可以工作,两者都可以从简单使用if语句中受益。对于这两种解决方案,请停止"轨道运行"或者通过简单的检查从overShootPos返回。
补间: 当移动首次开始时,开始补间到您实际想要的位置。
Vector3 overShootPos = destinationPos + (destinationPos-transform.position)*overShootPercentage;
然后在FixedUpdate:
float deltaP = 0.001f;
if((transform.position-overShootPos).magnitude<deltaP){
//start tweening to destinationPos rather than overShootPos. Possibly just
overShootPos = destinationPos;
}
物理学: 实际上,力量会使物体越过目的地,并且它可能会开始沿着轨道运行&#34;就像你说的那样。 在FixedUpdate中,一旦它关闭并且足够慢就停止它:
float deltaP = 1f; //may want larger delta here since physics is less precise.
if((transform.position-destinationPos).magnitude<deltaP && rb.velocity.magnitude<deltaP){
rb.velocity = Vector3.zero;
transform.position = destinationPos;
}
这不是所有代码,但基本思想应该有效。
另外,请考虑Physics和Tweening解决方案之间的一些差异(可能包括除此之外的代码)。补间将非常精确,并且每次都以相同的方式工作,其中物理学可以在远距离/快速速度下更疯狂地缩放。如果您希望对象在到达目的地的路线上响应爆炸,碰撞等,那么显然需要物理解决方案。如果你使用Tweening,请考虑查看补间库,如iTween和DOTween,特别是如果你要使用很多补间。它们会更快(更少更新),并提供一个很好的语法来做这样的事情。
答案 1 :(得分:0)
我会使用一个基本的弹簧系统。弹簧方程
F = k(x-1)(力=弹簧常数*(延伸 - 静止长度)
所以计算你身体的弹力:
Force = SpringConstant *(PointToHeadTo - CurrentPosition)
然后使用引擎中的物理阻尼或应用自己的阻尼
D =速度* -DampingConstant(DampingForce = Velocity * -DampingConstant)
然后你作为一种力量申请。然而,Unity / UE4具有您设置的阻尼系数,因此您只需要弹力。
为了保持稳定,您可以将弹力限制在最大值,并且仅在目标半径范围内生效。您也可以在越过目标时提升阻尼,以帮助其休息。