BoardDlg.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. using BeinLab.Util;
  2. using CScript.App;
  3. using DG.Tweening;
  4. using LitJson;
  5. using PublicTools.XMLDataBase;
  6. using ShadowStudio.Model;
  7. using ShadowStudio.UI;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using UnityEngine;
  12. using UnityEngine.SceneManagement;
  13. using UnityEngine.UI;
  14. using XRTool.UI;
  15. using XRTool.Util;
  16. using XRTool.WorldUI;
  17. namespace ShadowStudio.Tool
  18. {
  19. /// <summary>
  20. /// 黑板类
  21. /// </summary>
  22. [RequireComponent(typeof(WorldDlg))]
  23. public class BoardDlg : UnitySingleton<BoardDlg>
  24. {
  25. public WorldDlg dlg;
  26. public BoardConf boardConf;
  27. private RectTransform container;
  28. /// <summary>
  29. /// 存储窗口的起点和终点
  30. /// </summary>
  31. private Dictionary<Vector2, Vector2> cellMap;
  32. private List<WorldDlg> dlgMap = new List<WorldDlg>();
  33. protected override void OnDestroy()
  34. {
  35. base.OnDestroy();
  36. if (cellMap != null)
  37. {
  38. cellMap.Clear();
  39. }
  40. cellMap = null;
  41. }
  42. /// <summary>
  43. /// 初始化窗口
  44. /// </summary>
  45. private void InitConf()
  46. {
  47. #if UNITY_EDITOR || !UNITY_ANDROID
  48. TableInterface table = XSql.Instance.OpenTable(ResourcesManager.LocalPath, typeof(BoardConf).Name, ".xml", true);
  49. if (!table.Open())
  50. {
  51. table.Create(typeof(BoardConf).Name);
  52. }
  53. var boards = table.FindAllData<BoardConf>();
  54. if (boards == null || boards.Count < 1)
  55. {
  56. boardConf = new BoardConf();
  57. table.InsertData(boardConf);
  58. table.Close();
  59. }
  60. else
  61. {
  62. boardConf = boards[0];
  63. }
  64. #else
  65. string fullPath = Path.Combine(ResourcesManager.LocalPath, typeof(BoardConf).Name+".xml");
  66. GameNode.Instance. StartCoroutine( XSql.Instance.ReadServerData(fullPath,(List<BoardConf> boards) => {
  67. if (boards != null && boards.Count > 0)
  68. {
  69. boardConf = boards[0];
  70. dlg.DlgTrans.sizeDelta = boardConf.Boundary.Trans();
  71. dlg.SetScale(dlg.DlgTrans.sizeDelta);
  72. }
  73. }));
  74. #endif
  75. }
  76. private GameObject blackGroud;
  77. public GameObject BlackGroud
  78. {
  79. get
  80. {
  81. /*
  82. if (!blackGroud)
  83. {
  84. var dlg = Resources.Load("BackGround");
  85. if (dlg)
  86. {
  87. blackGroud = GameObject.Instantiate(dlg) as GameObject;
  88. GameNode.Instance.SetParent(ObjNode.WorldCanvas, blackGroud.transform, blackGroud.transform.localPosition, blackGroud.transform.localEulerAngles, blackGroud.transform.localScale);
  89. }
  90. }*/
  91. blackGroud = dlg.GetBreadthChild<Transform>("FrontBG").gameObject;
  92. return blackGroud;
  93. }
  94. }
  95. protected override void Awake()
  96. {
  97. base.Awake();
  98. InitConf();
  99. dlg = GetComponent<WorldDlg>();
  100. }
  101. private static Vector3 initBoard = Vector3.zero;
  102. //private Button loginOutBtn;
  103. private Button outRoomBtn;
  104. private TextMesh roomName;
  105. private TextMesh roomType;
  106. public TextMesh roomNum;
  107. private TextMesh roomPass;
  108. private TextMesh roomCreator;
  109. private TextMesh pubRoomType;
  110. private TextMesh roomExplain;
  111. private Button createSenceBtn;
  112. private Button showInfoBtn;
  113. private Button heidInfoBtn;
  114. private Button showUserListBtn;
  115. private Button heidUserListBtn;
  116. private GameObject UIRoot;
  117. private GameObject FullUIRoot;
  118. public GameObject AllInfoObj;
  119. public GameObject UserListObj;
  120. private void Start()
  121. {
  122. container = dlg.GetBreadthChild<RectTransform>("Container");
  123. //loginOutBtn = dlg.GetBreadthChild<Button>("LoginOutBtn");
  124. outRoomBtn = dlg.GetBreadthChild<Button>("OutRoomBtn");
  125. showInfoBtn = dlg.GetBreadthChild<Button>("ShowInfoBtn");
  126. heidInfoBtn = dlg.GetBreadthChild<Button>("HeidInfoBtn");
  127. showInfoBtn.onClick.AddListener(ShowAllInfo);
  128. heidInfoBtn.onClick.AddListener(HeidAllInfo);
  129. roomName = dlg.GetBreadthChild<TextMesh>("RoomName");
  130. roomType = dlg.GetBreadthChild<TextMesh>("RoomType");
  131. roomNum = dlg.GetBreadthChild<TextMesh>("RoomNum");
  132. roomPass = dlg.GetBreadthChild<TextMesh>("RoomPass");
  133. roomCreator = dlg.GetBreadthChild<TextMesh>("RoomCreator");
  134. pubRoomType = dlg.GetBreadthChild<TextMesh>("PubRoomType");
  135. roomExplain = dlg.GetBreadthChild<TextMesh>("RoomExplain");
  136. createSenceBtn = dlg.GetBreadthChild<Button>("CreateSenceBtn");
  137. showUserListBtn = dlg.GetBreadthChild<Button>("ShowUserListBtn");
  138. heidUserListBtn = dlg.GetBreadthChild<Button>("HeidUserListBtn");
  139. if (CommonMethod.roomConfig != null)
  140. {
  141. #if UNITY_EDITOR
  142. roomName.text = CommonMethod.roomConfig.Room_name + " (" + CommonMethod.roomConfig.Id + ")";
  143. #else
  144. roomName.text = CommonMethod.roomConfig.Room_name ;
  145. #endif
  146. Debug.Log("房间密码"+CommonMethod.roomConfig.Room_password);
  147. if (string.IsNullOrEmpty(CommonMethod.roomConfig.Room_password))
  148. {
  149. roomPass.text = LanguageMgr.Instance.GetMessage("1090").Message;
  150. }
  151. else
  152. {
  153. if (!string.IsNullOrEmpty(CommonMethod.roomPassWord))
  154. {
  155. roomPass.text = CommonMethod.roomPassWord;
  156. CommonMethod.roomPassWord = "";
  157. }
  158. }
  159. roomCreator.text = CommonMethod.roomConfig.Nick_name;
  160. if (CommonMethod.roomConfig.Room_explain == "")
  161. {
  162. roomExplain.text = LanguageMgr.Instance.GetMessage("1090").Message;
  163. }
  164. else
  165. {
  166. roomExplain.text = CommonMethod.roomConfig.Room_explain;
  167. }
  168. //roomExplain.text = CommonMethod.roomConfig.Room_explain;
  169. if (int.Parse(CommonMethod.roomConfig.Max_member) < 1)
  170. {
  171. CommonMethod.roomConfig.Max_member = "1";
  172. }
  173. switch (CommonMethod.roomConfig.Type)
  174. {
  175. case "1":
  176. roomType.text = LanguageMgr.Instance.GetMessage("1036").Message;
  177. roomNum.text = "1/1";
  178. pubRoomType.text = LanguageMgr.Instance.GetMessage("1090").Message;
  179. break;
  180. case "2":
  181. roomType.text = LanguageMgr.Instance.GetMessage("1037").Message;
  182. roomNum.text = (int.Parse(CommonMethod.roomConfig.Number) + 1) + "/" + CommonMethod.roomConfig.Max_member;
  183. switch (CommonMethod.roomConfig.Room_type)
  184. {
  185. case "1":
  186. pubRoomType.text = LanguageMgr.Instance.GetMessage("1045").Message;
  187. break;
  188. case "2":
  189. pubRoomType.text = LanguageMgr.Instance.GetMessage("1046").Message;
  190. break;
  191. default:
  192. break;
  193. }
  194. break;
  195. }
  196. }
  197. createSenceBtn.onClick.AddListener(OnClickCreateSence);
  198. outRoomBtn.onClick.AddListener(OnClickOutRoom);
  199. showUserListBtn.onClick.AddListener(ShowUserList);
  200. heidUserListBtn.onClick.AddListener(HeidUserList);
  201. if (boardConf != null)
  202. {
  203. dlg.DlgTrans.sizeDelta = boardConf.Boundary.Trans();
  204. dlg.SetScale(dlg.DlgTrans.sizeDelta);
  205. }
  206. if (initBoard == Vector3.zero)
  207. {
  208. initBoard = transform.localPosition;
  209. }
  210. AllInfoObj.SetActive(false);
  211. UserListObj.SetActive(true);
  212. showUserListBtn.gameObject.SetActive(false);
  213. heidUserListBtn.gameObject.SetActive(true);
  214. Vector3 realPos = new Vector3(0,0,0);
  215. if (CScript.App.AppManager.Instance.isRunHolographic)
  216. {
  217. realPos = OpenXRCamera.Instance.head.TransformPoint(new Vector3(-initBoard.x, -initBoard.y, -initBoard.z / 3f));
  218. }else
  219. {
  220. realPos = OpenXRCamera.Instance.head.TransformPoint(initBoard);
  221. }
  222. transform.position = realPos;
  223. Vector3 pos = GameSession.Instance.gameHead.position;
  224. Vector3 forward = (realPos - pos).normalized;
  225. forward.y = 0;
  226. transform.forward = forward;
  227. GetComponent<TransferCell>().DragTransfer += OnDragTransfer;
  228. OnDragTransfer();
  229. //selectTarget.gameObject.SetActive(false);
  230. BlackGroud.SetActive(true);
  231. WorldDlgContainer.BackGD = BlackGroud;
  232. WorldDlgContainer.BackGD.GetComponent<MeshRenderer>().material.SetFloat("_Int", 10);
  233. UIRoot = UnityUtil.GetBreadthChild(this.transform, "UIRoot");
  234. // UIRoot.SetActive(false);
  235. FullUIRoot = UnityUtil.GetBreadthChild(this.transform, "FullUIRoot");
  236. // FullUIRoot.SetActive(false);
  237. //被zby替换的代码
  238. //if (ItemView.itemPos != Vector3.zero)
  239. if (MenuIcon.itemPos != Vector3.zero)
  240. {
  241. GameEffect.setAlpha(FullUIRoot, 0, 0.1f);
  242. GameEffect.setAlpha(UIRoot, 0, 0.1f);
  243. initScale = dlg.transform.localScale;
  244. initPos = dlg.transform.position;
  245. this.gameObject.SetActive(false);
  246. TimerMgr.Instance.CreateTimer(() =>
  247. {
  248. //被zby替换的代码
  249. //dlg.transform.position = ItemView.itemPos;
  250. dlg.transform.position = MenuIcon.itemPos;
  251. dlg.transform.localScale = dlg.transform.localScale / 35;
  252. this.gameObject.SetActive(true);
  253. MeshRenderer mr = WorldDlgContainer.BackGD.GetComponent<MeshRenderer>();
  254. mr.material.DOTiling(new Vector2(1, 1), "_TextureSample0", 1f);
  255. mr.material.DOOffset(new Vector2(0, 0), "_TextureSample0", 1f);
  256. dlg.transform.DOMove(initPos, 1f);
  257. GameEffect.setAlpha(FullUIRoot, 1, 1);
  258. GameEffect.setAlpha(UIRoot, 1, 1);
  259. mr.material.DOFloat(4, "_Int", 1f);
  260. dlg.transform.DOScale(initScale, 1f).OnComplete(() =>
  261. {
  262. });
  263. /*
  264. dlg.transform.DOScale(dlg.transform.localScale*4, 0.5f).OnComplete(()=> {
  265. dlg.transform.DOScale(initScale, 1f).OnComplete(()=> {
  266. GameEffect.setAlpha(FullUIRoot, 1, 1);
  267. GameEffect.setAlpha(UIRoot, 1, 1);
  268. PictrueContainer.BackGD.GetComponent<MeshRenderer>().material.DOFloat(4, "_Int", 1f);
  269. });
  270. });*/
  271. }, 0.2f);
  272. }
  273. }
  274. private void OnClickCreateSence()
  275. {
  276. if (ItemSenceList.Instance)
  277. {
  278. string scenename = "场景" + ItemSenceList.Instance.GetSceneCount();
  279. WSHandler.Room.CreateScene(scenename);
  280. }
  281. }
  282. private void HeidUserList()
  283. {
  284. UserListObj.SetActive(false);
  285. heidUserListBtn.gameObject.SetActive(false);
  286. showUserListBtn.gameObject.SetActive(true);
  287. }
  288. private void ShowUserList()
  289. {
  290. UserListObj.SetActive(true);
  291. showUserListBtn.gameObject.SetActive(false);
  292. heidUserListBtn.gameObject.SetActive(true);
  293. }
  294. private void HeidAllInfo()
  295. {
  296. AllInfoObj.SetActive(false);
  297. }
  298. private void ShowAllInfo()
  299. {
  300. AllInfoObj.SetActive(true);
  301. }
  302. private void OnClickOutRoom()
  303. {
  304. TransferCell.CancelCell();
  305. if (ConsoleDlg.Instance)
  306. {
  307. ConsoleDlg.Instance.CloseScan();
  308. }
  309. AgoraVideoAudioManager.Instance.LeaveChannel();
  310. AppManager.Instance.MeshPoint.SetActive(false);
  311. DestoryARcamera();
  312. // WSHandler.Room.ExitRoom();
  313. ShowViewMgr.Instance.SelfLeaveRoom();
  314. WSHandler.roomCloes();
  315. Vector3 posRoom = outRoomBtn.transform.position;
  316. //被zby替换的代码
  317. //ItemView.itemPos = posRoom;
  318. MenuIcon.itemPos = posRoom;
  319. // SceneManager.LoadSceneAsync("Home", LoadSceneMode.Additive);
  320. if (posRoom != Vector3.zero)
  321. {
  322. MeshRenderer mr = WorldDlgContainer.BackGD.GetComponent<MeshRenderer>();
  323. mr.material.DOTiling(new Vector2(0.205f, 0.23f), "_TextureSample0", 0.5f).SetDelay<Tween>(0.2f);
  324. mr.material.DOOffset(new Vector2(0.3F, 0.3F), "_TextureSample0", 0.5f).SetDelay<Tween>(0.2f);
  325. mr.material.DOFloat(10, "_Int", 0.5f).SetDelay<Tween>(0.2f);
  326. dlg.transform.DOMove(posRoom, 0.5f).SetDelay<Tween>(0.2f).OnComplete<Tween>(() =>
  327. {
  328. ShowViewMgr.Instance.LoadHomeSence();
  329. }).SetDelay<Tween>(0.3f);
  330. dlg.transform.DOScale(initScale / 30, 0.5f).SetDelay<Tween>(0.3f);
  331. if (GameNode.Instance)
  332. {
  333. if (GameNode.Instance.GoodsContainerMap != null && GameNode.Instance.GoodsContainerMap.Count > 0)
  334. {
  335. foreach (int index in GameNode.Instance.GoodsContainerMap.Keys)
  336. {
  337. if (GameNode.Instance.GoodsContainerMap[index] != null&& GameNode.Instance.GoodsContainerMap[index].GetInstace())
  338. {
  339. GameNode.Instance.GoodsContainerMap[index].GetInstace().transform.DOMove(posRoom, 0.5f).SetDelay<Tween>(0.2f).OnComplete<Tween>(() =>
  340. {
  341. });
  342. GameNode.Instance.GoodsContainerMap[index].GetInstace().transform.DOScale(initScale / 30, 0.5f);
  343. }
  344. }
  345. }
  346. }
  347. else
  348. {
  349. if (GameNode.Instance.GoodsContainerMap != null && GameNode.Instance.GoodsContainerMap.Count > 0)
  350. {
  351. foreach (int index in GameNode.Instance.GoodsContainerMap.Keys)
  352. {
  353. if (GameNode.Instance.GoodsContainerMap[index] != null)
  354. {
  355. GameNode.Instance.GoodsContainerMap[index].GetInstace().transform.DOMove(posRoom, 0.5f).SetDelay<Tween>(0.2f).OnComplete<Tween>(() =>
  356. {
  357. });
  358. GameNode.Instance.GoodsContainerMap[index].GetInstace().transform.DOScale(initScale / 30, 0.5f);
  359. }
  360. }
  361. }
  362. }
  363. }
  364. else
  365. {
  366. ShowViewMgr.Instance.LoadHomeSence();
  367. }
  368. }
  369. public void DestoryARcamera()
  370. {
  371. if (CheckDeviceType.checkIsPhone())
  372. {
  373. return;
  374. }
  375. if (ConsoleDlg.Instance && ConsoleDlg.Instance.vufora_camera)
  376. {
  377. ConsoleDlg.Instance.vufora_camera.enabled = false;
  378. }
  379. if (Vuforia.VuforiaBehaviour.Instance)
  380. {
  381. Vuforia.VuforiaBehaviour.Instance.enabled = false;
  382. }
  383. if (ConsoleDlg.Instance && ConsoleDlg.Instance.vufora_camera)
  384. {
  385. Destroy(ConsoleDlg.Instance.vufora_camera.gameObject);
  386. }
  387. }
  388. private void OnClickLoginOut()
  389. {
  390. TransferCell.CancelCell();
  391. DestoryARcamera();
  392. WSHandler.Room.ExitRoom();
  393. ShowViewMgr.Instance.SelfLeaveRoom();
  394. WSHandler.roomCloes();
  395. WSHandler.clientClosed();
  396. ShowViewMgr.Instance.LoadLoginSence();
  397. }
  398. public void OnDragTransfer(TransferState state = TransferState.Doing)
  399. {
  400. if (GameNode.Instance)
  401. {
  402. GameNode.Instance.transform.position = transform.position;
  403. GameNode.Instance.transform.rotation = transform.rotation;
  404. transform.localPosition = Vector3.zero;
  405. transform.localRotation = Quaternion.identity;
  406. }
  407. else
  408. {
  409. GameNode.InitComplte += () =>
  410. {
  411. OnDragTransfer();
  412. };
  413. }
  414. }
  415. public void EnterCreatSceneBtn()
  416. {
  417. GetComponent<TransferCell>().DragStop();
  418. }
  419. /// <summary>
  420. /// 添加此窗口到黑板的合适位置
  421. /// 判断是否和已在窗口上的存在交叉
  422. /// 如果没有任何交叉,则加入
  423. /// 如果有交叉,移动至合适的位置
  424. /// Vector2 dis = b.center - a.center;
  425. /// if (((int) a.width + (int) b.width) / 2 > Math.Abs(dis.x) && ((int) a.height + (int) b.height) / 2 > Math.Abs(dis.y))
  426. /// </summary>
  427. /// <param name="dlg"></param>
  428. public void AddDlg(WorldDlg dlg, Vector3 prefectPos, bool isUser)
  429. {
  430. if (!dlgMap.Contains(dlg))
  431. {
  432. //dlgMap.Sort((dlg1, dlg2) => { return SortDlg(dlg1, dlg2, prefectPos); });
  433. bool isNeedMove = false;
  434. for (int i = dlgMap.Count - 1; i >= 0; i--)
  435. {
  436. var oldDlg = dlgMap[i];
  437. if (!oldDlg)
  438. {
  439. dlgMap.RemoveAt(i);
  440. continue;
  441. }
  442. Vector2 offsize = dlg.DlgTrans.anchoredPosition - oldDlg.DlgTrans.anchoredPosition;
  443. if ((oldDlg.DlgSize.x + dlg.DlgSize.x) / 2 > Math.Abs(offsize.x) &&
  444. (oldDlg.DlgSize.y + dlg.DlgSize.y) / 2 > Math.Abs(offsize.y))
  445. {
  446. isNeedMove = true;
  447. break;
  448. }
  449. }
  450. //for (int i = 0; i < dlgMap.Count; i++)
  451. //{
  452. // var oldDlg = dlgMap[i];
  453. // Vector2 offsize = dlg.DlgTrans.anchoredPosition - oldDlg.DlgTrans.anchoredPosition;
  454. // if ((oldDlg.DlgSize.x + dlg.DlgSize.x) / 2 > Math.Abs(offsize.x) &&
  455. // (oldDlg.DlgSize.y + dlg.DlgSize.y) / 2 > Math.Abs(offsize.y))
  456. // {
  457. // isNeedMove = true;
  458. // break;
  459. // }
  460. //}
  461. ///如果存在重叠的情况,需要移动
  462. ///计算合适的空余位置,并移动至合适的位置中去
  463. if (isNeedMove)
  464. {
  465. prefectPos.z = -(boardConf.Adsorption - boardConf.ShowDis) / 2;
  466. dlg.ContainerState = ContainerState.Free;
  467. }
  468. else
  469. {
  470. prefectPos.z = boardConf.ShowDis;
  471. dlgMap.Add(dlg);
  472. dlg.isOnBoard = true;
  473. }
  474. dlg.DlgTrans.DOKill();
  475. dlg.DlgTrans.DOAnchorPos3D(prefectPos, 0.3f).OnComplete(() =>
  476. {
  477. if (isUser && dlg.Transfer)
  478. {
  479. dlg.Transfer.DisActiveCell();
  480. }
  481. });
  482. }
  483. }
  484. private Vector3 initScale;
  485. private Vector3 initPos;
  486. /// <summary>
  487. /// 对窗口进行排序,排序规则:按照距离center点的远近进行排序
  488. /// </summary>
  489. /// <param name="dlg1"></param>
  490. /// <param name="dlg2"></param>
  491. /// <returns></returns>
  492. private int SortDlg(WorldDlg dlg1, WorldDlg dlg2, Vector2 center)
  493. {
  494. float dis1 = Vector2.Distance(dlg1.DlgTrans.anchoredPosition, center);
  495. float dis2 = Vector2.Distance(dlg2.DlgTrans.anchoredPosition, center);
  496. return dis1 > dis2 ? 1 : dis1 < dis2 ? -1 : 0;
  497. }
  498. public void RemoveDlg(WorldDlg dlg)
  499. {
  500. if (dlgMap.Contains(dlg))
  501. {
  502. dlgMap.Remove(dlg);
  503. dlg.isOnBoard = false;
  504. }
  505. }
  506. /// <summary>
  507. /// 尝试申请一个空间
  508. /// </summary>
  509. /// <param name="startPos"></param>
  510. /// <param name="endPos"></param>
  511. /// <param name="offset"></param>
  512. /// <returns></returns>
  513. public bool TryGetSpace(Vector2 startPos, Vector2 endPos, out Vector2 offset)
  514. {
  515. offset = Vector2.zero;
  516. if ((endPos.x - startPos.x) > container.rect.size.x || (endPos.y - startPos.y) > container.rect.size.y)
  517. {
  518. UnityLog.Instance.LogError("图片尺寸超过黑板大小!" + startPos.ToString() + "_" + endPos.ToString());
  519. return false;
  520. }
  521. if (cellMap == null)
  522. {
  523. cellMap = new Dictionary<Vector2, Vector2>();
  524. Vector2 tmpStart = startPos;
  525. while (tmpStart.x < 0)
  526. {
  527. tmpStart.x += boardConf.CellSize.x / 2;
  528. }
  529. while (tmpStart.y > 0)
  530. {
  531. tmpStart.y -= boardConf.CellSize.y / 2;
  532. }
  533. tmpStart.x = UnityUtil.GetNearst(tmpStart.x, boardConf.CellSize.x);
  534. tmpStart.y = UnityUtil.GetNearst(tmpStart.y, boardConf.CellSize.y);
  535. offset = tmpStart - startPos;
  536. return true;
  537. }
  538. else
  539. {
  540. Vector2 tmpStart = startPos;
  541. while (tmpStart.x < 0)
  542. {
  543. tmpStart.x += boardConf.CellSize.x / 2;
  544. }
  545. while (tmpStart.x > container.rect.size.x - (endPos.x - startPos.x))
  546. {
  547. tmpStart.x -= boardConf.CellSize.x / 2;
  548. }
  549. while (tmpStart.y > 0)
  550. {
  551. tmpStart.y -= boardConf.CellSize.y / 2;
  552. }
  553. while (tmpStart.y < (endPos.y - startPos.y) - container.rect.size.y)
  554. {
  555. tmpStart.y += boardConf.CellSize.y / 2;
  556. }
  557. tmpStart.x = UnityUtil.GetNearst(tmpStart.x, boardConf.CellSize.x);
  558. tmpStart.y = UnityUtil.GetNearst(tmpStart.y, boardConf.CellSize.y);
  559. if (cellMap.ContainsKey(tmpStart))
  560. {
  561. return false;
  562. }
  563. foreach (var item in cellMap)
  564. {
  565. Rect a = new Rect(item.Key, item.Value - item.Key);
  566. Rect b = new Rect(tmpStart, endPos - startPos);
  567. if (UnityUtil.IsCrossLine(a, b))
  568. {
  569. //UnityLog.Instance.Log("相交:" + a.ToString() + b.ToString(), 3);
  570. return false;
  571. }
  572. }
  573. offset = tmpStart - startPos;
  574. return true;
  575. }
  576. }
  577. /// <summary>
  578. /// 处理一个窗口是否可以放置到黑板上
  579. /// </summary>
  580. /// <param name="pic"></param>
  581. /// <param name="v"></param>
  582. public void ExecutePicture(WorldDlg pic, bool isDraging, bool isUser)
  583. {
  584. if (boardConf == null)
  585. {
  586. return;
  587. }
  588. ///相对位置
  589. Vector3 anchor3D = pic.DlgTrans.anchoredPosition3D;
  590. Vector3 rpos = anchor3D;
  591. if (pic.ContainerState == ContainerState.BoardMove)
  592. {
  593. pic.transform.forward = Vector3.Lerp(pic.transform.forward, transform.forward, Time.deltaTime * 6.66f);
  594. Vector3 pos = pic.DlgTrans.anchoredPosition3D;
  595. if (pos.z > boardConf.PressPonit)
  596. {
  597. pos.z = boardConf.PressPonit;
  598. }
  599. rpos = pos;
  600. pic.DlgTrans.anchoredPosition3D = pos;
  601. }
  602. if ((Math.Abs(rpos.z) <= boardConf.Adsorption && Vector3.Angle(transform.forward, pic.transform.forward) < boardConf.Angle) ||
  603. dlg.IsIntersect(pic))
  604. {
  605. if (isDraging)
  606. {
  607. pic.ContainerState = ContainerState.BoardMove;
  608. }
  609. else
  610. {
  611. pic.ContainerState = ContainerState.OnBoard;
  612. }
  613. }
  614. else if (dlg.IsIntersect(pic))
  615. {
  616. if (isDraging)
  617. {
  618. pic.transform.forward = Vector3.Lerp(pic.transform.forward, transform.forward, Time.deltaTime * 6.66f);
  619. }
  620. else
  621. {
  622. pic.ContainerState = ContainerState.OnBoard;
  623. }
  624. }
  625. else
  626. {
  627. if (!isDraging)
  628. {
  629. pic.ContainerState = ContainerState.Free;
  630. }
  631. else
  632. {
  633. pic.ContainerState = ContainerState.FreeMove;
  634. }
  635. }
  636. if (pic.ContainerState == ContainerState.OnBoard)
  637. {
  638. pic.transform.DORotate(transform.eulerAngles, 0.3f);
  639. if (!pic.isOnBoard)
  640. {
  641. AddDlg(pic, pic.DlgTrans.anchoredPosition3D, isUser);
  642. }
  643. else
  644. {
  645. pic.DlgTrans.DOKill();
  646. Vector3 pos = pic.DlgTrans.anchoredPosition3D;
  647. pos.z = boardConf.ShowDis;
  648. pic.DlgTrans.DOAnchorPos3D(pos, 0.3f).OnComplete(() =>
  649. {
  650. if (isUser&& pic.Transfer)
  651. {
  652. pic.Transfer.DisActiveCell();
  653. }
  654. });
  655. }
  656. }
  657. else
  658. {
  659. if (pic.isOnBoard)
  660. {
  661. RemoveDlg(pic);
  662. }
  663. }
  664. }
  665. }
  666. }