2011-12-11 138 views
11

在我的游戏中,我有一个摄像头,并且我希望有一个FPS像旋转一样连接到此摄像头。Unity fps旋转摄像头

所以,如果我将光标移到左边,我希望我的凸轮向左旋转。如果我将光标向上移动,那么凸轮应该向上看,等等。

我目前已部分工作。我可以向左看,向右看,向下看。当我向下看,然后左右移动光标时,就会出现问题。然后它给了我一个“滚动”效果。

看到这部影片,看看究竟我的意思: http://www.screencast.com/t/Phedh8H0K13

显然,当我往下看我还是希望有一个“偏转”的效果,而不是一个“滚动”的效果。任何人有任何想法如何做到这一点?这是我到目前为止有:

// Update is called once per frame 
public override void update() 
{ 
    this.camera.transform.rotation *= 
     Quaternion.AngleAxis(Time.deltaTime * sensitivityRoll * Input.GetAxis("Vertical"), Vector3.forward); 

    this.camera.transform.rotation *= 
     Quaternion.AngleAxis(Time.deltaTime * sensitivityYaw * Input.GetAxis("Mouse X"), Vector3.up); 

    this.camera.transform.rotation *= 
     Quaternion.AngleAxis(Time.deltaTime * sensitivityPitch * Input.GetAxis("Mouse Y"), Vector3.left); 
} 

回答

10

我刚刚发现我的这个主题回答:

C#单码:

http://forum.unity3d.com/threads/109250-Looking-with-the-Mouse?highlight=person+camera


从该主题中的代码:

using UnityEngine; 
using System.Collections; 

/// MouseLook rotates the transform based on the mouse delta. 
/// Minimum and Maximum values can be used to constrain the possible rotation 

/// To make an FPS style character: 
/// - Create a capsule. 
/// - Add the MouseLook script to the capsule. 
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it) 
/// - Add FPSInputController script to the capsule 
/// -> A CharacterMotor and a CharacterController component will be automatically added. 

/// - Create a camera. Make the camera a child of the capsule. Reset it's transform. 
/// - Add a MouseLook script to the camera. 
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.) 
[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; 
    } 
} 
+0

年后但感谢您的回答,这正是我所期待的! – user1354784