根据摄像机角度使玩家向前,向右,向左和向后移动

时间:2014-02-21 21:01:20

标签: c# unity3d game-physics

到目前为止,我有一名左前后左右向前移动的球员,不过我是如何设置前进的,就像在前进位置一样,而不是我的球员正在看的位置。我把相机设置为FPS,跟随播放器。现在我想让玩家能够使用我的MouseLook脚本(已经工作),但基于我希望前进到玩家所在的地方,而不是我拥有的原始版本。我将在下面发布代码,让您知道我在说什么,感谢任何帮助。

玩家脚本(移动)

    void Update () {

    if(Input.GetKey (moveU))
    {
        SetTransformZ((transform.position.z) + playerSpeed);

    }

    if(Input.GetKey (moveD))
    {
        SetTransformZ((transform.position.z) - playerSpeed);

    }

    if(Input.GetKey (moveL))
    {
        SetTransformX((transform.position.x) - playerSpeed);
    }

    if(Input.GetKey (moveR))
    {
        SetTransformX((transform.position.x) + playerSpeed);
    }

    else
    {
        rigidbody.angularVelocity = Vector3.zero;

    }


}

void SetTransformX(float n)
{
    transform.position = new Vector3(n, transform.position.y, transform.position.z);
}

void SetTransformZ(float n)
{
    transform.position = new Vector3(transform.position.x, transform.position.y, n);
}

MouseLook脚本(附加到Unity中的主摄像头,这适用于播放器,所以当我的鼠标正在观看时它会移动,但由于我的移动代码非常原始,因此移动已关闭)

[AddComponentMenu("Camera-Control/Mouse Look")]

public class MouseLook : MonoBehaviour {

public enum RotationAxes { 
    MouseXAndY = 0, 
    MouseX = 1, 
    MouseY = 2 }

public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
float rotationY = 0F;

void Update ()      
{
    if (axes == RotationAxes.MouseXAndY)
    {
        float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
        rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
        rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
        transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
    }

    else if (axes == RotationAxes.MouseX)
    {
        transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
    }

    else
    {
        rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
        rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
        transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
    }
}



void Start ()
{
    //if(!networkView.isMine)
    //enabled = false;

    // Make the rigid body not change rotation
    //if (rigidbody)
    //rigidbody.freezeRotation = true;

}

1 个答案:

答案 0 :(得分:7)

好的,所以你希望你的玩家向前,向左,向右,相对于他们正在寻找的位置前进,正如我所理解的那样。

首先,确保transform.forward是您的播放器的正确方向。在编辑器中,您可以选择播放器gameObject并查看蓝色箭头是否面向与播放器相同的方向。如果没有,请在统一答案论坛上查看this thread以了解如何更改它。

以下是一些放入播放器控制器脚本的功能,可以相对于玩家轮换而不是位置移动。 (注意:请查看Time.deltaTime

private void moveForward(float speed) {
    transform.localPosition += transform.forward * speed * Time.deltaTime;
}

private void moveBack(float speed) {
    transform.localPosition -= transform.forward * speed * Time.deltaTime;
}

private void moveRight(float speed) {
    transform.localPosition += transform.right * speed * Time.deltaTime;
}

private void moveLeft(float speed) {
    transform.localPosition -= transform.right * speed * Time.deltaTime;
}

注意:transform.position vs transform.localPosition