MouseDragSnapper.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using System;
  2. using UnityEngine;
  3. [ExecuteInEditMode]
  4. [RequireComponent(typeof(SpriteRenderer))]
  5. public class MouseDragSnapper : MonoBehaviour
  6. {
  7. private void Awake()
  8. {
  9. if (Application.isPlaying)
  10. {
  11. if (this.removeRigidbody)
  12. {
  13. UnityEngine.Object.Destroy(base.GetComponent<Rigidbody2D>());
  14. }
  15. if (this.removeCollider)
  16. {
  17. UnityEngine.Object.Destroy(base.GetComponent<Collider2D>());
  18. }
  19. UnityEngine.Object.Destroy(this);
  20. return;
  21. }
  22. Collider2D component = base.gameObject.GetComponent<Collider2D>();
  23. if (component == null)
  24. {
  25. this.removeCollider = true;
  26. base.gameObject.AddComponent<BoxCollider2D>();
  27. }
  28. Rigidbody2D component2 = base.gameObject.GetComponent<Rigidbody2D>();
  29. if (component2 == null)
  30. {
  31. this.removeRigidbody = true;
  32. base.gameObject.AddComponent<Rigidbody2D>();
  33. }
  34. }
  35. private void RePosition(Vector2 dir, SpriteRenderer sprite)
  36. {
  37. float x = sprite.bounds.size.x;
  38. float y = sprite.bounds.size.y;
  39. float x2 = this.mySprite.bounds.size.x;
  40. float y2 = this.mySprite.bounds.size.y;
  41. Vector2 vector = sprite.transform.position;
  42. Vector2 vector2 = new Vector2(x / 2f, y / 2f);
  43. Vector2 normalized = vector2.normalized;
  44. Vector2 vector3 = new Vector2(x / 2f, -y / 2f);
  45. Vector2 normalized2 = vector3.normalized;
  46. Vector2 vector4 = new Vector2(-x / 2f, y / 2f);
  47. Vector2 normalized3 = vector4.normalized;
  48. Vector2 vector5 = new Vector2(-x / 2f, -y / 2f);
  49. Vector2 normalized4 = vector5.normalized;
  50. Vector2 right = Vector2.right;
  51. float num = Vector2.Angle(right, dir);
  52. float num2 = Vector2.Angle(right, normalized);
  53. float num3 = Vector2.Angle(right, normalized2);
  54. float num4 = Vector2.Angle(right, normalized3);
  55. float num5 = Vector2.Angle(right, normalized4);
  56. if (dir.y > 0f)
  57. {
  58. if (num < num2)
  59. {
  60. base.transform.position = new Vector2(vector.x + x / 2f + x2 / 2f, vector.y);
  61. }
  62. else if (num < num4)
  63. {
  64. base.transform.position = new Vector2(vector.x, vector.y + y / 2f + y2 / 2f);
  65. }
  66. else
  67. {
  68. base.transform.position = new Vector2(vector.x - x / 2f - x2 / 2f, vector.y);
  69. }
  70. }
  71. else if (num < num3)
  72. {
  73. base.transform.position = new Vector2(vector.x + x / 2f + x2 / 2f, vector.y);
  74. }
  75. else if (num < num5)
  76. {
  77. base.transform.position = new Vector2(vector.x, vector.y - y / 2f - y2 / 2f);
  78. }
  79. else
  80. {
  81. base.transform.position = new Vector2(vector.x - x / 2f - x2 / 2f, vector.y);
  82. }
  83. }
  84. private bool Collide(Vector2 origin, Vector2 dir, float dis)
  85. {
  86. RaycastHit2D[] array = Physics2D.RaycastAll(origin, dir, dis);
  87. RaycastHit2D[] array2 = array;
  88. int i = 0;
  89. while (i < array2.Length)
  90. {
  91. RaycastHit2D raycastHit2D = array2[i];
  92. if (raycastHit2D.collider != null && raycastHit2D.collider.gameObject != base.gameObject)
  93. {
  94. Vector2 b = raycastHit2D.collider.transform.position;
  95. Vector2 a = base.transform.position;
  96. SpriteRenderer component = raycastHit2D.collider.gameObject.GetComponent<SpriteRenderer>();
  97. if (component == null)
  98. {
  99. return false;
  100. }
  101. this.RePosition((a - b).normalized, component);
  102. return true;
  103. }
  104. else
  105. {
  106. i++;
  107. }
  108. }
  109. return false;
  110. }
  111. private void Update()
  112. {
  113. this.mySprite = base.gameObject.GetComponent<SpriteRenderer>();
  114. Vector2 vector = base.transform.position;
  115. float x = this.mySprite.bounds.size.x;
  116. float y = this.mySprite.bounds.size.y;
  117. bool flag = this.Collide(new Vector2(vector.x + x / 2f, vector.y + y / 2f), Vector2.up, 5f);
  118. if (flag)
  119. {
  120. return;
  121. }
  122. flag = this.Collide(new Vector2(vector.x + x / 2f, vector.y + y / 2f), Vector2.right, 5f);
  123. if (flag)
  124. {
  125. return;
  126. }
  127. flag = this.Collide(new Vector2(vector.x + x / 2f, vector.y - y / 2f), -Vector2.up, 5f);
  128. if (flag)
  129. {
  130. return;
  131. }
  132. flag = this.Collide(new Vector2(vector.x + x / 2f, vector.y - y / 2f), Vector2.right, 5f);
  133. if (flag)
  134. {
  135. return;
  136. }
  137. flag = this.Collide(new Vector2(vector.x - x / 2f, vector.y - y / 2f), -Vector2.up, 5f);
  138. if (flag)
  139. {
  140. return;
  141. }
  142. flag = this.Collide(new Vector2(vector.x - x / 2f, vector.y - y / 2f), -Vector2.right, 5f);
  143. if (flag)
  144. {
  145. return;
  146. }
  147. flag = this.Collide(new Vector2(vector.x - x / 2f, vector.y + y / 2f), Vector2.up, 5f);
  148. if (flag)
  149. {
  150. return;
  151. }
  152. this.Collide(new Vector2(vector.x - x / 2f, vector.y + y / 2f), -Vector2.right, 5f);
  153. }
  154. public bool removeRigidbody;
  155. public bool removeCollider;
  156. private SpriteRenderer mySprite;
  157. }