修改天梯UI数据,及任务的UI数据的初步同步
This commit is contained in:
13
Assets/TcgEngine/Scripts/Data/RankData/PlayerRank.cs
Normal file
13
Assets/TcgEngine/Scripts/Data/RankData/PlayerRank.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
namespace TcgEngine
|
||||
{
|
||||
public enum PlayerRank
|
||||
{
|
||||
|
||||
Bronze = 1, // 青铜
|
||||
Silver, // 白银
|
||||
Gold, // 黄金
|
||||
Platinum, // 铂金
|
||||
Diamond, // 钻石
|
||||
King // 王者
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4d1858a3e374fad88a50b93ce108699
|
||||
timeCreated: 1756956870
|
||||
80
Assets/TcgEngine/Scripts/Data/RankData/RankMedalData.cs
Normal file
80
Assets/TcgEngine/Scripts/Data/RankData/RankMedalData.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1c608c7081254d72a729e959fb60231a
|
||||
timeCreated: 1756975648
|
||||
111
Assets/TcgEngine/Scripts/Data/RankData/RankingData.cs
Normal file
111
Assets/TcgEngine/Scripts/Data/RankData/RankingData.cs
Normal 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];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5802a2b802f84bc1978f57cf18eb6f1f
|
||||
timeCreated: 1756956121
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
73
Assets/TcgEngine/Scripts/Tasks/TaskItem.cs
Normal file
73
Assets/TcgEngine/Scripts/Tasks/TaskItem.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/TcgEngine/Scripts/Tasks/TaskItem.cs.meta
Normal file
11
Assets/TcgEngine/Scripts/Tasks/TaskItem.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c56a7ede4255693469095ed5b8242daf
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
128
Assets/TcgEngine/Scripts/Tasks/TaskPanel.cs
Normal file
128
Assets/TcgEngine/Scripts/Tasks/TaskPanel.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
11
Assets/TcgEngine/Scripts/Tasks/TaskPanel.cs.meta
Normal file
11
Assets/TcgEngine/Scripts/Tasks/TaskPanel.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a012f5ea1cd9e24692779136db81e87
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/TcgEngine/Scripts/UI/Task.meta
Normal file
8
Assets/TcgEngine/Scripts/UI/Task.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cefc2058211d3a849a6166e2f356c3dc
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user