Move.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. using System;
  2. using DG.Tweening;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using Random = UnityEngine.Random;
  7. public interface IUpdate
  8. {
  9. public void Update() { }
  10. }
  11. public abstract class Move
  12. {
  13. protected List<SpineAnimationLoader> _gos;
  14. protected List<SpineAnimationLoader> _setList = new List<SpineAnimationLoader>();//已经设置好坐标的靶子
  15. protected static int RamdomNum = 50;
  16. /// <summary>
  17. /// 是否和已生成的重叠
  18. /// </summary>
  19. /// <param name="target"></param>
  20. /// <returns></returns>
  21. protected bool CheckOverLap(SpineAnimationLoader target, Vector2 newPos)
  22. {
  23. foreach (var item in _setList)
  24. {
  25. var distanceMin = item.Radius() + target.Radius();
  26. if (distanceMin >= Vector2.Distance(item.transform.localPosition, newPos))
  27. {
  28. //有重叠的
  29. return true;
  30. }
  31. }
  32. return false;
  33. }
  34. protected Func<SpineAnimationLoader, Vector2, bool, bool> IsUIBlock = (SpineAnimationLoader target, Vector2 pos, bool log) =>
  35. {
  36. var radius = target.Radius();
  37. var canvasSize = GeneratingTarget.gm.GetCanvasSize();
  38. float halfW = canvasSize.x / 2;
  39. float halfH = canvasSize.y / 2;
  40. var paddingLeft = Math.Abs(pos.x - radius - (-halfW));
  41. var paddingTop = Math.Abs(halfH - (pos.y + radius));
  42. var paddingRight = Math.Abs(halfW - (pos.x + radius));
  43. var paddingDown = Math.Abs(pos.y - radius - (-halfH));
  44. if (log)
  45. Debug.Log($"pos={pos} paddingLeft={paddingLeft} paddingTop={paddingTop} paddingRight={paddingRight} paddingDown={paddingDown}");
  46. //上方157 左方 392
  47. if (paddingTop <= 157 && paddingLeft <= 392)
  48. return true;
  49. //上方170 右方133
  50. if (paddingTop <= 170 && paddingRight >= 133)
  51. return true;
  52. //下83 左方 370
  53. if (paddingDown <= 83 && paddingLeft <= 370)
  54. return true;
  55. //下216 右方 133
  56. if (paddingDown <= 216 && paddingRight <= 330)
  57. return true;
  58. return false;
  59. };
  60. public void SetGo(List<SpineAnimationLoader> gos)
  61. {
  62. _setList.Clear();
  63. _gos = gos;
  64. InitPos(gos);
  65. }
  66. public abstract void InitPos(List<SpineAnimationLoader> gos);
  67. public int ScreenWidth()
  68. {
  69. var ScreenWidth = Screen.width;
  70. return ScreenWidth;
  71. }
  72. public int ScreenHeight()
  73. {
  74. var ScreenHeight = Screen.height;
  75. return ScreenHeight;
  76. }
  77. }
  78. /// <summary>
  79. /// 随机位置静止
  80. /// </summary>
  81. public class Stay: Move
  82. {
  83. public override void InitPos(List<SpineAnimationLoader> gos)
  84. {
  85. float ScaleX(float value)
  86. {
  87. var width = ScreenWidth();
  88. var scale = 1280f / (float)width;
  89. value *= scale;
  90. return value;
  91. }
  92. //随机不重叠的位置
  93. for (int i = 0; i < gos.Count; i++)
  94. {
  95. var randomPos = gos[i].GetRandomPos();
  96. int count = RamdomNum;
  97. while (IsUIBlock(gos[i], randomPos, false) || (CheckOverLap(gos[i], randomPos) && count > 0))
  98. {
  99. randomPos = gos[i].GetRandomPos();
  100. count--;
  101. }
  102. // Debug.Log($"i ={i} IsUIBlock={IsUIBlock(gos[i], randomPos, true)} CheckOverLap={CheckOverLap(gos[i], randomPos)} count={count}");
  103. gos[i].SetPos(randomPos);
  104. _setList.Add(gos[i]);
  105. }
  106. }
  107. }
  108. /// <summary>
  109. /// 左右水平移动
  110. /// </summary>
  111. public class LeftToRight : Move, IUpdate
  112. {
  113. public override void InitPos(List<SpineAnimationLoader> gos)
  114. {
  115. //随机屏幕左侧位置
  116. for (int i = 0; i < gos.Count; i++)
  117. {
  118. var randomPos = gos[i].GetRandomPos(PosType.Left);
  119. int count = RamdomNum;
  120. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  121. {
  122. randomPos = gos[i].GetRandomPos(PosType.Left);
  123. count--;
  124. }
  125. var go = gos[i];
  126. go.SetPos(randomPos);
  127. //目标点是横向对称的位置
  128. go.transform.DOLocalMoveX(-go.transform.localPosition.x, go.GetDuration()).SetEase(Ease.InSine);
  129. _setList.Add(go);
  130. }
  131. }
  132. }
  133. /// <summary>
  134. /// 右左水平移动
  135. /// </summary>
  136. public class RightToLeft : Move
  137. {
  138. public override void InitPos(List<SpineAnimationLoader> gos)
  139. {
  140. //随机屏幕右侧位置
  141. for (int i = 0; i < gos.Count; i++)
  142. {
  143. var randomPos = gos[i].GetRandomPos(PosType.Right);
  144. int count = RamdomNum;
  145. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  146. {
  147. randomPos = gos[i].GetRandomPos(PosType.Right);
  148. count--;
  149. }
  150. var go = gos[i];
  151. go.SetPos(randomPos);
  152. //目标点是横向对称的位置
  153. go.transform.DOLocalMoveX(-go.transform.localPosition.x, go.GetDuration()).SetEase(Ease.InSine);
  154. _setList.Add(go);
  155. }
  156. }
  157. }
  158. /// <summary>
  159. /// 相对水平移动
  160. /// </summary>
  161. public class RelativeHor : Move
  162. {
  163. public override void InitPos(List<SpineAnimationLoader> gos)
  164. {
  165. //随机屏幕左右侧位置 一左一右
  166. for (int i = 0; i < gos.Count; i++)
  167. {
  168. var tempPos = i % 2 == 0 ? PosType.Left : PosType.Right;
  169. var randomPos = gos[i].GetRandomPos(tempPos);
  170. int count = RamdomNum;
  171. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  172. {
  173. randomPos = gos[i].GetRandomPos(tempPos);
  174. count--;
  175. }
  176. var go = gos[i];
  177. go.SetPos(randomPos);
  178. //目标点是横向对称的位置
  179. go.transform.DOLocalMoveX(-go.transform.localPosition.x, go.GetDuration()).SetEase(Ease.InSine);
  180. _setList.Add(go);
  181. }
  182. }
  183. }
  184. /// <summary>
  185. /// 相对垂直移动
  186. /// </summary>
  187. public class RelativeVet : Move
  188. {
  189. public override void InitPos(List<SpineAnimationLoader> gos)
  190. {
  191. //随机屏幕上下侧位置 一上一下
  192. for (int i = 0; i < gos.Count; i++)
  193. {
  194. var tempPos = i % 2 == 0 ? PosType.Top : PosType.Down;
  195. var randomPos = gos[i].GetRandomPos(tempPos);
  196. int count = RamdomNum;
  197. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  198. {
  199. randomPos = gos[i].GetRandomPos(tempPos);
  200. count--;
  201. }
  202. var go = gos[i];
  203. go.SetPos(randomPos);
  204. //目标点是纵向对称的位置
  205. go.transform.DOLocalMoveY(-go.transform.localPosition.y, go.GetDuration()).SetEase(Ease.InSine);
  206. _setList.Add(go);
  207. }
  208. }
  209. }
  210. /// <summary>
  211. /// 同步斜向移动
  212. /// </summary>
  213. public class Diagonal : Move
  214. {
  215. public override void InitPos(List<SpineAnimationLoader> gos)
  216. {
  217. //随机屏幕对角侧位置 一上一下
  218. var random = Random.Range(0, 1);
  219. for (int i = 0; i < gos.Count; i++)
  220. {
  221. var temp = i % 2 == 0;
  222. PosType posType;
  223. if (random == 0)
  224. posType = temp ? PosType.LeftTop : PosType.LeftDown;
  225. else
  226. posType = temp ? PosType.RightTop : PosType.RightDown;
  227. var randomPos = gos[i].GetRandomPos(posType);
  228. int count = RamdomNum;
  229. while (IsUIBlock(gos[i], randomPos, false) && count > 0)
  230. {
  231. randomPos = gos[i].GetRandomPos(posType);
  232. count--;
  233. }
  234. var go = gos[i];
  235. go.SetPos(randomPos);
  236. //目标点是对角位置
  237. go.transform.DOLocalMoveY(-go.transform.localPosition.y, go.GetDuration());
  238. go.transform.DOLocalMoveX(-go.transform.localPosition.x, go.GetDuration());
  239. _setList.Add(go);
  240. }
  241. }
  242. }
  243. /// <summary>
  244. /// 同步W型移动
  245. /// </summary>
  246. public class W : Move
  247. {
  248. public override void InitPos(List<SpineAnimationLoader> gos)
  249. {
  250. //从左侧开始 一上一下 往右W轨迹运动
  251. for (int i = 0; i < gos.Count; i++)
  252. {
  253. var tempPos = i % 2 == 0 ? PosType.LeftTop : PosType.LeftDown;
  254. var randomPos = gos[i].GetRandomPos(tempPos);
  255. int count = RamdomNum;
  256. while (IsUIBlock(gos[i], randomPos, false) && count > 0)
  257. {
  258. randomPos = gos[i].GetRandomPos(tempPos);
  259. count--;
  260. }
  261. var go = gos[i];
  262. go.SetPos(randomPos);
  263. _setList.Add(go);
  264. Vector3[] positions = new Vector3[5];
  265. positions[0] = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y, 0);
  266. positions[4] = new Vector3(-positions[0].x, positions[0].y, 0);
  267. positions[2] = new Vector3(0, positions[0].y, 0);
  268. positions[1] = new Vector3(positions[0].x * 0.5f, -positions[0].y, 0);
  269. positions[3] = new Vector3(positions[0].x * -0.5f, -positions[0].y, 0);
  270. go.transform.DOLocalPath(positions, go.GetDuration(), PathType.CatmullRom).SetEase(Ease.Linear);
  271. }
  272. }
  273. }
  274. /// <summary>
  275. /// 相对W型移动
  276. /// </summary>
  277. public class W2 : Move
  278. {
  279. public override void InitPos(List<SpineAnimationLoader> gos)
  280. {
  281. List<PosType> temp = new List<PosType>();
  282. //四个角落随机创建 W运动
  283. for (int i = 0; i < gos.Count; i++)
  284. {
  285. if (temp.Count <= 0)
  286. {
  287. temp.Add(PosType.LeftTop);
  288. temp.Add(PosType.LeftDown);
  289. temp.Add(PosType.RightDown);
  290. temp.Add(PosType.RightTop);
  291. }
  292. var random = Random.Range(0, temp.Count - 1);
  293. var tempPos = temp[random];
  294. temp.RemoveAt(random);
  295. var randomPos = gos[i].GetRandomPos(tempPos);
  296. int count = RamdomNum;
  297. while (IsUIBlock(gos[i], randomPos, false) && count > 0)
  298. {
  299. randomPos = gos[i].GetRandomPos(tempPos);
  300. count--;
  301. }
  302. var go = gos[i];
  303. go.SetPos(randomPos);
  304. _setList.Add(go);
  305. Vector3[] positions = new Vector3[5];
  306. positions[0] = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y, 0);
  307. positions[4] = new Vector3(-positions[0].x, positions[0].y, 0);
  308. positions[2] = new Vector3(0, positions[0].y, 0);
  309. positions[1] = new Vector3(positions[0].x * 0.5f, -positions[0].y, 0);
  310. positions[3] = new Vector3(positions[0].x * -0.5f, -positions[0].y, 0);
  311. go.transform.DOLocalPath(positions, go.GetDuration(), PathType.CatmullRom).SetEase(Ease.Linear);
  312. }
  313. }
  314. }
  315. /// <summary>
  316. /// 横排同步水平移动 垂直运动
  317. /// </summary>
  318. public class HOR : Move
  319. {
  320. public override void InitPos(List<SpineAnimationLoader> gos)
  321. {
  322. //随机屏幕上下侧位置
  323. var random = Random.Range(0, 1);
  324. var tempPos = random == 0 ? PosType.Top : PosType.Down;
  325. for (int i = 0; i < gos.Count; i++)
  326. {
  327. var randomPos = gos[i].GetRandomPos(tempPos);
  328. int count = RamdomNum;
  329. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  330. {
  331. randomPos = gos[i].GetRandomPos(tempPos);
  332. count--;
  333. }
  334. var go = gos[i];
  335. go.SetPos(randomPos);
  336. //目标点是纵向
  337. go.transform.DOLocalMoveY(-go.transform.localPosition.y, go.GetDuration());
  338. _setList.Add(go);
  339. }
  340. }
  341. }
  342. /// <summary>
  343. /// 垂直同步水平移动
  344. /// </summary>
  345. public class VET : Move
  346. {
  347. public override void InitPos(List<SpineAnimationLoader> gos)
  348. {
  349. //随机屏幕左右侧位置
  350. var random = Random.Range(0, 1);
  351. var tempPos = random == 0 ? PosType.Left : PosType.Right;
  352. for (int i = 0; i < gos.Count; i++)
  353. {
  354. var randomPos = gos[i].GetRandomPos(tempPos);
  355. int count = RamdomNum;
  356. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  357. {
  358. randomPos = gos[i].GetRandomPos(tempPos);
  359. count--;
  360. }
  361. var go = gos[i];
  362. go.SetPos(randomPos);
  363. //目标点是横向
  364. go.transform.DOLocalMoveX(-go.transform.localPosition.x, go.GetDuration());
  365. _setList.Add(go);
  366. }
  367. }
  368. }
  369. /// <summary>
  370. /// 旋转移动
  371. /// </summary>
  372. public class ROT : Move, IUpdate
  373. {
  374. private float speed;
  375. public override void InitPos(List<SpineAnimationLoader> gos)
  376. {
  377. for (int i = 0; i < gos.Count; i++)
  378. {
  379. var randomPos = gos[i].GetRandomPos(PosType.Rotate);
  380. int count = 2 * RamdomNum;
  381. while (IsUIBlock(gos[i], randomPos, false) || CheckOverLap(gos[i], randomPos) && count > 0)
  382. {
  383. randomPos = gos[i].GetRandomPos(PosType.Rotate);
  384. count--;
  385. }
  386. var go = gos[i];
  387. go.SetPos(randomPos);
  388. speed = 360f / go.GetDuration();
  389. _setList.Add(go);
  390. }
  391. }
  392. public void Update()
  393. {
  394. var center = new Vector3(ScreenWidth() * 0.5f, ScreenHeight() * 0.5f);
  395. foreach (var item in _setList)
  396. {
  397. if (!item.Equals(null))
  398. {
  399. var angle = speed * Time.deltaTime;
  400. item.rectTransform.Rotate(Vector3.forward, -angle);
  401. //center = Camera.main.ScreenToWorldPoint(new Vector3(center.x, center.y, 0));
  402. item.rectTransform.RotateAround(center, Vector3.forward, angle);
  403. }
  404. }
  405. }
  406. }