2017-01-04 67 views
1

此代码连接到相机:移向transform.forward,忽略旋转

transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

我用的.forward和.right因为玩家能够旋转的摄像头在Y axiz,从而无论摄像机朝向前进键的哪个方向总是将摄像机向前移动,左侧按键将相对地向左移动,依此类推。只是为了澄清 - 我希望它在局部空间中移动,而不是世界空间,所以向前是它所面对的方向,不一定是Vector3(0,0,1)。

相机是免费漫游的,没有父母或目标可以关注。

问题是相机有一个45度的X旋转向下看。使用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; 
+0

[Math.Clamp](https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html)可以提供帮助。 – Catwood

+0

那么你想用“世界”的前进方向吗?如果这是你的情况,那么世界方向是不变的'Vector3.Up = new Vector3(0,1,0);' –

+0

'你的旋转'transform.right'旋转'transform.forward'使之与xz平面对齐 – TheDjentleman

回答

3

我可能现在乱说,但它看起来很简单对我说:

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

只是投射transform.forward到那个在transform.position.y高度解决了X-Z平面。这样做(通常)导致一个稍微更短的向量,所以你必须重新规范化它。

形象化:

vec img

如果我理解正确的话,transform.forward对应于黑色矢量和你想拥有绿色的载体。通过将黑色矢量的y分量设置为红色点位置y分量的y分量,可以得到紫色矢量,该矢量必须重新归一化。

+0

简而言之,是的。我会看看我是否可以编码,但我可能不得不回来寻求帮助;) – Absinthe

0

即使这已解决,以下解决方案应该可以帮助其他人解决此问题。

这里是向transform.forward移动而忽略了它的旋转有道:

不用彷徨的transform.forward

.Convert它局部空间与InverseTransformDirection

.SET的y轴线0;

。用dir.Normalize()正常化它;

。添加新的位置为transform.position

public float mod = 2; 

void Update() 
{ 
    //Get Forward face 
    Vector3 dir = transform.forward; 
    //Convert to local Space 
    dir = transform.InverseTransformDirection(dir); 
    //Reset/Ignore y axis 
    dir.y = 0; 
    dir.Normalize(); 

    //Append the new pos to the `transform.position`. 
    transform.position += dir * Input.GetAxis("Vertical") * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 
} 

另一种方法(不推荐):

由于相机倾斜到45°角:

.Rotate它-45

.Move相机正常

.Rotate回45

public float startingOffset = 45; 
public float mod = 2; 


// Update is called once per frame 
void Update() 
{ 
    //Rotate it to -45 
    transform.Rotate(new Vector3(-startingOffset, 0, 0)); 

    // Move the camera normally 
    transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

    //Rotate it back to 45 
    transform.Rotate(new Vector3(startingOffset, 0, 0)); 
} 

这两个应该工作,但首选的方式应该是第一个。