MOrbit.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using UnityEngine;
  2. [ExecuteInEditMode]
  3. public class MOrbit : MonoBehaviour
  4. {
  5. public GameObject target;
  6. MeshRenderer render;
  7. SkinnedMeshRenderer srender;
  8. MeshFilter filter;
  9. public float distance = 10.0f;
  10. public float xSpeed = 250.0f;
  11. public float ySpeed = 120.0f;
  12. public float zSpeed = 120.0f;
  13. public float yMinLimit = -20.0f;
  14. public float yMaxLimit = 80.0f;
  15. public float xMinLimit = -20.0f;
  16. public float xMaxLimit = 20.0f;
  17. private float x = 0.0f;
  18. private float y = 0.0f;
  19. private Vector3 center;
  20. public bool Dynamic = false;
  21. public Vector3 offset;
  22. public Vector3 EditTest;
  23. Vector3 tpos = new Vector3(); // target pos
  24. void Start()
  25. {
  26. NewTarget(target);
  27. if ( target )
  28. {
  29. tpos = target.transform.position;
  30. Vector3 angles = Quaternion.LookRotation(tpos - transform.position).eulerAngles;
  31. x = angles.y;
  32. y = angles.x;
  33. distance = (tpos - transform.position).magnitude;
  34. }
  35. else
  36. {
  37. Vector3 angles = transform.eulerAngles;
  38. x = angles.y;
  39. y = angles.x;
  40. }
  41. nx = x;
  42. ny = y;
  43. nz = distance;
  44. }
  45. private float easeInOutQuint(float start, float end, float value)
  46. {
  47. value /= .5f;
  48. end -= start;
  49. if ( value < 1 ) return end / 2 * value * value * value * value * value + start;
  50. value -= 2;
  51. return end / 2 * (value * value * value * value * value + 2) + start;
  52. }
  53. float easeInQuad(float start, float end, float value)
  54. {
  55. value /= 1.0f;
  56. end -= start;
  57. return end * value * value + start;
  58. }
  59. float easeInSine(float start, float end, float value)
  60. {
  61. end -= start;
  62. return -end * Mathf.Cos(value / 1.0f * (Mathf.PI / 2.0f)) + end + start;
  63. }
  64. float t = 0.0f;
  65. public void NewTarget(GameObject targ)
  66. {
  67. if ( target != targ )
  68. {
  69. target = targ;
  70. t = 0.0f;
  71. if ( target )
  72. {
  73. filter = (MeshFilter)target.GetComponent(typeof(MeshFilter));
  74. if ( filter != null )
  75. center = filter.mesh.bounds.center;
  76. else
  77. {
  78. render = (MeshRenderer)target.GetComponent(typeof(MeshRenderer));
  79. if ( render != null )
  80. center = render.bounds.center;
  81. else
  82. {
  83. srender = (SkinnedMeshRenderer)target.GetComponent(typeof(SkinnedMeshRenderer));
  84. if ( srender != null )
  85. center = srender.bounds.center;
  86. }
  87. }
  88. }
  89. }
  90. }
  91. public float trantime = 4.0f;
  92. float vx = 0.0f;
  93. float vy = 0.0f;
  94. float vz = 0.0f;
  95. public float nx = 0.0f;
  96. public float ny = 0.0f;
  97. public float nz = 0.0f;
  98. public float delay = 0.2f;
  99. public float delayz = 0.2f;
  100. void LateUpdate()
  101. {
  102. if ( target )
  103. {
  104. if ( Input.GetMouseButton(1) )
  105. {
  106. nx = x + Input.GetAxis("Mouse X") * xSpeed * 0.02f;
  107. ny = y - Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
  108. }
  109. x = Mathf.SmoothDamp(x, nx, ref vx, delay); //0.21f); //, 100.0f, Time.deltaTime);
  110. y = Mathf.SmoothDamp(y, ny, ref vy, delay); //0.21f); //, 100.0f, Time.deltaTime);
  111. // NOTE: If you get an exception for this line it means you dont have a scroll wheel input setup in
  112. // the input manager, go to Edit/Project Settings/Input and set the Mouse ScrollWheel setting to use 3rd mouse axis
  113. nz = nz - (Input.GetAxis("Mouse ScrollWheel") * zSpeed);
  114. y = ClampAngle(y, yMinLimit, yMaxLimit);
  115. //x = ClampAngle(x, xMinLimit, xMaxLimit);
  116. distance = Mathf.SmoothDamp(distance, nz, ref vz, delayz);
  117. //Vector3 crot = transform.localRotation.eulerAngles;
  118. if ( distance < 1.0f )
  119. {
  120. distance = 1.0f;
  121. nz = 1.0f;
  122. }
  123. Vector3 c;
  124. if ( Dynamic )
  125. {
  126. if ( filter != null )
  127. {
  128. c = target.transform.TransformPoint(filter.mesh.bounds.center + offset);
  129. }
  130. else
  131. {
  132. if ( render != null )
  133. c = target.transform.TransformPoint(render.bounds.center + offset);
  134. else
  135. {
  136. if ( srender != null )
  137. c = target.transform.TransformPoint(srender.bounds.center + offset);
  138. else
  139. c = target.transform.TransformPoint(center + offset);
  140. }
  141. }
  142. }
  143. else
  144. c = target.transform.TransformPoint(center + offset);
  145. // Want to ease to new target pos
  146. if ( t < trantime )
  147. {
  148. t = trantime; //+= Time.deltaTime;
  149. tpos.x = easeInSine(tpos.x, c.x, t / trantime);
  150. tpos.y = easeInSine(tpos.y, c.y, t / trantime);
  151. tpos.z = easeInSine(tpos.z, c.z, t / trantime);
  152. }
  153. else
  154. tpos = c;
  155. Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
  156. Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + tpos; //c;
  157. transform.rotation = rotation;
  158. transform.position = position;
  159. }
  160. }
  161. static float ClampAngle(float angle, float min, float max)
  162. {
  163. if ( angle < -360.0f )
  164. angle += 360.0f;
  165. if ( angle > 360.0f )
  166. angle -= 360.0f;
  167. return Mathf.Clamp(angle, min, max);
  168. }
  169. }