using System.Threading.Tasks;
using Activity;
using asap.core;
using Event1v1Battle.Data;
using game;
using TMPro;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Event1v1Battle.Panel.MainPanel
{
///
/// 1v1扇耳光大赛匹配面板 Event1v1BattleSlapLoadingPanel
///
public class Event1v1BattleSlapMatchPanel : BasePanel
{
#region UI Elements
private DuelMatchPlayer _myself;
private DuelMatchPlayer _enemy;
#endregion
#region 匹配动画配置
/// 总动画时长(秒)
[SerializeField] private float _matchAnimationDuration = 2.0f;
/// NPC切换次数
[SerializeField] private int _matchSwitchCount = 20;
/// 起始间隔时间(秒)- 快速
[SerializeField] private float _matchStartInterval = 0.05f;
/// 结束间隔时间(秒)- 慢速
[SerializeField] private float _matchEndInterval = 0.3f;
/// 结 // 展示时间(秒)
[SerializeField] private float showTime = 1f; // 展示时间(秒)
[SerializeField] private GameObject _matchFx;
#endregion
private Event1v1BattleSlapData _data;
public void SetData(Event1v1BattleSlapData data)
{
_data = data;
}
private void Awake()
{
_myself = gameObject.FindChildGameObject("myself").GetComponentInChildren();
_enemy = gameObject.FindChildGameObject("enermy").GetComponentInChildren();
_matchFx = gameObject.FindChildGameObject("fx_event1v1battle_slap_match_success");
_matchFx.SetActive(false);
}
protected override void Start()
{
base.Start();
ShowUI();
}
private void ShowUI()
{
IUserService userService = GContext.container.Resolve();
var uiService = GContext.container.Resolve();
uiService.SetHeadImage(_myself.icon_head, userService.AvatarUrl);
_myself.text_name.text = userService.DisplayName;
}
///
/// 播放匹配随机动画 - 快速切换NPC,由快变慢,最终停在目标NPC
///
public async Task PlayMatchAnimationAsync()
{
// 获取所有NPC配置列表
var npcList =_data.Tables.TbRobot.DataList;
int totalNpcCount = npcList.Count;
if (totalNpcCount == 0 || _data == null)
{
Debug.LogError("[MatchAnimation] NPC列表为空或Data为null");
return;
}
// 目标NPC数据(最终要显示的)
string targetIcon = _data.NpcIcon;
string targetName = _data.NpcName;
// 执行随机切换
for (int i = 0; i < _matchSwitchCount; i++)
{
// 计算当前间隔(使用线性插值实现由快变慢)
float t = (float)i / _matchSwitchCount;
float currentInterval = Mathf.Lerp(_matchStartInterval, _matchEndInterval, t);
// 随机选择一个NPC显示
int randomIndex = Random.Range(0, totalNpcCount);
var randomNpc = npcList[randomIndex];
if (randomNpc != null)
{
// 更新UI显示随机NPC
var uiService = GContext.container.Resolve();
_=uiService.SetHeadImage(_enemy.icon_head, randomNpc.Avatar);
_enemy.text_name.text = randomNpc.Name;
}
// 异步等待当前间隔时间
await Awaiters.Seconds(currentInterval);
}
// 动画结束,显示目标NPC
_matchFx.SetActive(true);
var finalUiService = GContext.container.Resolve();
_=finalUiService.SetHeadImage(_enemy.icon_head, targetIcon);
_enemy.text_name.text = targetName;
await Awaiters.Seconds(showTime);
}
#if UNITY_EDITOR
///
/// 编辑器调试方法 - 在Inspector中右键组件调用此方法测试动画
///
[ContextMenu("调试匹配动画")]
private void DebugPlayMatchAnimation()
{
var _manager = ActivityResolver.Resolve();
// 确保有管理器数据
if (_manager == null || _manager.LoadData() == null)
{
Debug.LogError("[MatchAnimation] 请先设置 _manager 和 Data");
return;
}
// 在编辑器中启动动画Task
_ = PlayMatchAnimationAsync();
}
///
/// 编辑器调试方法 - 随机设置一个新的目标NPC并播放动画
///
[ContextMenu("随机NPC并播放动画")]
private void DebugRandomNpcAndPlay()
{
var _manager = ActivityResolver.Resolve();
if (_manager == null)
{
Debug.LogError("[MatchAnimation] 请先设置 _manager");
return;
}
// 随机选择一个NPC作为目标
var npcList = _manager.Tables.TbRobot.DataList;
if (npcList.Count == 0)
{
Debug.LogError("[MatchAnimation] NPC列表为空");
return;
}
int randomIndex = Random.Range(0, npcList.Count);
var randomNpc = npcList[randomIndex];
// 更新Data中的目标NPC
_manager.LoadData().NpcIcon = randomNpc.Avatar;
_manager.LoadData().NpcName = randomNpc.Name;
Debug.Log($"[MatchAnimation] 设置目标NPC: {randomNpc.Name}");
// 播放动画
_ = PlayMatchAnimationAsync();
}
#endif
}
}