问题描述
我正在尝试在基于模拟摇杆输入的 2.5d 横向卷轴游戏中围绕我的玩家移动对象。问题是,我的播放器在世界中旋转(相机固定在侧面)所以它的局部水平方向(transform.right)并不总是与局部向上方向(transform.up)的全局x方向相同。当玩家的移动方向固定在 X 轴上时,通过设置玩家位置的偏移并在同一轴上添加模拟,我让这个工作得很好:
Vector3 endPoint = new Vector3(transform.position.x + inputs.x * floradistanceMultiplier,transform.position.y + inputs.y * floradistanceMultiplier,transform.position.z);
但是现在玩家可以说是“离轴”,这当然行不通。
我可以一次让它在一个轴上工作:
Vector3 h = player.transform.position + player.transform.right * floradistanceMultiplier * inputs.x;
Vector3 v = player.transform.position + player.transform.up * floradistanceMultiplier * inputs.y;
但无法弄清楚如何让两个向量影响最终位置。我假设使用 localPosition 或手动应用最终向量的 x 和 y 不起作用,因为 x 和 y 始终是全局的,而不是将 transform.right 定义为某种长的局部 X 轴。
我曾想过把这两个都放在一起 - 这几乎取得了成功的结果,因为终点只是从左到上正确地围绕玩家移动,而不是围绕玩家的完整圆圈,并且对角线非常接近而不是向上和向左的整个范围。
Vector3 endPoint = Vector3.Lerp(h,v,inputs.x + inputs.y);
有没有更好的方法来做到这一点?或者有什么方法可以使用 2 个浮点数在 2 个向量之间进行 lerp? (模拟摇杆 x 和 y)还是使用向量?谢谢!
解决方法
你最初做什么
var endPoint = new Vector3(transform.position.x + inputs.x * floraDistanceMultiplier,transform.position.y + inputs.y * floraDistanceMultiplier,transform.position.z);
基本上等于使用
var endPoint = transform.position + Vector3.right * input.x * floraDistanceMultiplier + Vector3.up * input.y * floraDistanceMultiplier;
因此,为了将其转换为局部空间,只需将全局向量 Vector3.right
和 Vector3.up
替换为局部 transform.right
和 transform.up
应该已经做到了
var endPoint = transform.position + transform.right * input.x * floraDistanceMultiplier + transform.up * input.y * floraDistanceMultiplier;
另一种写得更短的方法是
var endPoint = transform.position + (Vector3)input * floraDistanceMultiplier;
为了将其转换为局部空间,只需将运动向量与玩家的旋转相乘(Quaternion * Vector3
operator)
var endPoint = transform.position + transform.rotation * input * floraDistanceMultiplier;
作为替代,如果您不一定需要 endPoint
作为向量,您可以直接使用 transform.Translate
,您可以通过第二个参数简单地决定是否要在世界中应用运动或本地空间
transform.Translate(input * floraDistanceMultiplier);
默认情况下,这已经在本地空间中移动了对象。但请注意,这里还考虑了对象的缩放比例。所以这可能不像预期的那样表现。