Files
Continentis/Assets/Scripts/MainGame/UI/CombatMainPage/ActionOrderDisplayer.cs
SoulliesOfficial d09b58fd80 架构大更
2026-03-20 11:56:50 -04:00

116 lines
3.7 KiB
C#
Raw Permalink 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.Generic;
using Continentis.MainGame.Character;
using Continentis.MainGame.Combat;
using DG.Tweening;
using Lean.Pool;
using UnityEngine;
using UnityEngine.Serialization;
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; // 头像之间的间距
public List<CharacterAvatar> avatars = new();
private List<CharacterBase> actionOrder => CombatMainManager.Instance.characterController.actionOrderList;
public void InitializeTurnOrder()
{
// 清理
foreach (var 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移动到队尾
var 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)
{
var 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 (var i = 0; i < avatars.Count; i++)
{
var targetX = -110 - i * (avatarWidth + avatarSpacing);
avatars[i].GetComponent<RectTransform>().anchoredPosition = new Vector2(targetX, 0);
}
}
// 核心函数:带动画的重新排列
public void RearrangePortraitsWithAnimation()
{
var sequence = DOTween.Sequence();
for (var i = 0; i < avatars.Count; i++)
{
// 计算每个头像的目标X坐标
var targetX = -110 - i * (avatarWidth + avatarSpacing);
var rt = avatars[i].GetComponent<RectTransform>();
// 将移动动画加入到序列中
sequence.Join(rt.DOAnchorPosX(targetX, rearrangeAnimDuration).SetEase(Ease.OutQuad));
}
sequence.Play();
}
}
}