MainUIBuilder.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. using DG.Tweening;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. using UnityEngine.EventSystems;
  8. /// <summary>
  9. /// 主界面建筑
  10. /// </summary>
  11. public class MainUIBuilder : MonoBehaviour
  12. {
  13. /// <summary>
  14. /// 初始化建筑的虚拟相机
  15. /// </summary>
  16. [SerializeField]
  17. private Dictionary<int, Transform> m_InitBuilderMCs = new Dictionary<int, Transform>();
  18. /// <summary>
  19. /// 点击建筑的虚拟相机
  20. /// </summary>
  21. [SerializeField]
  22. private Dictionary<int, Transform> m_ClickBuildeMCs = new Dictionary<int, Transform>();
  23. /// <summary>
  24. /// 解锁建筑的虚拟相机
  25. /// </summary>
  26. [SerializeField]
  27. private Dictionary<int, Transform> m_UnlockBuilderMCs = new Dictionary<int, Transform>();
  28. private Dictionary<int, Transform> m_UnlockBuilderCollider = new Dictionary<int, Transform>();
  29. /// <summary>
  30. /// 界面渐变过度遮罩
  31. /// </summary>
  32. [SerializeField]
  33. private Image m_BlackBoxs;
  34. /// <summary>
  35. /// UI目标节点列表
  36. /// </summary>
  37. [SerializeField]
  38. private Dictionary<int, Transform> m_UiTargetPoints = new Dictionary<int, Transform>();
  39. /// <summary>
  40. /// UI列表
  41. /// </summary>
  42. //[SerializeField]
  43. //private Dictionary<int, Transform> m_NameUis = new Dictionary<int, Transform>();
  44. private Vector3 originOff; // 当前UI系统(0,0)点 相对于屏幕左下角(0, 0)点的偏移量
  45. public bool isInput;
  46. private sm_build buildInfo;
  47. private int selectBuildIndex = 0;
  48. EventSystem eventSystem;
  49. GraphicRaycaster raycastInCanvas;
  50. Transform nameUis;
  51. private IEnumerator enumerator = null;
  52. GameObject m_BG;
  53. GameObject _uiCanvas = null;
  54. UI_BuildInfo[] buildInfos = null;
  55. List<int> builderIDs;
  56. //GameObject m_Canvas;
  57. //GameObject m_MainCamera;
  58. ///// <summary>
  59. ///// 事件字典,存储注册事件
  60. ///// </summary>
  61. //private Dictionary<int, Action> EventDic = new Dictionary<int, Action>();
  62. //private bool enableBuilderCollider;
  63. private void OnEnable()
  64. {
  65. m_BG = transform.Find("BG").gameObject;
  66. _uiCanvas = transform.Find("Canvas").gameObject;
  67. //ShowUICanvas();
  68. //m_Canvas = transform.Find("Canvas").gameObject;
  69. //m_MainCamera = transform.Find("Main Camera").gameObject;
  70. ///获取所需对象
  71. Transform initBuilderMCs = transform.Find("CMs/InitBuilderMCs");
  72. foreach (Transform child in initBuilderMCs)
  73. {
  74. UI_BuildInfo info = child.GetComponent<UI_BuildInfo>();
  75. m_InitBuilderMCs[info.buildId] = child;
  76. }
  77. Transform clickBuildeMCs = transform.Find("CMs/ClickBuildeMCs");
  78. foreach (Transform child in clickBuildeMCs)
  79. {
  80. UI_BuildInfo info = child.GetComponent<UI_BuildInfo>();
  81. m_ClickBuildeMCs[info.buildId] = child;
  82. }
  83. Transform nlockBuilderMCs = transform.Find("CMs/UnlockBuilderMCs");
  84. foreach (Transform child in nlockBuilderMCs)
  85. {
  86. UI_BuildInfo info = child.GetComponent<UI_BuildInfo>();
  87. m_UnlockBuilderMCs[info.buildId] = child;
  88. }
  89. Transform nlockBuilderCld = transform.Find("BG/Main");
  90. foreach (Transform child in nlockBuilderCld)
  91. {
  92. UI_BuildInfo info = child.GetComponentInChildren<UI_BuildInfo>();
  93. if (info == null)
  94. {
  95. continue;
  96. }
  97. Collider collider = info.transform.GetComponentInChildren<Collider>(true);
  98. if (collider)
  99. {
  100. m_UnlockBuilderCollider[info.buildId] = collider.transform;
  101. }
  102. else
  103. {
  104. m_UnlockBuilderCollider[info.buildId] = null;
  105. }
  106. }
  107. // 初始化建筑点击回调
  108. buildInfos = gameObject.GetComponentsInChildren<UI_BuildInfo>(true);
  109. if (buildInfos != null)
  110. {
  111. for (int i = 0; i < buildInfos.Length; i++)
  112. {
  113. buildInfos[i].touchUpAC = ClickBuildCallback;
  114. }
  115. }
  116. else
  117. {
  118. Debug.Log("xxxxxxx初始化建筑失败");
  119. }
  120. m_BlackBoxs = transform.Find("Canvas/BlackBox").GetComponent<Image>();
  121. //ui位置
  122. Transform UiTargetPoints = transform.Find("UiTargetPoints");
  123. foreach (Transform child in UiTargetPoints)
  124. {
  125. UI_BuildInfo info = child.GetComponent<UI_BuildInfo>();
  126. m_UiTargetPoints[info.buildId] = child;
  127. }
  128. originOff = new Vector3(-Screen.width / 2, -Screen.height / 2);
  129. raycastInCanvas = this.transform.Find("Canvas").GetComponent<GraphicRaycaster>();
  130. Reposition();
  131. InitBuilder();
  132. }
  133. // Start is called before the first frame update
  134. void Start()
  135. {
  136. isInput = false;
  137. //enableBuilderCollider = true;
  138. ////事件注册测试,正式版本请删除。
  139. //AddBuiderClickEventListener(1,()=>
  140. //{
  141. // Debug.Log("关卡章节界面弹出");
  142. //});
  143. }
  144. /// <summary>
  145. /// 点击建筑回调
  146. /// </summary>
  147. /// <param name="builID"></param>
  148. private void ClickBuildCallback(int builID)
  149. {
  150. List<int> builderIDs = UserProxy.Instance.player.PrivateState.unlockedBuild;
  151. if (builderIDs.Contains(builID) == false)
  152. {
  153. return;
  154. }
  155. buildInfo = sm_build.GetMoById(builID);
  156. if (buildInfo != null)
  157. {
  158. SelectBuilder(buildInfo.id);
  159. }
  160. }
  161. // Update is called once per frame
  162. void Update()
  163. {
  164. //if(PanelHelper.Instance.GetNowPanelName() != "UI_BaseMainWindow")
  165. //{
  166. // HideUICanvas();
  167. //}
  168. //else
  169. //{
  170. // ShowUICanvas();
  171. //}
  172. if (isInput)
  173. {
  174. return;
  175. }
  176. Reposition();
  177. }
  178. /// <summary>
  179. /// 初始化建筑
  180. /// </summary>
  181. /// <param name="builderID">当前已解锁到的建筑id</param>
  182. public void InitBuilder()
  183. {
  184. //this.m_BlackBoxs.gameObject.SetActive(true);
  185. //显示可视元素
  186. ShowVisible();
  187. //ShowUICanvas();
  188. if (builderIDs == null)
  189. {
  190. builderIDs = UserProxy.Instance.player.PrivateState.unlockedBuild;
  191. if (builderIDs.Count == 0)
  192. {
  193. builderIDs.Add(0);//添加默认相机id
  194. }
  195. }
  196. ///关闭全部虚拟相机
  197. CloseAllCM();
  198. //foreach (var item in m_NameUis)
  199. //{
  200. // item.Value.gameObject.SetActive(false);
  201. //}
  202. foreach (var item in m_InitBuilderMCs)
  203. {
  204. item.Value.gameObject.SetActive(false);
  205. }
  206. foreach (var item in m_ClickBuildeMCs)
  207. {
  208. item.Value.gameObject.SetActive(false);
  209. }
  210. foreach (var item in m_UnlockBuilderCollider)
  211. {
  212. if (item.Value)
  213. {
  214. item.Value.gameObject.SetActive(true);
  215. Animator anim = item.Value.transform.parent.parent.GetComponent<Animator>();
  216. if (anim)
  217. {
  218. anim.Play("lock", 0, 0);
  219. }
  220. }
  221. }
  222. foreach (var item in builderIDs)
  223. {
  224. if (m_UnlockBuilderCollider.ContainsKey(item) && m_UnlockBuilderCollider[item])
  225. {
  226. m_UnlockBuilderCollider[item].gameObject.SetActive(true);
  227. Animator anim = m_UnlockBuilderCollider[item].transform.parent.parent.GetComponent<Animator>();
  228. if (anim)
  229. {
  230. anim.Play("unlock", 0, 0);
  231. }
  232. }
  233. }
  234. ///画面渐黑效果
  235. if (builderIDs.Count > 0)
  236. {
  237. m_InitBuilderMCs[builderIDs[builderIDs.Count - 1]].gameObject.SetActive(true);
  238. StopCoroutine("_InitBuilder");//停止协成
  239. StartCoroutine(_InitBuilder(builderIDs[builderIDs.Count - 1]));//开始协成
  240. }
  241. }
  242. IEnumerator _InitBuilder(int builderID)
  243. {
  244. //m_BlackBoxs.gameObject.SetActive(true);
  245. m_BlackBoxs.color = new Color(1, 1, 1, 1);
  246. m_BlackBoxs.DOFade(0, 0.5f);
  247. yield return new WaitForSeconds(0.5f);//等待间隔时间
  248. //m_BlackBoxs.gameObject.SetActive(false);
  249. isInput = false;
  250. }
  251. private int convertBuildIdToIndex(int buildId)
  252. {
  253. switch (buildId)
  254. {
  255. case 1000:
  256. return 0;
  257. case 1001:
  258. return 1;
  259. case 1002:
  260. return 2;
  261. case 1003:
  262. return 3;
  263. case 1004:
  264. return 4;
  265. case 1005:
  266. return 5;
  267. case 1006:
  268. return 6;
  269. case 1007:
  270. return 7;
  271. case 1008:
  272. return 8;
  273. case 1009:
  274. return 9;
  275. }
  276. return 0;
  277. }
  278. private int convertIndexToBuildId(int index)
  279. {
  280. switch (index)
  281. {
  282. case 0:
  283. return 1000;
  284. case 1:
  285. return 1001;
  286. case 2:
  287. return 1002;
  288. case 3:
  289. return 1003;
  290. case 4:
  291. return 1004;
  292. case 5:
  293. return 1005;
  294. case 6:
  295. return 1006;
  296. case 7:
  297. return 1007;
  298. case 8:
  299. return 1008;
  300. case 9:
  301. return 1009;
  302. }
  303. return 0;
  304. }
  305. /// <summary>
  306. /// 选择建筑
  307. /// </summary>
  308. /// <param name="builderID"></param>
  309. public void SelectBuilder(int builderID = 0, Action callback = null)
  310. {
  311. isInput = true;
  312. selectBuildIndex = builderID;
  313. buildInfo = sm_build.GetMoById(builderID);
  314. //m_BlackBoxs.gameObject.SetActive(true);
  315. ///关闭全部虚拟相机
  316. CloseAllCM();
  317. ///开启推进相机
  318. m_ClickBuildeMCs[builderID].gameObject.SetActive(true);
  319. ///画面渐黑效果
  320. if (enumerator != null)
  321. {
  322. StopCoroutine(enumerator);//停止协成
  323. enumerator = null;
  324. }
  325. enumerator = _SelectBuilder(builderID, callback);
  326. StartCoroutine(enumerator);//开始协成
  327. }
  328. IEnumerator _SelectBuilder(int builderID, Action callback = null)
  329. {
  330. //// 界面功能
  331. //if (buildInfo == null)
  332. //{
  333. // yield break;
  334. //}
  335. //关闭名字UI
  336. //foreach (var item in m_NameUis)
  337. //{
  338. // if (item.Value != null)
  339. // {
  340. // item.Value.gameObject.SetActive(false);
  341. // }
  342. //}
  343. yield return new WaitForSeconds(1.0f);//等待间隔时间
  344. m_BlackBoxs.DOFade(1, 0.5f);//画面变黑
  345. yield return new WaitForSeconds(0.5f);//等待间隔时间
  346. HideVisible();//隐藏可视元素
  347. ///触发回调函数
  348. if (callback != null) callback();
  349. yield return new WaitForSeconds(0.1f);//等待间隔时间
  350. //m_BlackBoxs.gameObject.SetActive(false);
  351. //enableBuilderCollider = false;
  352. //this.m_BlackBoxs.gameObject.SetActive(false);
  353. if (buildInfo.functionUI != "")
  354. {
  355. PanelHelper.Instance.ShowPanel(buildInfo.functionUI);
  356. PanelHelper.Instance.ClosePanel("UI_BaseMainWindow");
  357. }
  358. // 场景功能
  359. else if (buildInfo.sceneRes != "")
  360. {
  361. //LevelManager.Instance().LoadLevel(E_Level.Battle, buildInfo.sceneRes, buildInfo.id);
  362. LevelManager.Instance().LoadLevel(buildInfo.sceneRes, "", buildInfo.id, 0);
  363. }
  364. // 其他功能
  365. else
  366. {
  367. PanelHelper.Instance.ShowPanel("UI_BuildDialogWindow", panel =>
  368. {
  369. //panel.GetComponent<UI_BuildDialogWindow>().Init(buildInfo.info);
  370. }, buildInfo.id.ToString());
  371. }
  372. Entrance_WorldMap.mainUIBuilder.gameObject.SetActive(false);
  373. }
  374. /// <summary>
  375. /// 解锁建筑
  376. /// </summary>
  377. /// <param name="builderID"></param>
  378. public void UnlockBuilder(int builderID = 0)
  379. {
  380. m_BlackBoxs.color = new Color(1, 1, 1, 0);
  381. ///关闭全部虚拟相机
  382. CloseAllCM();
  383. ///开启解锁相机
  384. m_UnlockBuilderMCs[builderID].gameObject.SetActive(true);
  385. if (m_UnlockBuilderCollider[builderID])
  386. {
  387. m_UnlockBuilderCollider[builderID].gameObject.SetActive(true);
  388. }
  389. }
  390. /// <summary>
  391. /// 关闭全部虚拟相机
  392. /// </summary>
  393. private void CloseAllCM()
  394. {
  395. foreach (var obj in m_InitBuilderMCs)
  396. {
  397. obj.Value.gameObject.SetActive(false);
  398. }
  399. foreach (var obj in m_ClickBuildeMCs)
  400. {
  401. obj.Value.gameObject.SetActive(false);
  402. }
  403. foreach (var obj in m_UnlockBuilderMCs)
  404. {
  405. obj.Value.gameObject.SetActive(false);
  406. }
  407. foreach (var obj in m_UnlockBuilderCollider)
  408. {
  409. if (obj.Value)
  410. {
  411. obj.Value.gameObject.SetActive(false);
  412. }
  413. }
  414. }
  415. /// <summary>
  416. /// 根据目标物体 重定位UI
  417. /// </summary>
  418. private void Reposition()
  419. {
  420. if (Camera.main == null)
  421. {
  422. return;
  423. }
  424. //遍历全部目标
  425. //遍历全部名字ui
  426. //foreach (var item in m_UiTargetPoints)
  427. //{
  428. // Vector3 position = Camera.main.WorldToScreenPoint(item.Value.position);
  429. // position.z = 0;
  430. // m_NameUis[item.Key].localPosition = position;
  431. //}
  432. }
  433. /// <summary>
  434. /// 隐藏可视元素
  435. /// </summary>
  436. private void HideVisible()
  437. {
  438. m_BG.SetActive(false);
  439. //m_Canvas.SetActive(false);
  440. //m_MainCamera.SetActive(false);
  441. }
  442. /// <summary>
  443. /// 显示可视元素
  444. /// </summary>
  445. private void ShowVisible()
  446. {
  447. m_BG.SetActive(true);
  448. //m_Canvas.SetActive(true);
  449. //m_MainCamera.SetActive(true);
  450. }
  451. //public void HideUICanvas()
  452. //{
  453. // _uiCanvas.SetActive(false);
  454. //}
  455. //public void ShowUICanvas()
  456. //{
  457. // _uiCanvas.SetActive(true);
  458. //}
  459. }