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

私はちょうどこのトピックに私の答えを見つけた:

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


そのトピックからコード:

C#モノコード:

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