2011-12-11 135 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