Files
tcg-client/Assets/TcgEngine/Scripts/UI/PlayerUI.cs
2025-08-29 11:33:52 +08:00

187 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TcgEngine.Client;
using TcgEngine;
namespace TcgEngine.UI
{
/// <summary>
/// Main player UI inside the GameUI, inside the game scene
/// there is one for each player
/// </summary>
public class PlayerUI : MonoBehaviour
{
public bool is_opponent;
public Text pname;
public AvatarUI avatar;
public IconBar mana_bar; // 保留原有mana条作为通用mana显示
public Text hp_txt;
public Text hp_max_txt;
public Animator[] secrets;
public GameObject dead_fx;
public AudioClip dead_audio;
public Sprite avatar_dead;
private bool killed = false;
private float timer = 0f;
private int prev_hp = 0;
private float delayed_damage_timer = 0f;
private static List<PlayerUI> ui_list = new List<PlayerUI>();
private void Awake()
{
ui_list.Add(this);
}
private void OnDestroy()
{
ui_list.Remove(this);
}
void Start()
{
pname.text = "";
hp_txt.text = "";
hp_max_txt.text = "";
for (int i = 0; i < secrets.Length; i++)
secrets[i].gameObject.SetActive(false);
avatar.onClick += OnClickAvatar;
GameClient.Get().onSecretTrigger += OnSecretTrigger;
}
void Update()
{
if (!GameClient.Get().IsReady())
return;
Player player = GetPlayer();
if (player != null)
{
pname.text = player.username;
// 更新通用mana条
mana_bar.value = player.mana;
mana_bar.max_value = player.mana_max;
hp_txt.text = prev_hp.ToString();
hp_max_txt.text = "/" + player.hp_max.ToString();
// 默认头像
string avatarId = !string.IsNullOrEmpty(player.avatar) ? player.avatar : "horse";
string avatarPath = "Avatar/" + avatarId + ".png";
// 设置头像路径
SetAvatarByPath(avatarPath);
}
timer += Time.deltaTime;
if (timer > 0.4f)
{
timer = 0f;
SlowUpdate();
}
}
/// <summary>
/// 通过路径设置头像
/// </summary>
private void SetAvatarByPath(string avatarPath)
{
if (avatar != null && !killed)
{
avatar.SetAvatarPath(avatarPath);
}
}
void SlowUpdate()
{
Player player = GetPlayer();
if (player == null)
return;
for (int i = 0; i < secrets.Length; i++)
{
bool active = i < player.cards_secret.Count;
bool was_active = secrets[i].gameObject.activeSelf;
if (active != was_active)
secrets[i].gameObject.SetActive(active);
if (active && !was_active)
secrets[i].SetTrigger("appear");
if (active && !was_active && !is_opponent)
secrets[i].GetComponent<SecretIconUI>().SetCard(player.cards_secret[i]);
if (!active && was_active)
secrets[i].Rebind();
}
}
public void Kill()
{
killed = true;
avatar.SetImage(avatar_dead);
AudioTool.Get().PlaySFX("fx", dead_audio);
FXTool.DoFX(dead_fx, avatar.transform.position);
}
public void DelayDamage(int damage, float duration = 1f)
{
if (damage != 0)
{
delayed_damage_timer = duration;
}
}
public bool IsDamagedDelayed()
{
return delayed_damage_timer > 0f;
}
private void OnClickAvatar(AvatarData avatar)
{
Game gdata = GameClient.Get().GetGameData();
int player_id = GameClient.Get().GetPlayerID();
if (gdata.selector == SelectorType.SelectTarget && player_id == gdata.selector_player_id)
{
GameClient.Get().SelectPlayer(GetPlayer());
}
}
private void OnSecretTrigger(Card secret, Card triggerer)
{
Player player = GetPlayer();
int index = player.cards_secret.Count - 1;
if (player.player_id == secret.player_id && index >= 0 && index < secrets.Length)
{
secrets[index].SetTrigger("reveal");
}
}
public Player GetPlayer()
{
int player_id = is_opponent ? GameClient.Get().GetOpponentPlayerID() : GameClient.Get().GetPlayerID();
Game data = GameClient.Get().GetGameData();
return data.GetPlayer(player_id);
}
public static PlayerUI Get(bool opponent)
{
foreach (PlayerUI ui in ui_list)
{
if (ui.is_opponent == opponent)
return ui;
}
return null;
}
}
}