Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. public class TopDownCamera : MonoBehaviour {
  4.  
  5. [Header("References")]
  6.  
  7. [Tooltip("A target for the camera to follow.")]
  8. [SerializeField]
  9. private Transform target;
  10.  
  11. [Tooltip("Target top collider. Used to calculate distance between collider top point and camera.")]
  12. [SerializeField]
  13. private Collider topCollider;
  14.  
  15. private Vector3 currentVelocity;
  16.  
  17. [Header("Settings")]
  18.  
  19. [SerializeField]
  20. [Range(0.0f, 1.0f)]
  21. private float smoothTime = 0.1f;
  22.  
  23. [SerializeField]
  24. [Range(0.0f, 20.0f)]
  25. private float height = 8f;
  26.  
  27. [SerializeField]
  28. [Range(45f, 90f)]
  29. private float angle = 90f;
  30.  
  31. [SerializeField]
  32. [Range(0.1f, 10f)]
  33. private float angleFactor = 90f;
  34.  
  35. [Header("Look Ahead")]
  36.  
  37. [SerializeField]
  38. [Range(0.0f, 20.0f)]
  39. private float horizontalLookAhead = 5f;
  40.  
  41. [SerializeField]
  42. [Range(0.0f, 20.0f)]
  43. private float verticalLookAhead = 5f;
  44.  
  45. [Header("Safe Zone")]
  46.  
  47. [Tooltip("Safe Zone Size")]
  48. [SerializeField]
  49. private Vector3 safeZoneSize;
  50.  
  51. [Tooltip("Enable/Disable Safe Zone")]
  52. [SerializeField]
  53. private bool enableSafeZone;
  54.  
  55. [Tooltip("Color of Safe Zone")]
  56. [SerializeField]
  57. private Color colorSafeZone = Color.blue;
  58.  
  59. // Private fields
  60. private SafeZone safe;
  61. private Camera cam;
  62.  
  63. private void Awake() {
  64. // Try to find default target and top collider
  65. if (target == null) {
  66. target = FindObjectOfType<TopDownPlayer>().transform;
  67. }
  68. if (topCollider == null) {
  69. topCollider = target.Find("Head").GetComponent<Collider>();
  70. }
  71.  
  72. cam = GetComponent<Camera>();
  73.  
  74. safe = new SafeZone(topCollider.bounds, safeZoneSize);
  75. }
  76.  
  77. private void OnDrawGizmos() {
  78. Gizmos.color = colorSafeZone;
  79. Gizmos.DrawCube(safe.center, safeZoneSize);
  80. }
  81.  
  82. private void LateUpdate() {
  83. if(target != null && topCollider != null) {
  84.  
  85. safe.Update(topCollider.bounds);
  86.  
  87. Vector3 dir = target.position - transform.position;
  88. Debug.DrawRay(transform.position, dir, Color.red);
  89.  
  90. // Use law of sines to calculate Z distance based in camera angle.
  91. var zRelativeToAngle = height/Mathf.Sin(angle * Mathf.Deg2Rad) * Mathf.Sin((90 - angle) * Mathf.Deg2Rad);
  92.  
  93. var dx = (Input.mousePosition.x - Screen.width * 0.5f) / Screen.width;;
  94. var dz = (Input.mousePosition.y - Screen.height * 0.5f) / Screen.height;
  95.  
  96. // Set Target Position
  97. Vector3 targetPosition = new Vector3(
  98. target.position.x + dx * horizontalLookAhead,
  99. height,
  100. target.position.z - zRelativeToAngle + dz * verticalLookAhead
  101. );
  102.  
  103. // Set Current Position
  104. transform.position = Vector3.SmoothDamp(
  105. transform.position,
  106. targetPosition,
  107. ref currentVelocity,
  108. smoothTime
  109. );
  110.  
  111. // Set Rotation
  112. transform.eulerAngles = new Vector3(
  113. angle - dz * angleFactor,
  114. 0,
  115. 0
  116. );
  117. }
  118. else {
  119. Debug.LogWarning("Target or Top Collider not found!");
  120. }
  121. }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement