我正在从Unity中的DS游戏 Dragon Quest Heroes Rocket Slime 中重新创建运动系统。目前,我已经获得了令人满意的结果,但是还不是100%。
其中之一是my player bounces back from walls further on long distance slings than he does in the original game。 (左是我的娱乐,右是原始游戏)。显然,我无法确定游戏的制作方式以及用于吊索的确切数学/值,但是我从游戏中得到的一件事是:
播放器以恒定速度移动,同时向一个方向倾斜(不减速,他们只是停在某个点上)
这促使我相信游戏没有使用传统的速度机制,所以我做到了: 在伸展的同时,球员的“ pVelocity”(电位潜力)上升。当他们放手一点时,在curPlayerPosition创建+ pVelocity被创建。然后,我以恒定的速度将播放器移动到该点。我想解决弹跳太远的问题的想法是,获得从我甩到的位置到终点的距离,并让玩家弹跳越少,距离越大,距离就越小。
问题是,我不确定该如何做最后一部分。
这是我的代码:
Vector2 reflectedVelocity = Vector2.Reflect(pVelNormalized, foundHit.normal);
playerAnimator.SetFloat("VelocityX", reflectedVelocity.x);
playerAnimator.SetFloat("VelocityY", reflectedVelocity.y);
float DistanceFromOrigin = Vector3.Distance(slingOrigin, transform.position);
print(DistanceFromOrigin);
//ToDo: reflectedVelocity is lower the higher DistanceFromOrigin is.
我想到的另一个解决方案是,也许我对原始游戏中“速度”如何工作的想法是完全错误的,如果是这样,请告诉我它实际上是/看起来是如何完成的
答案 0 :(得分:1)
reflectedVelocity越低,DistanceFromOrigin越高。
因此reflectedVelocity
应该与DistanceFromOrigin
呈反比关系
Vector2 reflectedVelocity = Vector2.Reflect(pVelNormalized, foundHit.normal);
float DistanceFromOrigin = Vector3.Distance(slingOrigin, transform.position);
if(DistanceFromOrigin == 0) DistanceFromOrigin = 0.00001f;//to avoid division by zero
reflectedVelocity *= (SomeConstant / DistanceFromOrigin);
playerAnimator.SetFloat("VelocityX", reflectedVelocity.x);
playerAnimator.SetFloat("VelocityY", reflectedVelocity.y);
您可以使用线性关系而不是非线性关系:
reflectedVelocity *= (SomeConstant - DistanceFromOrigin);