基于方向的 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;
希望这对您有所帮助!如果您有任何问题,请告诉我。
我目前有这个脚本(不要读太多代码,这里没有粘贴所有内容,只粘贴理解问题所需的内容):
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;
希望这对您有所帮助!如果您有任何问题,请告诉我。