基于方向的 rigidbody2d 恒速

rigidbody2d constant velocity based on direction

我目前有这个脚本(不要读太多代码,这里没有粘贴所有内容,只粘贴理解问题所需的内容):

Touch[] touches = Input.touches;
Vector2 dir = (Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position).normalized * speed;
obj.getGameObject ().GetComponent<Rigidbody2D> ().velocity = dir;

问题是刚体的速度根据物体到触摸点的距离而不同,所以如果你触摸一个远离游戏对象的点,与一个近点相比,速度将是 2 倍或更多到游戏对象。

我该如何解决这个问题,这样我才能获得不基于与游戏对象距离的恒定速度?

问题的核心就在这一行:

Vector2 dir = (Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position).normalized * speed;

由于强制转换,方向向量被非规范化

当您用 Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position 计算触摸位置和物体位置之间的差异时,您必须记住,这个结果可能不是二维的 - 它是 Vector3。这意味着它可能有一个非零的 z 值,如果 GetPoint (0)transform.position 的结果不在 z 轴上的相同位置。

当您规范化 Vector3 时,它的长度变为 1,但前提是考虑到它的 z 值。当您将此值存储在 Vector2 dir 中时,Vector3 被转换为 Vector2 并且其 z 值被丢弃。这意味着之前归一化向量的长度不再保证为1;它可以在 [0,1].

范围内变化

投射向量的长度取决于 z 值的相对大小

如果将这个新的 Vector2 乘以 speed 并使用它来设置刚体的速度,则刚体的速度大小将在 0 和 speed 之间,而不是比总是 speed。如果你的触摸更远,物体移动得更快,如果它更近,物体移动得更慢,这是因为 z 值(它将是常数)相对于你的 x 和 y 值将变得越小,你的触摸越远.这是一个说明这将如何影响演员阵容的插图 Vector2:

请注意,如果 z 值相对于其他值较小,则转换规范化 Vector3 将如何导致更长的 Vector2。 (图表假设 x = 0,以便于阅读。)

解决方法

解决这个问题并不难 - 只要 z 值变为 0 后,无论是通过强制转换还是通过显式赋值,您只需对向量进行归一化。那么你的方向保证是1的长度,你的速度是恒定的。这是一个例子:

Touch[] touches = Input.touches;
Vector3 dirRaw = Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position;
dirRaw.z = 0;
Vector2 dir = dirRaw.normalized * speed;
obj.getGameObject ().GetComponent<Rigidbody2D> ().velocity = dir;

希望这对您有所帮助!如果您有任何问题,请告诉我。