using System.Collections; using UnityEngine; public class CamOrthoTransition : MonoBehaviour { public Camera cam; private float fov = 90f; private float dist = 10f; private bool m_Ortho; private bool m_Animating = false; public string distText = "10"; public Vector3 pos; public float size; public Transform[] objs; private void OnGUI() { GUI.enabled = !m_Animating; distText = GUILayout.TextField(distText); if (float.TryParse(distText, out float d)) dist = d; if (!m_Ortho && GUILayout.Button("Orthographic") ) { dist = float.Parse(distText); StartCoroutine(Perspective2Ortho()); } if (m_Ortho && GUILayout.Button("Perspective")) { dist = float.Parse(distText); StartCoroutine(Ortho2Perspective()); } for(int i = 0; i < objs.Length; i++) GUILayout.Label("O"+i+":" + cam.transform.InverseTransformPoint(objs[i].position).z); } private void OnDrawGizmos() { if (!m_Animating) { m_Ortho = cam.orthographic; if (cam.orthographic) { size = cam.orthographicSize; } else { if (float.TryParse(distText, out float d)) dist = d; size = dist * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad); fov = cam.fieldOfView; var trans = cam.transform; pos = trans.position + trans.forward * dist; } } float a = cam.aspect; Gizmos.color = Color.green; var u = cam.transform.up * size; var r = cam.transform.right * size*a; Gizmos.DrawLine(pos + u + r, pos - u + r); Gizmos.DrawLine(pos + u - r, pos - u - r); Gizmos.DrawLine(pos + u + r, pos + u - r); Gizmos.DrawLine(pos - u + r, pos - u - r); Gizmos.DrawLine(pos + u + r, pos - u - r); Gizmos.DrawLine(pos - u + r, pos - u + r); } IEnumerator Perspective2Ortho() { m_Animating = true; var trans = cam.transform; fov = cam.fieldOfView; pos = trans.position + trans.forward * dist; size = dist * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad); for (float t = 0; t < 1.1f; t+=Time.deltaTime*1f) { float f = Mathf.Lerp(fov, 0, t); float d = size / Mathf.Tan(f * 0.5f * Mathf.Deg2Rad); cam.fieldOfView = f; trans.position = pos - trans.forward * d; if (f < 1f || d > 700) break; yield return null; } cam.orthographic = true; cam.orthographicSize = size; cam.fieldOfView = fov; m_Ortho = true; m_Animating = false; } IEnumerator Ortho2Perspective() { m_Animating = true; var trans = cam.transform; size = cam.orthographicSize; cam.orthographic = false; for (float t = 0; t < 1.1f; t += Time.deltaTime * 1f) { float f = Mathf.Lerp(1f, fov, t); float d = size / Mathf.Tan(f * 0.5f * Mathf.Deg2Rad); cam.fieldOfView = f; trans.position = pos - trans.forward * d; yield return null; } m_Ortho = false; m_Animating = false; } }