2016-10-03 4 views
0

Mein Code funktioniert nicht, ich versuche, die Kamera zu klemmen, aber es funktioniert nicht. Wie klemme ich die Kamera?So spannen Sie die Kamera in 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); 
      } 
    } 
} 

Antwort

0

OK, also habe ich es behoben. Hier ist der vollständige Code.

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

Hier ist der Code von 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; 
}

Verwenden Sie ein IL Reverse-Tool wie (externer Link) ILSPY, wenn Sie sich nicht sicher sind, wie ein Anruf in .NET arbeitet (Unity/Mono/etc).
Basierend auf dem Code, den Sie geschrieben haben und verstehen Mathf.Clamp sollte wie vorgesehen funktionieren, das Problem liegt höchstwahrscheinlich in Ihrem Code, zumindest an einem Punkt, z. hier:


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

Wenn das Problem immer noch nicht behoben wurde, verwenden Sie Debug.Log, um Variablenwerte zu sehen, um zu ermitteln, wo Sie den Fehler machen.
Wenn Sie nicht so aussortieren können, haben Sie ein klares Bild was genau Sie nicht tun können und können eine viel sauberere Frage stellen und eine saubere Antwort erwarten.

Hoffe, das hilft!

+0

Ich möchte nicht externe Tools verwenden, By the way, korrigierte ich den Code, seine "Y" anstelle von "X". Danke für die schnelle Antwort. :) –

+0

Das externe Werkzeug, das ich beziehe, ist wirklich extern. Es hat keinerlei Auswirkung auf Unity ... Und wenn die Korrektur, die ich gepostet habe, immer noch nicht genug ist, benutze Debug. Logge dich ein, um zu sehen, was du tatsächlich tust, anstatt was du willst. Wie, wieder, Mathf.Clamp funktioniert wie vorgesehen - auch in Ihrem Code ... –

2

Sie haben vergessen, den Wert von rotationX und rotationY von Ihrer Transformation zu erhalten, nachdem Sie sie gedreht haben. Versuchen Sie dies:

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

Es funktioniert nicht, Vielen Dank für die schnelle Antwort. –

+0

Wenn du sagst "Es funktioniert nicht", versuche zu erklären, was ** nicht funktioniert;) – Hellium

+0

Es schnappte in eine Position und blieb stecken. Nicht einmal einen einzelnen Punkt drehen. –

Verwandte Themen