Files
Continentis/Assets/Scripts/MainGame/UI/CombatMainPage/ActionOrderDisplayer.cs
2025-12-10 18:22:26 -05:00

118 lines
4.0 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 Continentis.MainGame.Character;
using Continentis.MainGame.Combat;
using DG.Tweening;
using Lean.Pool;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Continentis.MainGame.UI
{
public partial class ActionOrderDisplayer : MonoBehaviour
{
[Header("UI References")]
[SerializeField] private GameObject portraitPrefab;
[SerializeField] private RectTransform currentTurnPointer;
[FormerlySerializedAs("portraitsContainer")] public Transform avatarContainer;
[Header("Animation Settings")]
[SerializeField] private float rearrangeAnimDuration = 0.4f; // 头像重新排列的动画时长
[FormerlySerializedAs("portraitWidth")]
[Header("Layout Settings")]
[SerializeField] private float avatarWidth = 133f; // 单个头像的宽度
[FormerlySerializedAs("portraitSpacing")] [SerializeField] private float avatarSpacing = 0f; // 头像之间的间距
private List<CharacterBase> actionOrder => CombatMainManager.Instance.characterController.actionOrderList;
public List<CharacterAvatar> avatars = new List<CharacterAvatar>();
public void InitializeTurnOrder()
{
// 清理
foreach (CharacterAvatar ui in avatars)
{
if (ui != null) Destroy(ui.gameObject);
}
avatars.Clear();
// 生成UI
foreach (var character in actionOrder)
{
CreatePortraitUI(character, -1); // -1 表示添加到末尾
}
// 排列到正确的位置
RearrangePortraitsWithAnimation();
}
public void EndAction()
{
// 将当前行动的角色和UI移动到队尾
CharacterAvatar currentAvatar = avatars[0];
avatars.RemoveAt(0);
currentAvatar.GetComponent<RectTransform>().DOAnchorPosX(-200, 0.2f).OnComplete(() =>
{
LeanPool.Despawn(currentAvatar.gameObject);
}).Play();
// 播放重新排列动画
RearrangePortraitsWithAnimation();
}
}
public partial class ActionOrderDisplayer
{
// 核心函数创建单个头像UI
private CharacterAvatar CreatePortraitUI(CharacterBase character, int index)
{
CharacterAvatar avatar = LeanPool.Spawn(portraitPrefab, avatarContainer).GetComponent<CharacterAvatar>();
avatar.Initialize(character);
avatar.GetComponent<RectTransform>().anchoredPosition = new Vector2(-900, 0);
if (index >= 0 && index < avatars.Count)
{
avatars.Insert(index, avatar);
avatar.transform.SetSiblingIndex(index);
}
else
{
avatars.Add(avatar);
}
return avatar;
}
// 无动画的瞬间排列
private void RearrangePortraits()
{
for (int i = 0; i < avatars.Count; i++)
{
float targetX = -110 - i * (avatarWidth + avatarSpacing);
avatars[i].GetComponent<RectTransform>().anchoredPosition = new Vector2(targetX, 0);
}
}
// 核心函数:带动画的重新排列
public void RearrangePortraitsWithAnimation()
{
Sequence sequence = DOTween.Sequence();
for (int i = 0; i < avatars.Count; i++)
{
// 计算每个头像的目标X坐标
float targetX = -110 - i * (avatarWidth + avatarSpacing);
RectTransform rt = avatars[i].GetComponent<RectTransform>();
// 将移动动画加入到序列中
sequence.Join(rt.DOAnchorPosX(targetX, rearrangeAnimDuration).SetEase(Ease.OutQuad));
}
sequence.Play();
}
}
}