Files
tcg-client/Assets/TcgEngine/Scripts/UI/AvatarUI.cs
2025-09-12 17:25:55 +08:00

135 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using TcgEngine;
namespace TcgEngine.UI
{
/// <summary>
/// Displays an avatar
/// </summary>
public class AvatarUI : MonoBehaviour
{
public UnityAction<AvatarData> onClick;
private Image avatar_img;
private Button avatar_button;
private Sprite default_icon;
[Header("Dynamic Art Path")]
[SerializeField] private string avatar_path;
private AvatarData avatar;
void Awake()
{
avatar_img = GetComponent<Image>();
avatar_button = GetComponent<Button>();
default_icon = avatar_img.sprite;
if (avatar_button != null)
avatar_button.onClick.AddListener(OnClick);
if (!string.IsNullOrEmpty(avatar_path))
{
LoadAvatarSprite();
}
}
/// <summary>
/// 在 Inspector 中修改值时自动重新加载
/// </summary>
private void OnValidate()
{
if (Application.isPlaying && !string.IsNullOrEmpty(avatar_path))
{
LoadAvatarSprite();
}
}
public void SetAvatar(AvatarData avatar)
{
this.avatar = avatar;
avatar_img.enabled = true;
avatar_img.sprite = default_icon;
if (avatar != null)
{
avatar_img.sprite = avatar.GetAvatar();
}
}
/// <summary>
/// 设置头像图片,使用本地图片路径
/// </summary>
public void SetAvatarPath(string path)
{
if (avatar_path == path)
return;
avatar_path = path;
LoadAvatarSprite();
}
/// <summary>
/// 获取当前头像路径
/// </summary>
public string GetAvatarPath()
{
return avatar_path;
}
/// <summary>
/// 加载头像图片
/// </summary>
private void LoadAvatarSprite()
{
if (!string.IsNullOrEmpty(avatar_path))
{
Sprite dynamicSprite = SpriteLoader.Get()?.LoadSprite(avatar_path);
if (dynamicSprite != null)
{
avatar_img.sprite = dynamicSprite;
}
else
{
Debug.LogWarning($"AvatarUI 头像图片加载失败: {avatar_path}");
}
}
else
{
Debug.LogWarning($"AvatarUI avatar_path为空");
}
}
public void SetDefaultAvatar()
{
this.avatar = null;
avatar_img.enabled = true;
avatar_img.sprite = default_icon;
}
public void SetImage(Sprite sprite)
{
avatar_img.sprite = sprite;
}
public void Hide()
{
this.avatar = null;
avatar_img.enabled = false;
}
public AvatarData GetAvatar()
{
return avatar;
}
private void OnClick()
{
onClick?.Invoke(avatar);
}
}
}