转向transform.forward,忽略旋转

Abs*_*the 3 c# unity-game-engine

此代码附加到相机:

transform.position += Input.GetAxis("Vertical") * transform.forward * mod;
transform.position += Input.GetAxis("Horizontal") * transform.right * mod;
Run Code Online (Sandbox Code Playgroud)

我使用了 .forward 和 .right ,因为玩家可以在 Y 轴上旋转相机,因此无论相机面向哪个方向,前向键总是使相机相对向前移动,左键将相对移动它左等等。只是为了澄清 - 我希望它在本地空间移动,而不是世界空间,所以向前是它所面对的方向,不一定是 Vector3(0,0,1)。

摄像机可以自由漫游,没有可跟随的父级或目标。

问题是相机的 X 旋转角度为 45 度,可以向下看。因此,使用transform.forward将修改它的高度。还有一些滚动代码可以更改相机高度,因此我不想将高度设置为固定值。如何将移动限制为仅 X 和 Z,最好不要将其设为空?

更新:这段代码可以工作,但它并不漂亮,我确信有一个使用 Vector3.Project 的更优雅的解决方案,正如 xyLe_ 所建议的那样。如果我弄清楚了,我会添加到他的答案中。

mod = Time.deltaTime * 30;
float yPos = transform.position.y;
pos = transform.position;
pos += Input.GetAxis("Vertical") * transform.forward * mod;
pos.y = yPos;
pos += Input.GetAxis("Horizontal") * transform.right * mod;
pos += Input.GetAxis("Mouse ScrollWheel") * transform.up * mod * -30;
Run Code Online (Sandbox Code Playgroud)

nyr*_*o_0 6

我现在可能会胡说八道,但对我来说似乎很简单:

Vector3 desiredDirection = Vector3.Normalize(new Vector3(transform.forward.x, transform.position.y, transform.forward.z))

只需transform.forward投影到高度为 的 xz 平面上即可transform.position.y。这样做(通常)会导致向量稍短,因此您必须对其进行重新归一化。

可视化:

向量图像

如果我理解正确的话,transform.forward对应于黑色向量,而你想要绿色向量。通过将黑色向量的 y 分量设置为红点位置 y 分量的 y 分量,您将得到紫色向量,该向量必须重新归一化。