using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using QFramework; namespace QFramework { public class ToolBackPackPanelData : UIPanelData { } public partial class ToolBackPackPanel : UIPanel { //工具数据类对应工具实体 private Dictionary toolElements_Dic = new Dictionary(); //回收池 private List toolElementPool = new List(); //正确选项 private List rightToolElements = new List(); //选择的所有选项 private List selectToolElements = new List(); public event Action SelectElementHandle; private bool hintMode = false; public bool HintMode { get { return hintMode; } set { if (hintMode != value) { hintMode = value; Help_Btn.image.sprite = hintMode ? helpBtnSelectSprite : helpBtnNormalSprite; SetHintState(hintMode); } } } /// /// 选择对了正确的工具 /// private bool rightToolsEqualsSelectTools = false; /// /// 帮助按钮正常Sprite /// public Sprite helpBtnNormalSprite; /// /// 帮助按钮选择Sprite /// public Sprite helpBtnSelectSprite; protected override void OnInit(IUIData uiData = null) { mData = uiData as ToolBackPackPanelData ?? new ToolBackPackPanelData(); // please add init code here Help_Btn.onClick.AddListener(() => { hintMode = !hintMode; Help_Btn.image.sprite = hintMode ? helpBtnSelectSprite : helpBtnNormalSprite; SetHintState(hintMode); }); PackMode_Tool_Btn.onClick.AddListener(() => { //UIKit.OpenPanel(); }); } protected override void OnOpen(IUIData uiData = null) { } protected override void OnClose() { } /// /// 设置工具背包 /// /// public void InitToolList(List tools) { ClearToolPackList(); foreach (var item in tools) { ToolElement toolElement = GetToolElementByPool(); toolElement.InitConfig(item); toolElement.gameObject.SetActive(true); toolElement.transform.parent = Content; toolElements_Dic.Add(item, toolElement); toolElement.ToolSelectStatusChanged += OnToolElementSelectChanged; } Content.SetSizeWidth(62 * tools.Count + 20); } /// /// 设置当前正确工具 /// /// public void SetRightTools(List rightTools) { if (hintMode) { SetHintState(false); } rightToolElements.Clear(); foreach (var item in rightTools) { if (toolElements_Dic.ContainsKey(item)) { rightToolElements.Add(toolElements_Dic[item]); } } CheckRightElementsAndSelectElements(); if (hintMode) { SetHintState(true); } } /// /// 设置提示状态 /// /// public void SetHintState(bool state) { if (state) foreach (var item in toolElements_Dic.Values) if (!rightToolElements.Contains(item)) item.M_ToolStatus = ToolStatus.Normal; foreach (var item in rightToolElements) item.IsHintTool = state; } /// /// 判断当前工具选择状态 /// /// public bool CheckRightToolSelect() { return rightToolsEqualsSelectTools; } /// /// 是否开启提示 /// /// public bool IsHint() { return hintMode; } /// /// 清空工具背包 /// public void ClearToolPackList() { foreach (var item in toolElements_Dic) { item.Value.ToolSelectStatusChanged -= OnToolElementSelectChanged; PushToolElementToPool(item.Value); } toolElements_Dic.Clear(); rightToolElements.Clear(); selectToolElements.Clear(); } public void OnToolElementSelectChanged(object sender, ToolElement element) { if (element.M_ToolStatus != ToolStatus.Select && selectToolElements.Contains(element)) { selectToolElements.Remove(element); } else if (element.M_ToolStatus == ToolStatus.Select && !selectToolElements.Contains(element)) { selectToolElements.Add(element); } else { return; } CheckElementSeleted(element); CheckRightElementsAndSelectElements(); } /// /// 每点击一次进行一次回调 /// private void CheckElementSeleted(ToolElement element) { if (rightToolElements.Contains(element)) SelectElementHandle?.Invoke(true); else SelectElementHandle?.Invoke(false); } /// /// 判断正确集合和当前选择集合是否相等 /// private void CheckRightElementsAndSelectElements() { if (rightToolElements.Count != selectToolElements.Count) { rightToolsEqualsSelectTools = false; return; } else { foreach (var item in rightToolElements) { if (!selectToolElements.Contains(item)) { rightToolsEqualsSelectTools = false; return; } } rightToolsEqualsSelectTools = true; } } /// /// 从对象池中获取对象 /// /// /// public ToolElement GetToolElementByPool() { ToolElement result = null; //判断是否有该名字的对象池 if (toolElementPool.Count > 0) { //获取这个对象池中的第一个对象 result = toolElementPool[0]; //激活对象 result.gameObject.SetActive(true); //从对象池中移除对象 toolElementPool.Remove(result); //返回结果 return result; } //实例化物体 result = Instantiate(ToolElement.gameObject, this.transform).GetComponent(); return result; } /// /// 回收对象到对象池 /// public void PushToolElementToPool(ToolElement element) { element.ClearConfig(); if (!toolElementPool.Contains(element)) { toolElementPool.Add(element); } element.gameObject.SetActive(false); } } }