此代码附加到相机:
transform.position += Input.GetAxis("Vertical") * transform.forward * mod;
transform.position += Input.GetAxis("Horizontal") * transform.right * mod;
我使用了.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;
2 回答
我现在可能会胡说八道,但对我来说似乎很简单:
Vector3 desiredDirection = Vector3.Normalize(new Vector3(transform.forward.x, transform.position.y, transform.forward.z))
只需将
transform.forward
投影到x-z平面上,该平面的高度为transform.position.y
. 这样做(通常)导致向量略短,因此您必须重新规范化它 .想象:
如果我理解正确,
transform.forward
对应黑色矢量,你想要绿色矢量 . 通过将黑色矢量的y分量设置为红点位置y分量的y分量,可以得到紫色矢量,该矢量必须重新规范化 .即使这已经解决了,下面的解决方案应该可以帮助其他人解决这个问题 .
这是在忽略旋转的同时向
transform.forward
移动的正确方法:1 . 获取
transform.forward
.2 . 使用
InverseTransformDirection
将其转换为本地空间3 . 将
y
轴设置为0
;4 . 使用
dir.Normalize()
标准化;5 . 将新pos贴到
transform.position
.Another Method(Not Recommended):
由于相机倾斜角度为45度:
1 . 将其旋转至
-45
2 . 正常移动相机
3 . 将其重新转回
45
这两个都应该有效,但首选方式应该是第一个 .