ToolBackPackPanel.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using QFramework;
  6. namespace QFramework
  7. {
  8. public class ToolBackPackPanelData : UIPanelData
  9. {
  10. }
  11. public partial class ToolBackPackPanel : UIPanel
  12. {
  13. //工具数据类对应工具实体
  14. private Dictionary<ToolConfig, ToolElement> toolElements_Dic = new Dictionary<ToolConfig, ToolElement>();
  15. //回收池
  16. private List<ToolElement> toolElementPool = new List<ToolElement>();
  17. //正确选项
  18. private List<ToolElement> rightToolElements = new List<ToolElement>();
  19. //选择的所有选项
  20. private List<ToolElement> selectToolElements = new List<ToolElement>();
  21. public event Action<bool> SelectElementHandle;
  22. private bool hintMode = false;
  23. public bool HintMode
  24. {
  25. get
  26. {
  27. return hintMode;
  28. }
  29. set
  30. {
  31. if (hintMode != value)
  32. {
  33. hintMode = value;
  34. Help_Btn.image.sprite = hintMode ? helpBtnSelectSprite : helpBtnNormalSprite;
  35. SetHintState(hintMode);
  36. }
  37. }
  38. }
  39. /// <summary>
  40. /// 选择对了正确的工具
  41. /// </summary>
  42. private bool rightToolsEqualsSelectTools = false;
  43. /// <summary>
  44. /// 帮助按钮正常Sprite
  45. /// </summary>
  46. public Sprite helpBtnNormalSprite;
  47. /// <summary>
  48. /// 帮助按钮选择Sprite
  49. /// </summary>
  50. public Sprite helpBtnSelectSprite;
  51. protected override void OnInit(IUIData uiData = null)
  52. {
  53. mData = uiData as ToolBackPackPanelData ?? new ToolBackPackPanelData();
  54. // please add init code here
  55. Help_Btn.onClick.AddListener(() =>
  56. {
  57. hintMode = !hintMode;
  58. Help_Btn.image.sprite = hintMode ? helpBtnSelectSprite : helpBtnNormalSprite;
  59. SetHintState(hintMode);
  60. });
  61. PackMode_Tool_Btn.onClick.AddListener(() =>
  62. {
  63. //UIKit.OpenPanel<ToolLibraryForm>();
  64. });
  65. }
  66. protected override void OnOpen(IUIData uiData = null)
  67. {
  68. }
  69. protected override void OnClose()
  70. {
  71. }
  72. /// <summary>
  73. /// 设置工具背包
  74. /// </summary>
  75. /// <param name="tools"></param>
  76. public void InitToolList(List<ToolConfig> tools)
  77. {
  78. ClearToolPackList();
  79. foreach (var item in tools)
  80. {
  81. ToolElement toolElement = GetToolElementByPool();
  82. toolElement.InitConfig(item);
  83. toolElement.gameObject.SetActive(true);
  84. toolElement.transform.parent = Content;
  85. toolElements_Dic.Add(item, toolElement);
  86. toolElement.ToolSelectStatusChanged += OnToolElementSelectChanged;
  87. }
  88. Content.SetSizeWidth(62 * tools.Count + 20);
  89. }
  90. /// <summary>
  91. /// 设置当前正确工具
  92. /// </summary>
  93. /// <param name="rightTools"></param>
  94. public void SetRightTools(List<ToolConfig> rightTools)
  95. {
  96. if (hintMode)
  97. {
  98. SetHintState(false);
  99. }
  100. rightToolElements.Clear();
  101. foreach (var item in rightTools)
  102. {
  103. if (toolElements_Dic.ContainsKey(item))
  104. {
  105. rightToolElements.Add(toolElements_Dic[item]);
  106. }
  107. }
  108. CheckRightElementsAndSelectElements();
  109. if (hintMode)
  110. {
  111. SetHintState(true);
  112. }
  113. }
  114. /// <summary>
  115. /// 设置提示状态
  116. /// </summary>
  117. /// <param name="state"></param>
  118. public void SetHintState(bool state)
  119. {
  120. if (state) foreach (var item in toolElements_Dic.Values) if (!rightToolElements.Contains(item)) item.M_ToolStatus = ToolStatus.Normal;
  121. foreach (var item in rightToolElements) item.IsHintTool = state;
  122. }
  123. /// <summary>
  124. /// 判断当前工具选择状态
  125. /// </summary>
  126. /// <returns></returns>
  127. public bool CheckRightToolSelect()
  128. {
  129. return rightToolsEqualsSelectTools;
  130. }
  131. /// <summary>
  132. /// 是否开启提示
  133. /// </summary>
  134. /// <returns></returns>
  135. public bool IsHint()
  136. {
  137. return hintMode;
  138. }
  139. /// <summary>
  140. /// 清空工具背包
  141. /// </summary>
  142. public void ClearToolPackList()
  143. {
  144. foreach (var item in toolElements_Dic)
  145. {
  146. item.Value.ToolSelectStatusChanged -= OnToolElementSelectChanged;
  147. PushToolElementToPool(item.Value);
  148. }
  149. toolElements_Dic.Clear();
  150. rightToolElements.Clear();
  151. selectToolElements.Clear();
  152. }
  153. public void OnToolElementSelectChanged(object sender, ToolElement element)
  154. {
  155. if (element.M_ToolStatus != ToolStatus.Select && selectToolElements.Contains(element))
  156. {
  157. selectToolElements.Remove(element);
  158. }
  159. else if (element.M_ToolStatus == ToolStatus.Select && !selectToolElements.Contains(element))
  160. {
  161. selectToolElements.Add(element);
  162. }
  163. else
  164. {
  165. return;
  166. }
  167. CheckElementSeleted(element);
  168. CheckRightElementsAndSelectElements();
  169. }
  170. /// <summary>
  171. /// 每点击一次进行一次回调
  172. /// </summary>
  173. private void CheckElementSeleted(ToolElement element)
  174. {
  175. if (rightToolElements.Contains(element)) SelectElementHandle?.Invoke(true);
  176. else SelectElementHandle?.Invoke(false);
  177. }
  178. /// <summary>
  179. /// 判断正确集合和当前选择集合是否相等
  180. /// </summary>
  181. private void CheckRightElementsAndSelectElements()
  182. {
  183. if (rightToolElements.Count != selectToolElements.Count)
  184. {
  185. rightToolsEqualsSelectTools = false;
  186. return;
  187. }
  188. else
  189. {
  190. foreach (var item in rightToolElements)
  191. {
  192. if (!selectToolElements.Contains(item))
  193. {
  194. rightToolsEqualsSelectTools = false;
  195. return;
  196. }
  197. }
  198. rightToolsEqualsSelectTools = true;
  199. }
  200. }
  201. /// <summary>
  202. /// 从对象池中获取对象
  203. /// </summary>
  204. /// <param name="objName"></param>
  205. /// <returns></returns>
  206. public ToolElement GetToolElementByPool()
  207. {
  208. ToolElement result = null;
  209. //判断是否有该名字的对象池
  210. if (toolElementPool.Count > 0)
  211. {
  212. //获取这个对象池中的第一个对象
  213. result = toolElementPool[0];
  214. //激活对象
  215. result.gameObject.SetActive(true);
  216. //从对象池中移除对象
  217. toolElementPool.Remove(result);
  218. //返回结果
  219. return result;
  220. }
  221. //实例化物体
  222. result = Instantiate(ToolElement.gameObject, this.transform).GetComponent<ToolElement>();
  223. return result;
  224. }
  225. /// <summary>
  226. /// 回收对象到对象池
  227. /// </summary>
  228. public void PushToolElementToPool(ToolElement element)
  229. {
  230. element.ClearConfig();
  231. if (!toolElementPool.Contains(element))
  232. {
  233. toolElementPool.Add(element);
  234. }
  235. element.gameObject.SetActive(false);
  236. }
  237. }
  238. }