/Camera/OutScreenTracker.cs

https://bitbucket.org/ozgurtaskin/mobgedomain · C# · 210 lines · 139 code · 29 blank · 42 comment · 13 complexity · e284339395ae316cc633cffaef9ffdd3 MD5 · raw file

  1. using UnityEngine;
  2. using System.Collections;
  3. public class OutScreenTracker : MonoBehaviour
  4. {
  5. public const float ANIM_TIME = 0.2f;
  6. // Use this for initialization
  7. public enum Mode
  8. {
  9. AllEdges,
  10. RightOnly,
  11. }
  12. Layer layer;
  13. //public Transform origin;
  14. public Transform target;
  15. public Transform tr;
  16. public Mode mode;
  17. //public GameObject indicator;
  18. Vector2 screenOffset;
  19. private Rect camRect;
  20. Vector2 crossPoint;
  21. public float distance;
  22. public float direction;
  23. float stopTrackingDistance;
  24. bool destroyWhenFinished;
  25. float maxDistance;
  26. float time;
  27. private bool destroyReady = true;
  28. public static OutScreenTracker construct(Transform target, Vector2 screenOffset, float stopTrackingDistance = 0, float maxDistance = float.PositiveInfinity)
  29. {
  30. GameObject go = new GameObject("tracker");
  31. var ost = go.AddComponent<OutScreenTracker>();
  32. ost.mode = Mode.AllEdges;
  33. ost.target = target;
  34. ost.screenOffset = screenOffset;
  35. ost.stopTrackingDistance = stopTrackingDistance + screenOffset.magnitude;
  36. ost.maxDistance = maxDistance;
  37. return ost;
  38. }
  39. void Awake()
  40. {
  41. //Debug.Log((Vector3)new Vector2(4, 6));
  42. tr = transform;
  43. layer = new GameObject().AddComponent<Layer>();
  44. layer.Z = 4;
  45. destroyWhenFinished = false;
  46. tr.parent = layer.tr;
  47. }
  48. // Update is called once per frame
  49. void Update()
  50. {
  51. time -= Time.deltaTime;
  52. //layer.Z = -layer.tr.parent.position.z;
  53. if (target)
  54. {
  55. Vector3 v = layer.tr.position;
  56. Vector2 v2 = v;
  57. camRect = new Rect(v.x + screenOffset.x, v.y + screenOffset.y,
  58. layer.size.x - 2 * screenOffset.x, layer.size.y - 2 * screenOffset.y);
  59. crossPoint = new Vector2(0, 0);
  60. var center = v2 + layer.size * 0.5f;
  61. Vector3 tp3 = target.position;
  62. Vector2 tpos2 = tp3;
  63. Vector2 tp2 = tpos2;
  64. float sclFactor = layer.Z / (tp3.z - layer.tr.parent.position.z);
  65. tp2 = center + (tp2 - center) * sclFactor;
  66. float minfD = stopTrackingDistance * sclFactor;
  67. //Debug.Log((tp3.z+" " +layer.tr.parent.position.z));
  68. //Debug.Log(tp3 + " " + tp2);
  69. bool b = intersects(center, tp2, camRect, out crossPoint);
  70. if (b && (distance = Mathf2.Distance(crossPoint, tp2)/sclFactor) > minfD && distance <= maxDistance)
  71. {
  72. //if (indicator != null)
  73. {
  74. tr.localPosition = new Vector3(crossPoint.x - v.x, crossPoint.y - v.y);
  75. if (destroyReady)
  76. {
  77. destroyReady = false;
  78. //gameObject.SetActiveRecursively(true);
  79. reverseTime();
  80. }
  81. }
  82. }
  83. else
  84. {
  85. if (destroyReady == false)
  86. {
  87. destroyReady = true;
  88. //gameObject.SetActiveRecursively(false);
  89. //gameObject.active = true;
  90. reverseTime();
  91. }
  92. }
  93. }
  94. else
  95. {
  96. destroyWhenFinished = true;
  97. if (!destroyReady)
  98. {
  99. destroyReady = true;
  100. reverseTime();
  101. }
  102. }
  103. //Debug.Log(distance);
  104. if (time >= 0)
  105. {
  106. }
  107. else
  108. {
  109. if (time < 0)
  110. {
  111. time = 0;
  112. if (destroyWhenFinished)
  113. {
  114. this.DestroyObj(layer.gameObject);
  115. //Debug.Log("yeeees");
  116. }
  117. }
  118. }
  119. float scl = (destroyReady ? time : ANIM_TIME - time) / ANIM_TIME;
  120. tr.localScale = new Vector3(scl, scl, scl);
  121. }
  122. bool intersects(Vector2 startP, Vector2 targetP, Rect camRect, out Vector2 crossPoint)
  123. {
  124. crossPoint = new Vector2(0, 0);
  125. bool b = false;
  126. switch (mode)
  127. {
  128. case Mode.AllEdges:
  129. b = Mathf2.LineIntersectsRect(startP, targetP, camRect, out crossPoint);
  130. break;
  131. case Mode.RightOnly:
  132. float r, s;
  133. startP.y = targetP.y;
  134. b = Mathf2.LineIntersectsLine(startP, targetP, new Vector2(camRect.xMax, camRect.y), new Vector2(camRect.xMax, camRect.yMax), out r, out s);
  135. crossPoint = startP + (targetP - startP) * r;
  136. break;
  137. default:
  138. break;
  139. }
  140. return b;
  141. }
  142. void reverseTime()
  143. {
  144. if (time < 0)
  145. {
  146. time = ANIM_TIME;
  147. }
  148. else
  149. {
  150. time = ANIM_TIME - time;
  151. }
  152. }
  153. /*
  154. void OnDestroy()
  155. {
  156. this.DestroyObj(layer.gameObject);
  157. }*/
  158. }
  159. /*testc Usage
  160. OutScreenTracker track = new GameObject().AddComponent<OutScreenTracker>();
  161. GameObject org = MonoBehaviourExtension.instantiatePrefab("Prefabs/Test/Capsule");
  162. org.transform.localPosition = new Vector3(-261.06f, -53.0f, 0);
  163. GameObject tar = MonoBehaviourExtension.instantiatePrefab("Prefabs/Test/Capsule");
  164. tar.transform.localPosition = new Vector3(100, 50, 0);
  165. track.origin = org.transform;
  166. track.target = tar.transform;
  167. LineRenderer lr = gameObject.AddComponent<LineRenderer>();
  168. lr.SetPosition(0, track.origin.localPosition);
  169. lr.SetPosition(1, track.target.localPosition);
  170. //tar.transform.parent = transform;
  171. track.indicator = transform.gameObject;
  172. *
  173. * */