在Unity中使用数学移动精灵

时间:2017-12-20 16:40:06

标签: c# unity3d game-physics

我目前正在Unity中制作游戏,其中角色从屏幕顶部的随机x位置向屏幕底部的一个点移动。由于他们必须保持恒定的速度(以后可能能够以特定的模式移动),我不能使用Vector3.Lerp

相反,我尝试使用一些简单的数学。 StaticInfo.instance.GetPlayerPosition()是目标位置。代码发生在角色的FixedUpdate()中。

float aVal = (myTransform.localPosition.y - StaticInfo.instance.GetPlayerPosition().y) / 
             (myTransform.localPosition.x - StaticInfo.instance.GetPlayerPosition().x);
float degrees = Mathf.Atan(aVal) * Mathf.Rad2Deg;
Vector3 newPos = new Vector3(myTransform.localPosition.x - (distance * speed * Mathf.Cos(degrees)), 
                             myTransform.localPosition.y - (distance * speed * Mathf.Sin(degrees)), 
                             1);
myTransform.localPosition = newPos;

我的问题是当创建这些角色(从预制件实例化)时,它们会在向所需方向移动之前形成一个小的180度循环。在那之后,他们完全按照需要移动。

使用数学是最好的解决方案吗?如果是的话,为什么它在初始化时会有一个时髦的漂移?

1 个答案:

答案 0 :(得分:0)

这可能是您尝试实现的更简单的解决方案:

    Vector3 moveDirection = (StaticInfo.instance.GetPlayerPosition() - myTransform.localPosition).normalized;

    Vector3 newPos = myTransform.localPosition + moveDirection * distance * speed;

    myTransform.localPosition = newPos;

如果您希望对象指向移动方向,您可以执行以下操作:

myTransform.rotation = Quaternion.Euler(0, 0, Mathf.atan2(moveDirection.y, moveDirection.x)*Mathf.Rad2Deg - 90); // may not need to offset by 90 degrees here;