using UnityEngine; using System.Collections; public class SuperCamera : MonoBehaviour { public GameObject pivot; public KeyCode resetShortcut = KeyCode.Space; [Range(0f, 100f)] public float rotationSensibility = 10f; public bool invertRotationX = false; public bool invertRotationY = false; [Range(0f, 100f)] public float translationSensibility = 10f; public bool invertTranslationX = false; public bool invertTranslationY = false; public float zoomMax = 2f; public float zoomMin = 20f; [Range(0f, 100f)] public float wheelSensibility = 10; private float delayDoubleClic = 0.2f; private Vector3 oldCamPos; private Quaternion oldCamRot; private Vector3 oldMousePos; private float timeDoubleClic; private bool firstClic = false; private Vector3 pivotPos; // Use this for initialization void Start () { pivotPos = pivot.transform.position; oldCamPos = Camera.main.transform.position; oldCamRot = Camera.main.transform.rotation; } // Update is called once per frame void Update () { Debug.DrawRay(pivotPos, Vector3.up, Color.red); Debug.DrawRay(pivotPos, Camera.main.transform.right, Color.green); if (Input.GetKeyDown(resetShortcut)) { Camera.main.transform.position = oldCamPos; Camera.main.transform.rotation = oldCamRot; } float wheel = Input.GetAxis("Mouse ScrollWheel"); if (wheel != 0f) { Vector3 movVec = (pivotPos - Camera.main.transform.position); movVec.Normalize(); movVec *= wheel/ 20 * wheelSensibility; Vector3 newPos = Camera.main.transform.position + movVec; if ((newPos - pivotPos).magnitude >= zoomMax && (newPos - pivotPos).magnitude <= zoomMin) { Camera.main.transform.position = newPos; } } bool doubleClic = false; if (Input.GetMouseButtonDown(0)) { if (firstClic) { doubleClic = true; firstClic = false; } else { firstClic = true; timeDoubleClic = Time.time; } } if (firstClic && Time.time - timeDoubleClic > delayDoubleClic) { firstClic = false; } if (doubleClic) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { pivotPos = hit.point; Debug.Log(hit.point); } else { pivotPos = pivot.transform.position; Debug.Log("reset Pivot"); } } if (!Input.GetMouseButton(0) && !Input.GetMouseButton(2)) { //Cursor.lockState = CursorLockMode.Locked; Cursor.visible = true; return; } else { Cursor.visible = false; } Vector3 mousePos = Input.mousePosition; if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(2)) { oldMousePos = mousePos; return; } if (Input.GetMouseButton(2)) { int factor = -1; if (invertTranslationX) { factor = 1; } gameObject.transform.Translate(new Vector3(factor * translationSensibility * (mousePos.x - oldMousePos.x) / 100f,0, 0)); factor = -1; if (invertTranslationY) { factor = 1; } gameObject.transform.Translate(new Vector3(0, factor * translationSensibility * (mousePos.y - oldMousePos.y) / 100f, 0)); } else { int factor = 1; if (invertRotationX) { factor = -1; } gameObject.transform.RotateAround(pivotPos, Vector3.up, factor * rotationSensibility * (mousePos.x - oldMousePos.x)/100f); factor = 1; if (invertRotationY) { factor = -1; } gameObject.transform.RotateAround(pivotPos, Camera.main.transform.right, factor * - rotationSensibility * (mousePos.y - oldMousePos.y)/100f); } oldMousePos = mousePos; } }