2016-10-03 5 views
0

私のコードは機能していません、私はカメラをクランプしようとしていますが、動作していません。どのようにカメラをクランプするには?Unity3Dでカメラをクランプする方法

using UnityEngine; 
using System.Collections; 

public class MoveCamera : MonoBehaviour 
{ 

    public float sensitivity = 4.0f;   
    private Vector3 mouseOrigin; 
    private bool isRotating; 

    private float speed = 2.0f; 

    private float minX = -45.0f; 
    private float maxX = 45.0f; 

    private float minY = -10.0f; 
    private float maxY = 10.0f; 

    float rotationY = 0.0f; 
    float rotationX = 0.0f; 

    void Update() 
    { 
      if (Input.GetMouseButtonDown (0)) { 

       mouseOrigin = Input.mousePosition; 
       isRotating = true; 
      } 

      if (!Input.GetMouseButton (0)) 
       isRotating = false; 

      if (isRotating) { 

       Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin); 
       transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity); 
       transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity); 

       rotationY = Mathf.Clamp (rotationY, minY, maxY); 
       rotationX = Mathf.Clamp (rotationX, minX, maxX); 
       transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0); 
      } 
    } 
} 

答えて

0

いいえ、私はそれを修正しました。ここに完全なコードがあります。

using UnityEngine; 
using System.Collections; 

public class MoveCamera : MonoBehaviour 
{ 

    public float sensitivity = 4.0f;   
    private Vector3 mouseOrigin; 
    private bool isRotating; 
    public GameObject cam; 

    void Start() 
    { 
    } 

    protected float ClampAngle(float angle, float min, float max) { 

     angle = NormalizeAngle(angle); 
     if (angle > 180) { 
      angle -= 360; 
     } else if (angle < -180) { 
      angle += 360; 
     } 

     min = NormalizeAngle(min); 
     if (min > 180) { 
      min -= 360; 
     } else if (min < -180) { 
      min += 360; 
     } 

     max = NormalizeAngle(max); 
     if (max > 180) { 
      max -= 360; 
     } else if (max < -180) { 
      max += 360; 
     } 

     return Mathf.Clamp(angle, min, max); 
    } 

    protected float NormalizeAngle(float angle) { 
     while (angle > 360) 
      angle -= 360; 
     while (angle < 0) 
      angle += 360; 
     return angle; 
    } 


    void Update() 
    { 

     if (Input.GetMouseButtonDown (0)) { 

      mouseOrigin = Input.mousePosition; 
      isRotating = true; 
     } 

     if (!Input.GetMouseButton (0)) 
      isRotating = false; 

     if (isRotating) { 

      cam.transform.localEulerAngles = new Vector3(0, ClampAngle(cam.transform.localEulerAngles.y, -45, 45), 0); 
      Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin); 
      transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity); 
      transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity); 
     } 
    } 
} 
0

ここMathf.Clamp

public static float Clamp(float value, float min, float max) { 
    if (value < min) { 
     value = min; 
    } else if (value > max) { 
     value = max; 
    } 
    return value; 
}

のコードを使用すると、コールは、.NET(ユニティ/モノラル/など)にどのように動作するか不明な場合には、そのような(外部リンク)ILSPYとしてIL逆ツールを使用します。
あなたが投稿したコードに基づいて、Mathf.Clampが意図したとおりに機能するはずであることを考えれば、少なくとも1つのポイントでコードに敷設されている可能性が高いです。ここでは:


rotationY = Mathf.Clamp (rotationX, minY, maxY); //note it's rotation "X" instead of "Y" 
rotationX = Mathf.Clamp (rotationX, minX, maxX);

これでも問題が解決されない場合は、Debug.Logを使用して、間違った箇所を見つけるための変数値を確認してください。
このように分類できない場合は、正確に何ができないのかを明確に把握し、きれいな質問を投稿してきれいな回答を期待できます。

希望すると便利です。

+0

私は外部ツールを使用したくありません。ところで、私はコードを修正しました。 "X"ではなく "Y"です。迅速な返信をありがとう。 :) –

+0

私が実際に参照する外部ツールは外部です。まったくUnityには何の影響もありません。また、私が投稿したフィックスでは不十分な場合は、コードでDebug.Logを使用して、実際に何をしたいかを確認してください。もう一度、Mathf.Clampは意図したとおりに動作しています。... –

2

回転後、あなたの変換からrotationXとrotationYの値を取得するのを忘れてしまいました。これを試してみてください:

if (isRotating) { 

    Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin); 
    transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity); 
    transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity); 

    rotationY = Mathf.Clamp (transform.localEulerAngles.y, minY, maxY); 
    rotationX = Mathf.Clamp (transform.localEulerAngles.x, minX, maxX); 
    transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0); 
} 
+0

その動作しません。クイック返信ありがとうございます。 –

+0

「それは働いていません」と言うとき、**何が**働いていないか説明しよう;) – Hellium

+0

それは1つの位置にスナップし、つかの間になった。単一の点を回転さえできません。 –

関連する問題