在Unity中,我有一个围绕Vector2构建的2D网格。我想要做的就是获得真正的"对" (或任何方向)基于相机旋转。
例如,如果相机面向90度,则Vector2.right需要为Vector2.up。我在Vector3中看到了很多这样的例子,但我似乎无法将相同的逻辑应用于Vector2。特别是当相机为40度时,右侧突然变为向上和向右。如何将其夹在最近的"方向?我不想要"光标"对角移动 - 始终只在最近的方向基于相机和按下的键。我有一些代码片段,所以人们可以看到我有多接近:
if (Input.GetKey(KeyCode.RightArrow))
{
CameraDirection = CameraTransform.TransformDirection(Vector3.right);
}
Vector2 GridDelta = new Vector2((int)Mathf.Round(CameraDirection.x), (int)Mathf.Round(CameraDirection.z));
不幸的是,GridDelta有时会出现(1,1),而我每次都只是一个方向。
非常感谢任何帮助!
答案 0 :(得分:0)
我认为这个问题正在发生,因为在45度时,归一化向量不等于(.5, .5)
,而是来自1 /(2 ^ .5)的(.7071, .7071)
。在40deg时,归一化向量将类似于(.72, .62)
,这就是为什么舍入为您提供(1,1)
。
解决这个问题的一种方法是首先除以2 * .7071,然后舍入到最接近的整数。这基本上为您提供了一个新的中间点来比较您的非线性矢量分量。这有点像黑客,你可能不得不处理相机正好在45度(也许是一些舍入问题)的特殊情况。但否则这会奏效。
Vector3 CameraDirection = Camera.main.transform.forward; // normalized directional vector of camera.
Vector2 GridDelta = new Vector2((int)Mathf.Round(CameraDirection.x/1.414f), (int)Mathf.Round(CameraDirection.z/1.414f));