我目前有这个脚本(不要过多地阅读代码,不是所有内容都粘贴在这里,只需要了解问题所需的内容):
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倍或更高,相比于接近游戏物体的点。游戏对象。
我将如何解决此问题,因此我可以根据与游戏对象的距离来获得恒定的速度?
答案 0 :(得分:1)
问题的核心在于这一行:
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
计算触摸位置和对象位置之间的差异时,您必须记住此结果可能不是2D - 它是Vector3
。这意味着如果GetPoint (0)
和transform.position
的结果不在z轴上的相同位置,则它可能具有非零z值。
当您对Vector3
进行标准化时,其长度将变为1,但前提是它的z值已被考虑在内。将此值存储在Vector2 dir
中时,Vector3
会转换为Vector2
,并且会丢弃其z值。这意味着先前标准化的向量的长度不再保证为1;它可以在[0,1]范围内的任何地方变化。
如果您将此新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;
希望这有帮助!如果您有任何问题,请告诉我。