2016-10-04 13 views
2

코드가 작동하지 않습니다. 카메라를 클램프하려하지만 작동하지 않습니다. 즉시 45로 맞 춥니 다. 카메라를 어떻게 잡을 수 있습니까?클램프 RotateAround가 Unity3D의 카메라에서 작동하지 않습니다

다음은 나의 코드입니다.

using UnityEngine; 
using System.Collections; 

public class MoveCamera : MonoBehaviour 
{ 

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

    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 Start() 
    { 

    } 

    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 (transform.localEulerAngles.y, minY, maxY); 
      rotationX = Mathf.Clamp (transform.localEulerAngles.x, minX, maxX); 
      transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0); 
     } 
    } 
} 
+0

transform.RotateAround는 실제로 변환을 회전하므로 모든 업데이트가 회전하고 있으며 transform.localEulerAngles를 사용하여 다시 회전합니다. 카메라에서 무엇을하고 싶니? – Absinthe

+0

마지막 3 줄을 제거하면 카메라가 Y 축을 10과 -10으로 고정하고 X 축을 45와 -45 –

+0

으로 고정하고 싶습니다. 원하는만큼 완벽하게 회전합니다. 하지만 나는 마지막 3 줄을 추가했지만 클램핑하지 않도록 클램프를 원합니다. –

답변

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

다음은 Y 축 회전을 제한하는 예입니다. X에도 적용 할 수 있습니다. 당신은 한계가 여기에 기초해야한다고 말하지 않았으니, 여기에서는 다른 객체 (public Transform target)의 회전을 기반으로합니다. 이것은 당신의 선수가 될 수도 있습니다.

public float sensitivity = 16.0f; 
public Transform target; 

void Update() 
{ 

    if (Input.GetMouseButton(0)) 
    { 
     //Debug.Log(Quaternion.Angle(transform.rotation, target.rotation)); 
     float angle = Quaternion.Angle(transform.rotation, target.rotation); 
     if(angle < 45 || angle > 315) 
     { 
      Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition); 
      transform.RotateAround(pos, Vector3.up, Time.deltaTime * sensitivity); 
     } 

    } 
} 

그냥 카메라의 회전 확인 세계 공간에 따라 제한하려면 대신하는 경우 : 회전을 보장하기 위해 Time.deltaTime의 사용이 일어날 것으로 보인다 두 경우 모두

public float sensitivity = 16.0f; 
//public Transform target; 

void Update() 
{ 

    if (Input.GetMouseButton(0)) 
    { 

     float angle = transform.eulerAngles.y; 
     Debug.Log(angle); 
     if (angle < 45 || angle > 315) 
     { 
      Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition); 
      transform.RotateAround(pos, Vector3.up, Time.deltaTime * sensitivity); 
     } 

    } 
} 

주 플레이어의 프레임 속도에 관계없이 동일한 속도. 당신은 회전이 RotateAround의 축 인수를 반전 반전하려면

는 :

transform.RotateAround(pos, -Vector3.up, Time.deltaTime * sensitivity);