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 actionOrder => CombatMainManager.Instance.characterController.actionOrderList; public List avatars = new List(); 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().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(); avatar.Initialize(character); avatar.GetComponent().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().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(); // 将移动动画加入到序列中 sequence.Join(rt.DOAnchorPosX(targetX, rearrangeAnimDuration).SetEase(Ease.OutQuad)); } sequence.Play(); } } }