修改天梯UI数据,及任务的UI数据的初步同步

This commit is contained in:
YiHan0621
2025-09-04 18:04:09 +08:00
parent 9275b66383
commit 1f8e74b6c5
92 changed files with 6288 additions and 1393 deletions

View File

@@ -0,0 +1,13 @@
namespace TcgEngine
{
public enum PlayerRank
{
Bronze = 1, // 青铜
Silver, // 白银
Gold, // 黄金
Platinum, // 铂金
Diamond, // 钻石
King // 王者
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d4d1858a3e374fad88a50b93ce108699
timeCreated: 1756956870

View File

@@ -0,0 +1,80 @@
using System.Collections.Generic;
using UnityEngine;
namespace TcgEngine
{
[CreateAssetMenu(fileName = "NewRankMedalData", menuName = "TcgEngine/Rank/RankMedalData", order = 5)]
public class RankMedalData : ScriptableObject
{
public string medalName;
public Sprite sprite;
public string icon_url;
private static List<RankMedalData> medalList = new List<RankMedalData>();
/// <summary>
/// 从 Resources 目录加载所有 RankIconData
/// </summary>
public static void Load(string folder = "")
{
if (medalList.Count == 0)
{
medalList.AddRange(Resources.LoadAll<RankMedalData>(folder));
}
}
/// <summary>
/// 获取所有奖牌配置
/// </summary>
public static List<RankMedalData> GetAll()
{
return medalList;
}
/// <summary>
/// 根据奖牌名称查找
/// </summary>
public static RankMedalData Get(string name)
{
foreach (RankMedalData item in medalList)
{
if (item.medalName == name)
return item;
}
return null;
}
/// <summary>
/// 获取奖牌 Sprite优先走网络路径需要配合 SpriteLoader
/// </summary>
public Sprite GetIcon()
{
Sprite result = null;
if (!string.IsNullOrEmpty(icon_url))
{
result = SpriteLoader.Get()?.LoadSprite(icon_url);
if (result != null)
{
return result;
}
if (sprite != null)
{
Debug.LogWarning($"奖牌 {medalName} -- 动态加载失败使用静态Sprite -- {icon_url}");
return sprite;
}
Debug.LogError($"奖牌 {medalName} -- 动态路径无效且没有静态Sprite -- {icon_url}");
return null;
}
else
{
Debug.LogWarning($"奖牌 {medalName} 未配置网络路径使用静态Sprite");
return sprite;
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1c608c7081254d72a729e959fb60231a
timeCreated: 1756975648

View File

@@ -0,0 +1,111 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace TcgEngine
{
[CreateAssetMenu(fileName = "NewRankingData", menuName = "TcgEngine/Rank/RankingData", order = 5)]
public class RankingData :ScriptableObject
{
public string rankName = "青铜";
public PlayerRank rank;
public Sprite rankIcon;
public string rank_img_path;
public static List<RankingData> rank_lisk = new List<RankingData>();
public static void Load(string folder="")
{
if (rank_lisk.Count == 0)
{
rank_lisk.AddRange(Resources.LoadAll<RankingData>(folder));
}
rank_lisk.Sort((a, b) => a.rank.CompareTo(b.rank));
}
/// <summary>
/// 获取Rank图片优先使用动态路径
/// </summary>
public Sprite GetRankImage()
{
Sprite sprite = null;
if (!string.IsNullOrEmpty(rank_img_path))
{
sprite = SpriteLoader.Get()?.LoadSprite(rank_img_path);
if (sprite != null)
{
return sprite;
}
if (rankIcon != null)
{
Debug.LogWarning($"Rank {rankName} -- 动态加载失败使用静态Icon -- {rank_img_path}");
return rankIcon;
}
Debug.LogError($"Rank {rankName} -- 动态路径无效且没有静态Icon -- {rank_img_path}");
return null;
}
else
{
Debug.LogWarning($"Rank {rankName} 段位路径为空使用静态Icon");
return rankIcon;
}
}
public static RankingData Get(PlayerRank pRank)
{
foreach (RankingData item in GetAll())
{
if (item.rank == pRank)
{
return item;
}
}
return null;
}
public static List<RankingData> GetAllAvailable()
{
List<RankingData> validList = new List<RankingData>();
foreach (RankingData item in GetAll())
{
if (!string.IsNullOrEmpty(item.rank_img_path) || item.rankIcon != null)
{
validList.Add(item);
}
}
return validList;
}
public static List<RankingData> GetAll()
{
return rank_lisk;
}
// 当 Inspector 值发生改变时自动调用
private void OnValidate()
{
Dictionary<PlayerRank, string> rankNames = new Dictionary<PlayerRank, string>()
{
{ PlayerRank.Bronze, "青铜" },
{ PlayerRank.Silver, "白银" },
{ PlayerRank.Gold, "黄金" },
{ PlayerRank.Platinum, "铂金" },
{ PlayerRank.Diamond, "钻石" },
{ PlayerRank.King, "王者" }
};
if(rankNames.ContainsKey(rank))
rankName = rankNames[rank];
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5802a2b802f84bc1978f57cf18eb6f1f
timeCreated: 1756956121

View File

@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using TcgEngine.Client;
using TcgEngine.Gameplay;
using TcgEngine.UI;
namespace TcgEngine.Client
{
@@ -9,25 +11,48 @@ namespace TcgEngine.Client
/// </summary>
public class GameClientTaskIntegration : MonoBehaviour
{
[Header("所有任务")]
public List<PlayerTask> tasks = new List<PlayerTask>();
[Header("活跃任务")]
public List<PlayerTask> activeTasks = new List<PlayerTask>();
[Header("已完成任务")]
public List<PlayerTask> completedTasks = new List<PlayerTask>();
private GameClient client;
private TaskPanel taskPanel;
private void Start()
{
Debug.LogError("------------"+gameObject.name+"-------------------");
// 在游戏客户端启动时初始化任务系统
GameClient client = GameClient.Get();
client = FindFirstObjectByType<GameClient>();
client = GameClient.Get();
Debug.LogError(client.name);
if (client != null)
{
// 玩家连接到游戏服务器时触发任务检查
client.onConnectServer += OnConnectToServer;
Debug.LogError(client.onConnectServer + "任务系统初始化成功");
}
if (TaskManager.Instance != null)
{
TaskManager.Instance.refreshTaskUI += OnRefreshTaskPanel;
}
// 找 UI 面板
taskPanel = GetComponent<TaskPanel>();
if (taskPanel == null)
taskPanel = FindObjectOfType<TaskPanel>();
}
private void OnDestroy()
{
// 取消订阅事件
GameClient client = GameClient.Get();
if (client != null)
{
client.onConnectServer -= OnConnectToServer;
}
client.onConnectServer -= OnConnectToServer;
TaskManager.Instance.refreshTaskUI -= OnRefreshTaskPanel;
}
private void OnConnectToServer()
@@ -36,8 +61,25 @@ namespace TcgEngine.Client
TaskManager taskManager = TaskManager.Instance;
if (taskManager != null)
{
Debug.LogError("初始化完成");
taskManager.OnPlayerLogin();
taskPanel.ShowTasks(taskManager.GetAllTasks());
}
}
private void OnRefreshTaskPanel(List<PlayerTask> tasksList)
{
TaskManager taskManager = TaskManager.Instance;
if (taskManager == null || taskPanel == null)
return;
tasks = taskManager.GetAllTasks();
activeTasks = taskManager.GetActiveTasks();
completedTasks = taskManager.GetCompletedTasks();
taskPanel.RefreshTasks(activeTasks);
}
}
}

View File

@@ -24,6 +24,10 @@ namespace TcgEngine.Gameplay
private GameLogic gameLogic;
private System.Random random = new System.Random();
public Action<List<PlayerTask>> refreshTaskUI;
private GameClient gameClient;
private void Awake()
{
if (Instance == null)
@@ -39,18 +43,19 @@ namespace TcgEngine.Gameplay
private void Start()
{
LoadTasks();
LoadPlayerData();
}
private void OnEnable()
{
// 订阅游戏事件
GameClient client = GameClient.Get();
if (client != null)
gameClient = FindFirstObjectByType<GameClient>();
gameClient = GameClient.Get();
if (gameClient != null)
{
client.onGameStart += OnGameStart;
client.onGameEnd += OnGameEnd;
LoadTasks();
LoadPlayerData();
gameClient.onGameStart += OnGameStart;
gameClient.onGameEnd += OnGameEnd;
}
// 移除对GameLogic.Instance的错误引用改为检查gameLogic变量
@@ -63,11 +68,12 @@ namespace TcgEngine.Gameplay
private void OnDisable()
{
// 取消订阅游戏事件
GameClient client = GameClient.Get();
if (client != null)
gameClient = FindFirstObjectByType<GameClient>();
gameClient = GameClient.Get();
if (gameClient != null)
{
client.onGameStart -= OnGameStart;
client.onGameEnd -= OnGameEnd;
gameClient.onGameStart -= OnGameStart;
gameClient.onGameEnd -= OnGameEnd;
}
// 移除对GameLogic.Instance的错误引用改为检查gameLogic变量
@@ -128,6 +134,11 @@ namespace TcgEngine.Gameplay
Debug.Log("Loaded " + taskResponses.Length + " tasks from server");
// 在实际项目中这里应该将服务器数据转换为TaskData对象并存储在内存中
// 供后续使用而不是每次都从Resources加载
foreach (var item in taskResponses)
{
Debug.Log($"<color=pink>{item.id}</color>");
}
}
catch (Exception e)
{
@@ -145,6 +156,24 @@ namespace TcgEngine.Gameplay
Debug.Log("Loaded " + localTasks.Length + " tasks from local resources as fallback");
}
#if UNITY_EDITOR
private void Update()
{
if (Input.GetKeyDown(KeyCode.K))
{
LoadTasks();
LoadPlayerData();
SavePlayerData();
}
if (Input.GetKeyDown(KeyCode.U))
{
UpdateTaskProgress(TaskConditionType.WinGames, "YiYongJun", "YiYongJun");
UpdateTaskProgress(TaskConditionType.SummonHeroWithAttributes, "WangGuoJun", "YiYongJun");
}
}
#endif
private async void LoadPlayerData()
{
// 从服务器加载玩家任务数据
@@ -159,6 +188,8 @@ namespace TcgEngine.Gameplay
string url = ApiClient.ServerURL + "/users/" + ApiClient.Get().UserID + "/tasks";
WebResponse res = await ApiClient.Get().SendGetRequest(url);
Debug.Log($"<color=red>{url}</color>");
if (res.success)
{
// 解析玩家任务数据
@@ -175,6 +206,7 @@ namespace TcgEngine.Gameplay
{
PlayerTask playerTask = new PlayerTask(taskResponse);
playerTasks.Add(playerTask);
Debug.Log(playerTask);
}
Debug.Log("Player tasks loaded from server: " + playerTasks.Count + " tasks");
@@ -202,6 +234,7 @@ namespace TcgEngine.Gameplay
// 将玩家任务数据保存到服务器
if (ApiClient.Get() != null && ApiClient.Get().IsLoggedIn())
{
Debug.Log("<color=red> GO GO GO </color>");
// 准备要发送的数据
PlayerTasksResponse saveData = new PlayerTasksResponse();
@@ -219,9 +252,11 @@ namespace TcgEngine.Gameplay
string url = ApiClient.ServerURL + "/users/" + ApiClient.Get().UserID + "/tasks";
WebResponse res = await ApiClient.Get().SendPostRequest(url, json);
Debug.Log($"<color=red>{res}</color>");
if (res.success)
{
Debug.Log("Player tasks saved to server");
Debug.Log("--Player tasks saved to server");
}
else
{
@@ -371,7 +406,7 @@ namespace TcgEngine.Gameplay
private void UpdateTaskProgress(TaskConditionType conditionType, string parameter1 = null, string parameter2 = null)
{
bool progressUpdated = false;
refreshTaskUI?.Invoke(playerTasks);
foreach (var task in playerTasks)
{
if (task.status != TaskStatus.Active)

View File

@@ -9,13 +9,14 @@ namespace TcgEngine.UI
{
public class LadderRankLine : MonoBehaviour
{
[Header("排名")] public Text ranking;
[Header("排名文本")] public Text ranking;
[Header("排名Icon")] public Image rankingIcon;
[Header("玩家名称")] public Text playerName;
[Header("头像")] public Image avatar;
[Header("天梯ID")] public Text rankId; // 天梯ID
[Header("天梯ID")] public Image rankId; // 天梯ID
[Header("天梯分数")] public Text rankScore;
@@ -31,46 +32,47 @@ namespace TcgEngine.UI
public string username;
private void Start()
public PlayerRank pd;
private void Awake()
{
highlight.enabled = false;
RankingData.Load();
RankMedalData.Load();
}
public void SetLine(LadderLeaderboardEntry udata, int ranking, Sprite avatar,
int rankId, int rankScore, int stars, bool highlight)
{
this.username = udata.username;
this.ranking.text = ranking.ToString();
RankMedalShow(ranking);
this.playerName.text = username;
this.rankId.text = rankId.ToString();
this.rankScore.text = rankScore.ToString();
this.stars.text = "星×" + stars;
this.avatar.sprite = avatar;
switch (rankId)
PlayerRank pr = PlayerRank.Bronze; // 默认
switch(rankId)
{
case 1:
this.rankId.text = "青铜";
break;
case 2:
this.rankId.text = "白银";
break;
case 3:
this.rankId.text = "黄金";
break;
case 4:
this.rankId.text = "铂金";
break;
case 5:
this.rankId.text = "钻石";
break;
case 6:
this.rankId.text = "王者";
break;
default:
this.rankId.text = "青铜";
break;
case 1: pr = PlayerRank.Bronze; break;
case 2: pr = PlayerRank.Silver; break;
case 3: pr = PlayerRank.Gold; break;
case 4: pr = PlayerRank.Platinum; break;
case 5: pr = PlayerRank.Diamond; break;
case 6: pr = PlayerRank.King; break;
}
pd = pr;
// 获取段位数据
RankingData rankData = RankingData.Get(pr);
if (rankData != null && rankData.rankIcon != null)
{
this.rankId.sprite = rankData.rankIcon;
}
else
{
this.rankId.sprite = null; // 或者默认图
}
if (rankScore != 0)
@@ -90,6 +92,41 @@ namespace TcgEngine.UI
gameObject.SetActive(true);
}
public void RankMedalShow(int rank)
{
string rankStr = "";
switch (rank)
{
case 1:
rankStr = "Champion";
break;
case 2:
rankStr = "Runner_up";
break;
case 3:
rankStr = "Third_place";
break;
default:
ranking.text = rank.ToString();
break;
}
// 获取段位数据
RankMedalData rankData = RankMedalData.Get(rankStr);
if (rankData != null && rankData.sprite != null)
{
ranking.gameObject.SetActive(false);
rankingIcon.gameObject.SetActive(true);
rankingIcon.sprite = rankData.sprite;
}
else
{
ranking.gameObject.SetActive(true);
rankingIcon.gameObject.SetActive(false);
ranking.text = rank.ToString();
}
}
public void Hide()
{
gameObject.SetActive(false);

View File

@@ -12,19 +12,21 @@ namespace TcgEngine.UI
public class LeaderboardPanel : UIPanel
{
#region
[Header("-----默认排行榜参数------")]
public RectTransform content;
public RankLine line_template;
public RankLine my_line;
public float line_spacing = 80f;
[Header("----------------------")]
#endregion
#region
[Header("-----天梯排行榜参数------")]
public RectTransform ladderContent;
public LadderRankLine ladderLine_template;
public LadderRankLine my_ladderLine;
public float ladderLine_spacing = 120f;
[Header("----------------------")]
#endregion
public Text test_text;
@@ -35,18 +37,17 @@ namespace TcgEngine.UI
public List<RankLine> lines = new List<RankLine>();
public List<LadderRankLine> ladderLines = new List<LadderRankLine>();
[Header("返回主页")]
public Button returnToHome_button;
private const string DefaultAvatarId = "bear";
private static LeaderboardPanel instance;
#region
[SerializeField] private Button defaultRankButton;
[SerializeField] private Button ladderRankButton;
#endregion
[Header("管理指定组件")]
public GameObject[] hideGameObject;
private bool isHideObject = false;
protected override void Awake()
{
@@ -55,29 +56,34 @@ namespace TcgEngine.UI
//lines = scroll_content.GetComponentsInChildren<RankLine>();
my_line.onClick += OnClickLine;
my_ladderLine.onClick += OnClickRankLine;
InitLines();
#region
returnToHome_button.onClick.AddListener(OnReturnToHome);
}
defaultRankButton.onClick.AddListener(() =>
/// <summary>
/// 返回主页
/// </summary>
public void OnReturnToHome()
{
isHideObject = !isHideObject;
if (isHideObject)
{
isLadderRank = false;
RankPanelColl();
});
ladderRankButton.onClick.AddListener(() =>
Show();
}
else
{
isLadderRank = true;
RankPanelColl();
});
#endregion
Hide();
}
foreach (var obj in hideGameObject)
{
obj.SetActive(!isHideObject);
}
}
private void OnDestroy()
{
}
private void InitLines()
@@ -110,7 +116,7 @@ namespace TcgEngine.UI
ladderLines.Add(line);
}
ladderContent.sizeDelta = new Vector2(content.sizeDelta.x, ladderNlines * line_spacing + 20f);
ladderContent.sizeDelta = new Vector2(content.sizeDelta.x, ladderNlines * ladderLine_spacing + 20f);
#endregion
}
@@ -130,14 +136,14 @@ namespace TcgEngine.UI
private LadderRankLine LadderAddLine(LadderRankLine template, int index)
{
Vector2 pos = Vector2.down * ladderLine_spacing;
Vector2 pos = Vector2.down * (ladderLine_spacing-75);
GameObject line = Instantiate(template.gameObject, ladderContent);
RectTransform rtrans = line.GetComponent<RectTransform>();
LadderRankLine lrline = line.GetComponent<LadderRankLine>();
rtrans.anchorMin = new Vector2(0.5f, 1);
rtrans.anchorMax = new Vector2(0.5f, 1f);
rtrans.anchoredPosition = pos + Vector2.down * index * ladderLine_spacing;
lrline.onClick += OnClickLine;
rtrans.anchoredPosition = pos + Vector2.down * index * (ladderLine_spacing + 15);
lrline.onClick += OnClickRankLine;
return lrline;
}
@@ -192,7 +198,7 @@ namespace TcgEngine.UI
private async void RefreshLadderPanel()
{
my_line.Hide();
my_ladderLine.Hide();
foreach (LadderRankLine line in ladderLines)
line.Hide();
@@ -217,8 +223,6 @@ namespace TcgEngine.UI
int previous_rank = 0;
int previous_index = 0;
if (users == null || users.Length == 0)
{
Debug.LogError("玩家数据为空");
@@ -226,6 +230,7 @@ namespace TcgEngine.UI
}
Debug.Log($"收到排行榜数据,共 {users.Length} 条");
ladderContent.sizeDelta = new Vector2(content.sizeDelta.x, users.Length * (ladderLine_spacing + 20f));
foreach (LadderLeaderboardEntry rankData in sorted_users)
{
@@ -249,44 +254,49 @@ namespace TcgEngine.UI
}
}
private void RankPanelColl()
{
if (isLadderRank)
{
ladderRank.Show();
var lColor = ladderRankButton.image.color;
lColor.a = 0.5f;
ladderRankButton.image.color = lColor;
defaultRank.Hide();
var dColor = defaultRankButton.image.color;
dColor.a = 1f;
defaultRankButton.image.color = dColor;
}
else
{
ladderRank.Hide();
var lColor = ladderRankButton.image.color;
lColor.a = 1f;
ladderRankButton.image.color = lColor;
defaultRank.Show();
var dColor = defaultRankButton.image.color;
dColor.a = 0.5f;
defaultRankButton.image.color = dColor;
}
ladderRankButton.enabled = !isLadderRank;
defaultRankButton.enabled = isLadderRank;
}
//
// private void RankPanelColl()
// {
// if (isLadderRank)
// {
// ladderRank.Show();
// var lColor = ladderRankButton.image.color;
// lColor.a = 0.5f;
// ladderRankButton.image.color = lColor;
//
//
// defaultRank.Hide();
// var dColor = defaultRankButton.image.color;
// dColor.a = 1f;
// defaultRankButton.image.color = dColor;
// }
// else
// {
// ladderRank.Hide();
// var lColor = ladderRankButton.image.color;
// lColor.a = 1f;
// ladderRankButton.image.color = lColor;
//
// defaultRank.Show();
// var dColor = defaultRankButton.image.color;
// dColor.a = 0.5f;
// defaultRankButton.image.color = dColor;
//
// }
// ladderRankButton.enabled = !isLadderRank;
// defaultRankButton.enabled = isLadderRank;
// }
private void OnClickLine(string username)
{
}
private void OnClickRankLine(string username)
{
}
private Sprite GetAvatar(string id)
{
@@ -301,7 +311,6 @@ namespace TcgEngine.UI
base.Show(instant);
RefreshPanel();
RefreshLadderPanel();
RankPanelColl();
}
public void OnClickBack()

View File

@@ -0,0 +1,73 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TcgEngine.Gameplay;
using UnityEngine;
using UnityEngine.UI;
namespace TcgEngine.UI
{
public class TaskItem : MonoBehaviour
{
public string taskID;
public Text taskName_text;
public Text teskDesc_text;
public Slider progressBar_slider;
public Text progressBar_text;
public Button reward_button;
public Image reward_icon;
private PlayerTask playerTask;
private TaskData taskConfig;
public void SetTask(TaskData config, PlayerTask task)
{
taskID = config.id;
taskConfig = config;
playerTask = task;
taskName_text.text = taskConfig.name;
teskDesc_text.text = taskConfig.desc;
progressBar_slider.maxValue = config.value1;
progressBar_slider.value = task.progress;
progressBar_text.text = task.progress + "/" + taskConfig.value1;
progressBar_slider.interactable = false; // 禁用交互性
reward_button.interactable = task.status == TaskStatus.Completed;
reward_button.onClick.RemoveAllListeners();
reward_button.onClick.AddListener(OnClickReward);
RefreshStatus();
}
private void OnClickReward()
{
if (playerTask != null && playerTask.status == TaskStatus.Completed)
{
TaskManager.Instance.ClaimTaskReward(playerTask);
RefreshStatus();
}
}
private void RefreshStatus()
{
if (playerTask == null) return;
progressBar_slider.value = playerTask.progress;
progressBar_text.text = playerTask.progress + "/" + taskConfig.value1;
}
private void RewardColl(Sprite icon)
{
if (reward_icon != null)
{
reward_icon.sprite = icon;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c56a7ede4255693469095ed5b8242daf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,128 @@
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<string,TaskItem> taskItems = new Dictionary<string,TaskItem>();
public Dictionary<string, TaskData> allTaskData;
protected override void Awake()
{
base.Awake();
allTaskData = new Dictionary<string, TaskData>();
TaskData[] datas = Resources.LoadAll<TaskData>("Tasks"); // 假设你放在 Resources/Tasks 下
foreach (var d in datas)
{
allTaskData[d.id] = d;
}
}
protected override void Start()
{
base.Start();
Show();
}
/// <summary>
/// 初始化任务列表(只在第一次打开时用)
/// </summary>
public void ShowTasks(List<PlayerTask> 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<TaskItem>();
taskItems[pTask.taskId] = item;
TaskData data = LoadTaskDataById(pTask.taskId);
if (data != null)
{
item.SetTask(data, pTask);
}
}
}
public void RefreshTasks(List<PlayerTask> playerTasks)
{
HashSet<string> currentIds = new HashSet<string>();
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<TaskItem>();
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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2a012f5ea1cd9e24692779136db81e87
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cefc2058211d3a849a6166e2f356c3dc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: