TransferComponent.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. using BeinLab.Util;
  2. using DG.Tweening;
  3. using SC.XR.Unity.Module_InputSystem;
  4. using ShadowStudio.Model;
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using UnityEngine;
  9. using UnityEngine.EventSystems;
  10. using XRTool.Util;
  11. namespace ShadowStudio.Tool
  12. {
  13. ///// <summary>
  14. ///// 编辑状态
  15. ///// </summary>
  16. //public enum TransferState
  17. //{
  18. // Start = 0,
  19. // Doing = 1,
  20. // Stop = 2
  21. //}
  22. //[RequireComponent(typeof(XBoundingBox))]
  23. //[RequireComponent(typeof(XDragComponent))]
  24. public class TransferComponent : MonoBehaviour/*, IPointerDownHandler*/
  25. {
  26. //[SerializeField]
  27. ///// <summary>
  28. ///// 是否垂直水平面
  29. ///// </summary>
  30. //private bool isLookHead;
  31. ///// <summary>
  32. ///// 拖拽事件
  33. ///// </summary>
  34. //public event Action<TransferState> DragTransfer;
  35. ///// <summary>
  36. ///// 缩放事件
  37. ///// </summary>
  38. //public event Action<TransferState> ZoomTransfer;
  39. ///// <summary>
  40. ///// 旋转事件
  41. ///// </summary>
  42. //public event Action<TransferState> RoteTransfer;
  43. ///// <summary>
  44. ///// 编辑事件
  45. ///// 当物体进行拖拽,缩放,旋转时都会触发
  46. ///// </summary>
  47. //public event Action<TransferState> EditTransfer;
  48. ///// <summary>
  49. ///// 选中和非选中的事件
  50. ///// </summary>
  51. //public event Action<TransferComponent, bool> TransferSelect;
  52. //public static TransferComponent curActiveCell;
  53. //private XDragComponent dragCell;
  54. //private XBoundingBox boundBox;
  55. //private Coroutine editCoroutine;
  56. //private bool isLock;
  57. ///// <summary>
  58. ///// 编辑模式
  59. ///// -1代表未编辑
  60. ///// 0代表拖拽
  61. ///// 1代表旋转
  62. ///// 2代表缩放
  63. ///// 开始前/结束后要设置为-1
  64. ///// 开始后到执行中设置对应的状态
  65. ///// </summary>
  66. //private int editType = -1;
  67. //private Timer dragTimer;
  68. //public float autoDisDrag = 5f;
  69. //private Stack<Posture> postureHistroy;
  70. //private Stack<Posture> postureFuture;
  71. //private GameObject boundCell;
  72. //[SerializeField]
  73. //private bool isDragEnable;
  74. ///// <summary>
  75. ///// 后退的栈
  76. ///// </summary>
  77. //public Stack<Posture> PostureBack
  78. //{
  79. // get
  80. // {
  81. // if (postureHistroy == null)
  82. // {
  83. // postureHistroy = new Stack<Posture>();
  84. // }
  85. // return postureHistroy;
  86. // }
  87. //}
  88. ///// <summary>
  89. ///// 前进的栈
  90. ///// </summary>
  91. //public Stack<Posture> PostureAhead
  92. //{
  93. // get
  94. // {
  95. // if (postureFuture == null)
  96. // {
  97. // postureFuture = new Stack<Posture>();
  98. // }
  99. // return postureFuture;
  100. // }
  101. //}
  102. ///// <summary>
  103. ///// 锁定
  104. ///// </summary>
  105. //public bool IsLock
  106. //{
  107. // get
  108. // {
  109. // return isLock;
  110. // }
  111. // set
  112. // {
  113. // isLock = value;
  114. // if (isLock)
  115. // {
  116. // PostureAhead.Clear();
  117. // PostureBack.Clear();
  118. // IsDragEnable = false;
  119. // SetBoundActive(true);
  120. // SetBoundColor(value, Color.yellow);
  121. // }
  122. // else
  123. // {
  124. // SetBoundColor(value, Color.white);
  125. // if (curActiveCell != this)
  126. // {
  127. // SetBoundActive(false);
  128. // }
  129. // }
  130. // }
  131. //}
  132. ///// <summary>
  133. ///// 拖拽组件
  134. ///// </summary>
  135. //public XDragComponent DragCell
  136. //{
  137. // get
  138. // {
  139. // if (!dragCell)
  140. // {
  141. // dragCell = GetComponent<XDragComponent>();
  142. // dragCell.PointerDrag.AddListener(OnPointerDrag);
  143. // //dragCell.PointerDown.AddListener(OnPointerDown);
  144. // dragCell.PointerUp.AddListener(OnPointerUp);
  145. // }
  146. // return dragCell;
  147. // }
  148. //}
  149. ///// <summary>
  150. ///// 包围盒显示对象
  151. ///// </summary>
  152. //public GameObject BoundCell
  153. //{
  154. // get
  155. // {
  156. // if (!boundCell)
  157. // {
  158. // boundCell = UnityUtil.GetBreadthChild(transform, "XRTool.Util.XBoundingBox");
  159. // }
  160. // return boundCell;
  161. // }
  162. //}
  163. ///// <summary>
  164. ///// 包围盒算法组件
  165. ///// </summary>
  166. //public XBoundingBox BoundBox
  167. //{
  168. // get
  169. // {
  170. // if (!boundBox)
  171. // {
  172. // boundBox = GetComponent<XBoundingBox>();
  173. // if (!boundBox)
  174. // {
  175. // UnityLog.Instance.LogError(gameObject.name + "this is no XBoundingBox");
  176. // }
  177. // else
  178. // {
  179. // DragTransfer += state => { EditTransfer?.Invoke(state); };
  180. // ZoomTransfer += state => { EditTransfer?.Invoke(state); };
  181. // RoteTransfer += state => { EditTransfer?.Invoke(state); };
  182. // EditTransfer += OnEditTransfer;
  183. // boundBox.ScaleStarted.AddListener(OnScaleStarted);
  184. // boundBox.ScaleStopped.AddListener(OnScaleStopped);
  185. // boundBox.RotateStarted.AddListener(OnRotateStarted);
  186. // boundBox.RotateStopped.AddListener(OnRotateStopped);
  187. // }
  188. // }
  189. // return boundBox;
  190. // }
  191. //}
  192. //public void SetBoundActive(bool isShow)
  193. //{
  194. // if (BoundCell)
  195. // {
  196. // BoundCell.SetActive(isShow);
  197. // }
  198. //}
  199. ///// <summary>
  200. ///// 初始化
  201. ///// </summary>
  202. //private void Start()
  203. //{
  204. // if (BoundBox)
  205. // {
  206. // TimerMgr.Instance.CreateTimer(() =>
  207. // {
  208. // IsDragEnable = false;
  209. // }, 0);
  210. // }
  211. //}
  212. ///// <summary>
  213. ///// 当编辑物体的时候
  214. ///// </summary>
  215. ///// <param name="state"></param>
  216. //private void OnEditTransfer(TransferState state)
  217. //{
  218. // if (state == TransferState.Start)
  219. // {
  220. // ClearTime();
  221. // AddBackNode(UnityUtil.GetPosture(transform));
  222. // }
  223. // if (state == TransferState.Stop)
  224. // {
  225. // ClearTime();
  226. // if (autoDisDrag > 0)
  227. // {
  228. // dragTimer = TimerMgr.Instance.CreateTimer(() => { IsDragEnable = false; }, autoDisDrag);
  229. // }
  230. // }
  231. // print(editType + "__" + state);
  232. //}
  233. ///// <summary>
  234. ///// 清除协程
  235. ///// </summary>
  236. //private void ClearEditor()
  237. //{
  238. // if (editCoroutine != null)
  239. // {
  240. // StopCoroutine(editCoroutine);
  241. // editCoroutine = null;
  242. // }
  243. //}
  244. ///// <summary>
  245. ///// 旋转结束
  246. ///// </summary>
  247. //private void OnRotateStopped()
  248. //{
  249. // ClearEditor();
  250. // RoteTransfer?.Invoke(TransferState.Stop);
  251. // editType = -1;
  252. //}
  253. ///// <summary>
  254. ///// 旋转开始
  255. ///// </summary>
  256. //private void OnRotateStarted()
  257. //{
  258. // ClearEditor();
  259. // RoteTransfer?.Invoke(TransferState.Start);
  260. // editCoroutine = StartCoroutine(EditorCoroutine(1));
  261. //}
  262. ///// <summary>
  263. ///// 缩放结束
  264. ///// </summary>
  265. //private void OnScaleStopped()
  266. //{
  267. // ClearEditor();
  268. // ZoomTransfer?.Invoke(TransferState.Stop);
  269. // editType = -1;
  270. // TimerMgr.Instance.CreateTimer(RemoveBound, 0.01f);
  271. //}
  272. ///// <summary>
  273. ///// 缩放开始
  274. ///// </summary>
  275. //private void OnScaleStarted()
  276. //{
  277. // ClearEditor();
  278. // ZoomTransfer?.Invoke(TransferState.Start);
  279. // editCoroutine = StartCoroutine(EditorCoroutine(2));
  280. //}
  281. ///// <summary>
  282. ///// 编辑的协程
  283. ///// </summary>
  284. ///// <returns></returns>
  285. //private IEnumerator EditorCoroutine(int state)
  286. //{
  287. // editType = state;
  288. // while (editType != -1)
  289. // {
  290. // if (editType == 1)
  291. // {
  292. // RoteTransfer?.Invoke(TransferState.Doing);
  293. // }
  294. // else if (editType == 2)
  295. // {
  296. // ZoomTransfer?.Invoke(TransferState.Doing);
  297. // }
  298. // yield return new WaitForFixedUpdate();
  299. // }
  300. //}
  301. ///// <summary>
  302. ///// 当按下的时候
  303. ///// 如果物体没有被锁定,处于可操作的状态时,显示操作框
  304. ///// </summary>
  305. ///// <param name="eventData"></param>
  306. //public void OnPointerDown(PointerEventData eventData)
  307. //{
  308. // if (IsLock || (SCInputModule.Instance && !SCInputModule.Instance.CanDrag))
  309. // {
  310. // return;
  311. // }
  312. // transform.DOKill();
  313. // editType = -1;
  314. // IsDragEnable = true;
  315. // if (BoundBox)
  316. // {
  317. // BoundBox.OnPointerDown(eventData);
  318. // }
  319. // if (DragCell)
  320. // {
  321. // DragCell.OnPointerDown(eventData);
  322. // }
  323. //}
  324. ///// <summary>
  325. ///// 当抬起的时候
  326. ///// </summary>
  327. ///// <param name="eventData"></param>
  328. //public void OnPointerUp(PointerEventData eventData)
  329. //{
  330. // if (SCInputModule.Instance && !SCInputModule.Instance.CanDrag)
  331. // {
  332. // return;
  333. // }
  334. // if (editType != -1)
  335. // {
  336. // DragTransfer?.Invoke(TransferState.Stop);
  337. // editType = -1;
  338. // }
  339. //}
  340. ///// <summary>
  341. ///// 拖拽事件
  342. ///// </summary>
  343. ///// <param name="eventData"></param>
  344. //private void OnPointerDrag(PointerEventData eventData)
  345. //{
  346. // if (editType == -1)
  347. // {
  348. // DragTransfer?.Invoke(TransferState.Start);
  349. // //EditorTransfer?.Invoke(state, false);
  350. // }
  351. // if (isLookHead)
  352. // {
  353. // editType = 1;
  354. // }
  355. // else
  356. // {
  357. // editType = 0;
  358. // }
  359. // if (isLookHead && GameSession.Instance && GameSession.Instance.gameHead)
  360. // {
  361. // Vector3 pos = GameSession.Instance.gameHead.position;
  362. // pos.y = transform.position.y;
  363. // Vector3 forward = (transform.position - pos).normalized;
  364. // pos.y = 0;
  365. // if (forward != Vector3.zero)
  366. // {
  367. // transform.forward = forward;
  368. // }
  369. // }
  370. // DragTransfer?.Invoke(TransferState.Doing);
  371. //}
  372. ///// <summary>
  373. ///// 添加一个后退的节点
  374. ///// 当退出一个前进的节点或者编辑物体的时候添加
  375. ///// </summary>
  376. ///// <param name="posture"></param>
  377. //public void AddBackNode(Posture posture)
  378. //{
  379. // if (PostureBack != null)
  380. // {
  381. // PostureBack.Push(posture);
  382. // }
  383. //}
  384. ///// <summary>
  385. ///// 退出一个后退的节点
  386. ///// </summary>
  387. //public bool PeekBackNode()
  388. //{
  389. // if (PostureBack != null && PostureBack.Count > 0)
  390. // {
  391. // AddAheadNode(UnityUtil.GetPosture(transform));
  392. // Posture posture = PostureBack.Pop();
  393. // DelaySyn(posture, 0.2f);
  394. // return true;
  395. // }
  396. // return false;
  397. //}
  398. ///// <summary>
  399. ///// 延时控制
  400. ///// </summary>
  401. ///// <param name="posture"></param>
  402. ///// <param name="time"></param>
  403. //public void DelaySyn(Posture posture, float time)
  404. //{
  405. // ClearTime();
  406. // editType = -1;
  407. // EditTransfer?.Invoke(TransferState.Start);
  408. // editType = 2;
  409. // UnityUtil.SetPosture(transform, posture, time);
  410. // ///同步3次位置,保持位移的实时性
  411. // TimerMgr.Instance.CreateTimer(() =>
  412. // {
  413. // EditTransfer?.Invoke(TransferState.Doing);
  414. // }, time / 4f, 3);
  415. // TimerMgr.Instance.CreateTimer(() =>
  416. // {
  417. // EditTransfer?.Invoke(TransferState.Stop);
  418. // editType = -1;
  419. // }, time + 0.01f);
  420. //}
  421. ///// <summary>
  422. ///// 添加一个前进的节点,仅当回退的时候添加
  423. ///// </summary>
  424. ///// <param name="posture"></param>
  425. //public void AddAheadNode(Posture posture)
  426. //{
  427. // if (PostureAhead != null)
  428. // {
  429. // PostureAhead.Push(posture);
  430. // }
  431. //}
  432. ///// <summary>
  433. ///// 退出一个前进的节点
  434. ///// </summary>
  435. //public bool PeekAheadNode()
  436. //{
  437. // if (PostureAhead != null && PostureAhead.Count > 0)
  438. // {
  439. // AddBackNode(UnityUtil.GetPosture(transform));
  440. // Posture posture = PostureAhead.Pop();
  441. // DelaySyn(posture, 0.2f);
  442. // return true;
  443. // }
  444. // return false;
  445. //}
  446. ///// <summary>
  447. ///// 清理此计时器
  448. ///// </summary>
  449. //private void ClearTime()
  450. //{
  451. // if (dragTimer != null && TimerMgr.Instance)
  452. // {
  453. // TimerMgr.Instance.DestroyTimer(dragTimer);
  454. // }
  455. // dragTimer = null;
  456. //}
  457. ///// <summary>
  458. ///// 重构包围盒
  459. ///// </summary>
  460. ///// <param name="isReStart"></param>
  461. //public void RemoveBound()
  462. //{
  463. // if (BoundCell)
  464. // {
  465. // Destroy(BoundCell);
  466. // }
  467. // BoundBox.Start();
  468. //}
  469. ///// <summary>
  470. ///// 设置编辑框的颜色
  471. ///// 用来判定颜色无法被选中的效果
  472. ///// </summary>
  473. ///// <param name="color"></param>
  474. //public void SetBoundColor(bool isLock, Color color)
  475. //{
  476. // if (BoundBox)
  477. // {
  478. // BoundBox.SetZoomColor(isLock, color);
  479. // }
  480. //}
  481. ///// <summary>
  482. ///// 获得距离最近的低啊
  483. ///// </summary>
  484. ///// <param name="point"></param>
  485. ///// <returns></returns>
  486. //public Vector3 GetCastPoint(Vector3 point)
  487. //{
  488. // if (BoundBox)
  489. // {
  490. // return BoundBox.GetCastPoint(point);
  491. // }
  492. // return transform.position;
  493. //}
  494. ///// <summary>
  495. ///// 设置位移编辑激活和失活
  496. ///// </summary>
  497. ///// <param name="isActive"></param>
  498. //public void SetTransferActive(bool isActive)
  499. //{
  500. // if (BoundBox && BoundBox.isActiveAndEnabled != isActive)
  501. // {
  502. // BoundBox.enabled = isActive;
  503. // }
  504. // if (DragCell && DragCell.isActiveAndEnabled != isActive)
  505. // {
  506. // DragCell.enabled = isActive;
  507. // }
  508. // SetBoundActive(isActive);
  509. // if (!isActive)
  510. // {
  511. // DisActiveCell();
  512. // }
  513. //}
  514. ///// <summary>
  515. ///// 设置可操作性
  516. ///// </summary>
  517. //public bool IsDragEnable
  518. //{
  519. // get => isDragEnable;
  520. // set
  521. // {
  522. // isDragEnable = value;
  523. // SetTransferActive(isDragEnable);
  524. // if (isDragEnable && !IsLock)
  525. // {
  526. // ChangeActive();
  527. // }
  528. // }
  529. //}
  530. //public void ChangeActive()
  531. //{
  532. // if (curActiveCell && curActiveCell != this)
  533. // {
  534. // if (!curActiveCell.IsLock)
  535. // {
  536. // curActiveCell.IsDragEnable = false;
  537. // }
  538. // }
  539. // if (!IsLock)
  540. // {
  541. // if (curActiveCell != this)
  542. // {
  543. // curActiveCell = this;
  544. // TransferSelect?.Invoke(this, true);
  545. // }
  546. // if (curActiveCell)
  547. // {
  548. // curActiveCell.SetBoundActive(true);
  549. // }
  550. // }
  551. //}
  552. //public void DisActiveCell()
  553. //{
  554. // if (curActiveCell == this)
  555. // {
  556. // TransferSelect?.Invoke(this, false);
  557. // curActiveCell = null;
  558. // }
  559. //}
  560. }
  561. }