using System.Collections; using System.Collections.Generic; using TcgEngine.Client; using UnityEngine; namespace TcgEngine.UI { public class TaskPanel : UIPanel { public Transform taskListRoot; public GameObject taskItemPrefab; private Dictionary taskItems = new Dictionary(); public Dictionary allTaskData; protected override void Awake() { base.Awake(); allTaskData = new Dictionary(); TaskData[] datas = Resources.LoadAll("Tasks"); // 假设你放在 Resources/Tasks 下 foreach (var d in datas) { allTaskData[d.id] = d; } } protected override void Start() { base.Start(); Show(); } /// /// 初始化任务列表(只在第一次打开时用) /// public void ShowTasks(List playerTasks) { if (taskListRoot != null) { foreach (Transform child in taskListRoot) { Destroy(child.gameObject); } } ClearTasks(); foreach (var pTask in playerTasks) { GameObject gObj = Instantiate(taskItemPrefab, taskListRoot); TaskItem item = gObj.GetComponent(); taskItems[pTask.taskId] = item; TaskData data = LoadTaskDataById(pTask.taskId); if (data != null) { item.SetTask(data, pTask); } } } public void RefreshTasks(List playerTasks) { HashSet currentIds = new HashSet(); foreach (var pTask in playerTasks) { if (taskItems.ContainsKey(pTask.taskId)) { TaskItem item = taskItems[pTask.taskId]; TaskData data = LoadTaskDataById(pTask.taskId); if (data != null) { item.SetTask(data, pTask); } currentIds .Remove(pTask.taskId); } else { GameObject gObj = Instantiate(taskItemPrefab, taskListRoot); TaskItem item = gObj.GetComponent(); taskItems[pTask.taskId] = item; TaskData data = LoadTaskDataById(pTask.taskId); if (data != null) item.SetTask(data, pTask); } } // Step 2: 删除那些在 playerTasks 里不存在的旧任务 foreach (var oldId in currentIds) { if (taskItems.TryGetValue(oldId, out TaskItem oldItem)) { Destroy(oldItem.gameObject); taskItems.Remove(oldId); } } } public void ClearTasks() { foreach (var item in taskItems.Values) { Destroy(item.gameObject); } taskItems.Clear(); } public override void AfterHide() { base.AfterHide(); ClearTasks(); } private TaskData LoadTaskDataById(string id) { if (allTaskData.TryGetValue(id, out TaskData data)) return data; return null; } } }