135 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | // Curved World <http://u3d.as/1W8h> | ||
|  | // Copyright (c) Amazing Assets <https://amazingassets.world> | ||
|  |   | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace AmazingAssets.CurvedWorld | ||
|  | { | ||
|  |     [AddComponentMenu("Amazing Assets/Curved World/Camera")] | ||
|  |     [ExecuteAlways] | ||
|  |     [RequireComponent(typeof(Camera))] | ||
|  |     public class CurvedWorldCamera : MonoBehaviour | ||
|  |     { | ||
|  |         public enum MatrixType { Perspective, Orthographic } | ||
|  | 
 | ||
|  | 
 | ||
|  |         public MatrixType matrixType = MatrixType.Perspective; | ||
|  |         [Range(1, 179)] | ||
|  |         public float fieldOfView = 60; | ||
|  |         public float size = 5; | ||
|  |         public bool nearClipPlaneSameAsCamera = true; | ||
|  |         public float nearClipPlane = 0.3f; | ||
|  | 
 | ||
|  |         Camera activeCamera; | ||
|  | 
 | ||
|  |         public bool drawGizmos; | ||
|  |          | ||
|  | 
 | ||
|  |         private void OnEnable() | ||
|  |         { | ||
|  |             if (activeCamera == null) | ||
|  |                 activeCamera = GetComponent<Camera>(); | ||
|  |         } | ||
|  |         private void OnDisable() | ||
|  |         { | ||
|  |             if (activeCamera != null) | ||
|  |                 activeCamera.ResetCullingMatrix(); | ||
|  |         } | ||
|  |         private void Start() | ||
|  |         { | ||
|  |             if (activeCamera == null) | ||
|  |                 activeCamera = GetComponent<Camera>(); | ||
|  |         } | ||
|  |         private void Update() | ||
|  |         { | ||
|  |             if (activeCamera == null) | ||
|  |                 activeCamera = GetComponent<Camera>(); | ||
|  | 
 | ||
|  |             if (activeCamera == null) | ||
|  |             { | ||
|  |                 enabled = false; | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             if (nearClipPlane >= activeCamera.farClipPlane) | ||
|  |                 nearClipPlane = activeCamera.farClipPlane - 0.01f; | ||
|  | 
 | ||
|  | 
 | ||
|  |             if (matrixType == MatrixType.Perspective) | ||
|  |             { | ||
|  |                 fieldOfView = Mathf.Clamp(fieldOfView, 1, 179); | ||
|  |                 activeCamera.cullingMatrix = Matrix4x4.Perspective(fieldOfView, 1, activeCamera.nearClipPlane, activeCamera.farClipPlane) * activeCamera.worldToCameraMatrix; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 size = size < 1 ? 1 : size; | ||
|  |                 activeCamera.cullingMatrix = Matrix4x4.Ortho(-size, size, -size, size, (nearClipPlaneSameAsCamera ? activeCamera.nearClipPlane : nearClipPlane), activeCamera.farClipPlane) * activeCamera.worldToCameraMatrix; | ||
|  |             } | ||
|  |         } | ||
|  |         private void Reset() | ||
|  |         { | ||
|  |             if (activeCamera != null) | ||
|  |             { | ||
|  |                 activeCamera.ResetCullingMatrix(); | ||
|  | 
 | ||
|  |                 fieldOfView = activeCamera.fieldOfView; | ||
|  |                 size = activeCamera.orthographicSize; | ||
|  |                 nearClipPlane = activeCamera.nearClipPlane; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private void OnDrawGizmos() | ||
|  |         { | ||
|  |             if (activeCamera == null || drawGizmos == false) | ||
|  |                 return; | ||
|  | 
 | ||
|  | 
 | ||
|  |             Gizmos.color = Color.magenta * 0.85f; | ||
|  | 
 | ||
|  |             if (matrixType == MatrixType.Perspective) | ||
|  |             { | ||
|  |                 Gizmos.matrix = transform.localToWorldMatrix; | ||
|  |                 Gizmos.DrawFrustum(Vector3.zero, fieldOfView, activeCamera.farClipPlane, activeCamera.nearClipPlane, 1); | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 //Top | ||
|  |                 Vector3 c = transform.position + transform.forward * (nearClipPlaneSameAsCamera ? activeCamera.nearClipPlane : nearClipPlane); | ||
|  | 
 | ||
|  |                 Vector3 t1 = c + transform.up * size - transform.right * size; | ||
|  |                 Vector3 t2 = c + transform.up * size + transform.right * size; | ||
|  |                 Vector3 t3 = c - transform.up * size - transform.right * size; | ||
|  |                 Vector3 t4 = c - transform.up * size + transform.right * size; | ||
|  | 
 | ||
|  |                 Gizmos.DrawLine(t1, t2); | ||
|  |                 Gizmos.DrawLine(t2, t4); | ||
|  |                 Gizmos.DrawLine(t3, t4); | ||
|  |                 Gizmos.DrawLine(t3, t1); | ||
|  | 
 | ||
|  | 
 | ||
|  |                 //Bottom | ||
|  |                 c = transform.position + transform.forward * activeCamera.farClipPlane; | ||
|  | 
 | ||
|  |                 Vector3 b1 = c + transform.up * size - transform.right * size; | ||
|  |                 Vector3 b2 = c + transform.up * size + transform.right * size; | ||
|  |                 Vector3 b3 = c - transform.up * size - transform.right * size; | ||
|  |                 Vector3 b4 = c - transform.up * size + transform.right * size; | ||
|  | 
 | ||
|  |                 Gizmos.DrawLine(b1, b2); | ||
|  |                 Gizmos.DrawLine(b2, b4); | ||
|  |                 Gizmos.DrawLine(b3, b4); | ||
|  |                 Gizmos.DrawLine(b3, b1); | ||
|  | 
 | ||
|  | 
 | ||
|  |                 //Connection | ||
|  |                 Gizmos.DrawLine(t1, b1); | ||
|  |                 Gizmos.DrawLine(t2, b2); | ||
|  |                 Gizmos.DrawLine(t3, b3); | ||
|  |                 Gizmos.DrawLine(t4, b4); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |