123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- 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<ToolConfig, ToolElement> toolElements_Dic = new Dictionary<ToolConfig, ToolElement>();
- //回收池
- private List<ToolElement> toolElementPool = new List<ToolElement>();
- //正确选项
- private List<ToolElement> rightToolElements = new List<ToolElement>();
- //选择的所有选项
- private List<ToolElement> selectToolElements = new List<ToolElement>();
- public event Action<bool> 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);
- }
- }
- }
- /// <summary>
- /// 选择对了正确的工具
- /// </summary>
- private bool rightToolsEqualsSelectTools = false;
- /// <summary>
- /// 帮助按钮正常Sprite
- /// </summary>
- public Sprite helpBtnNormalSprite;
- /// <summary>
- /// 帮助按钮选择Sprite
- /// </summary>
- 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<ToolLibraryForm>();
- });
- }
- protected override void OnOpen(IUIData uiData = null)
- {
- }
- protected override void OnClose()
- {
- }
- /// <summary>
- /// 设置工具背包
- /// </summary>
- /// <param name="tools"></param>
- public void InitToolList(List<ToolConfig> 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);
- }
- /// <summary>
- /// 设置当前正确工具
- /// </summary>
- /// <param name="rightTools"></param>
- public void SetRightTools(List<ToolConfig> 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);
- }
- }
- /// <summary>
- /// 设置提示状态
- /// </summary>
- /// <param name="state"></param>
- 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;
- }
- /// <summary>
- /// 判断当前工具选择状态
- /// </summary>
- /// <returns></returns>
- public bool CheckRightToolSelect()
- {
- return rightToolsEqualsSelectTools;
- }
- /// <summary>
- /// 是否开启提示
- /// </summary>
- /// <returns></returns>
- public bool IsHint()
- {
- return hintMode;
- }
- /// <summary>
- /// 清空工具背包
- /// </summary>
- 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();
- }
- /// <summary>
- /// 每点击一次进行一次回调
- /// </summary>
- private void CheckElementSeleted(ToolElement element)
- {
- if (rightToolElements.Contains(element)) SelectElementHandle?.Invoke(true);
- else SelectElementHandle?.Invoke(false);
- }
- /// <summary>
- /// 判断正确集合和当前选择集合是否相等
- /// </summary>
- 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;
- }
- }
- /// <summary>
- /// 从对象池中获取对象
- /// </summary>
- /// <param name="objName"></param>
- /// <returns></returns>
- 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<ToolElement>();
- return result;
- }
- /// <summary>
- /// 回收对象到对象池
- /// </summary>
- public void PushToolElementToPool(ToolElement element)
- {
- element.ClearConfig();
- if (!toolElementPool.Contains(element))
- {
- toolElementPool.Add(element);
- }
- element.gameObject.SetActive(false);
- }
- }
- }
|