115 lines
3.9 KiB
C#
115 lines
3.9 KiB
C#
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.UI;
|
||
|
||
namespace Continentis.MainGame.UI
|
||
{
|
||
public partial class ActionOrderDisplayer : MonoBehaviour
|
||
{
|
||
[Header("UI References")]
|
||
[SerializeField] private GameObject portraitPrefab;
|
||
[SerializeField] private Transform portraitsContainer;
|
||
[SerializeField] private RectTransform currentTurnPointer;
|
||
|
||
[Header("Animation Settings")]
|
||
[SerializeField] private float rearrangeAnimDuration = 0.4f; // 头像重新排列的动画时长
|
||
|
||
[Header("Layout Settings")]
|
||
[SerializeField] private float portraitWidth = 133f; // 单个头像的宽度
|
||
[SerializeField] private float portraitSpacing = 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, portraitsContainer).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 * (portraitWidth + portraitSpacing);
|
||
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 * (portraitWidth + portraitSpacing);
|
||
RectTransform rt = avatars[i].GetComponent<RectTransform>();
|
||
|
||
// 将移动动画加入到序列中
|
||
sequence.Join(rt.DOAnchorPosX(targetX, rearrangeAnimDuration).SetEase(Ease.OutQuad));
|
||
}
|
||
|
||
sequence.Play();
|
||
}
|
||
}
|
||
} |