Files

116 lines
3.7 KiB
C#
Raw Permalink Normal View History

2025-10-23 00:49:44 -04:00
using System.Collections.Generic;
using Continentis.MainGame.Character;
using Continentis.MainGame.Combat;
using DG.Tweening;
using Lean.Pool;
using UnityEngine;
2025-12-10 18:22:26 -05:00
using UnityEngine.Serialization;
2025-10-23 00:49:44 -04:00
namespace Continentis.MainGame.UI
{
public partial class ActionOrderDisplayer : MonoBehaviour
{
2026-03-20 11:56:50 -04:00
[Header("UI References")] [SerializeField]
private GameObject portraitPrefab;
2025-10-23 00:49:44 -04:00
[SerializeField] private RectTransform currentTurnPointer;
2026-03-20 11:56:50 -04:00
[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();
2025-10-23 00:49:44 -04:00
private List<CharacterBase> actionOrder => CombatMainManager.Instance.characterController.actionOrderList;
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
public void InitializeTurnOrder()
{
// 清理
2026-03-20 11:56:50 -04:00
foreach (var ui in avatars)
if (ui != null)
Destroy(ui.gameObject);
2025-10-23 00:49:44 -04:00
avatars.Clear();
// 生成UI
2026-03-20 11:56:50 -04:00
foreach (var character in actionOrder) CreatePortraitUI(character, -1); // -1 表示添加到末尾
2025-10-23 00:49:44 -04:00
// 排列到正确的位置
2026-03-20 11:56:50 -04:00
RearrangePortraitsWithAnimation();
2025-10-23 00:49:44 -04:00
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
public void EndAction()
{
// 将当前行动的角色和UI移动到队尾
2026-03-20 11:56:50 -04:00
var currentAvatar = avatars[0];
2025-10-23 00:49:44 -04:00
avatars.RemoveAt(0);
currentAvatar.GetComponent<RectTransform>().DOAnchorPosX(-200, 0.2f).OnComplete(() =>
{
LeanPool.Despawn(currentAvatar.gameObject);
}).Play();
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
// 播放重新排列动画
RearrangePortraitsWithAnimation();
}
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
public partial class ActionOrderDisplayer
{
// 核心函数创建单个头像UI
private CharacterAvatar CreatePortraitUI(CharacterBase character, int index)
{
2026-03-20 11:56:50 -04:00
var avatar = LeanPool.Spawn(portraitPrefab, avatarContainer).GetComponent<CharacterAvatar>();
2025-10-23 00:49:44 -04:00
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);
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
return avatar;
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
// 无动画的瞬间排列
private void RearrangePortraits()
{
2026-03-20 11:56:50 -04:00
for (var i = 0; i < avatars.Count; i++)
2025-10-23 00:49:44 -04:00
{
2026-03-20 11:56:50 -04:00
var targetX = -110 - i * (avatarWidth + avatarSpacing);
2025-10-23 00:49:44 -04:00
avatars[i].GetComponent<RectTransform>().anchoredPosition = new Vector2(targetX, 0);
}
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
// 核心函数:带动画的重新排列
public void RearrangePortraitsWithAnimation()
{
2026-03-20 11:56:50 -04:00
var sequence = DOTween.Sequence();
for (var i = 0; i < avatars.Count; i++)
2025-10-23 00:49:44 -04:00
{
// 计算每个头像的目标X坐标
2026-03-20 11:56:50 -04:00
var targetX = -110 - i * (avatarWidth + avatarSpacing);
var rt = avatars[i].GetComponent<RectTransform>();
2025-10-23 00:49:44 -04:00
// 将移动动画加入到序列中
sequence.Join(rt.DOAnchorPosX(targetX, rearrangeAnimDuration).SetEase(Ease.OutQuad));
}
2026-03-20 11:56:50 -04:00
2025-10-23 00:49:44 -04:00
sequence.Play();
}
}
}