hch
2025-07-31 38ed075c317a29496dc10db2ea01d6b674a390d2
0312 武将布阵逻辑
6个文件已修改
634 ■■■■■ 已修改文件
Main/Component/UI/Common/BoundedDrag.cs 501 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/DragContainer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/DragItem.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/PlayerPropertyConfig.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroPosWin.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroScenePosCell.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/BoundedDrag.cs
@@ -10,241 +10,270 @@
using System;
    public class BoundedDrag : MonoBehaviour, IEndDragHandler, IBeginDragHandler, IDragHandler
    {
        [SerializeField]
        RectTransform m_Target;
        public RectTransform target {
            get { return m_Target; }
            set {
                m_Target = value;
            }
        }
        public RectTransform rectTransform { get { return this.transform as RectTransform; } }
        [SerializeField]
        ScaleRange m_ScaleRange;
        public ScaleRange scaleRange {
            get { return m_ScaleRange; }
            set { m_ScaleRange = value; }
        }
        [SerializeField]
        float m_DefaultScale;
        public float defaultScale { get { return m_DefaultScale; } }
        [SerializeField]
        float m_DestScale = 1f;
        public float destScale {
            get { return m_DestScale; }
            set { m_DestScale = Mathf.Clamp(value, scaleRange.min, scaleRange.max); }
        }
        float refScale = 0f;
        public float currentScale {
            get {
                return target.localScale.x;
            }
            set {
                target.localScale = Vector3.one * Mathf.Clamp(value, scaleRange.min, scaleRange.max);
            }
        }
        [SerializeField]
        MoveArea m_MoveArea;
        public MoveArea moveArea {
            get { return m_MoveArea; }
            set { m_MoveArea = value; }
        }
        [SerializeField]
        Vector2 m_DestPosition = Vector2.zero;
        public Vector2 destPosition {
            get { return m_DestPosition; }
            set { m_DestPosition = new Vector2(Mathf.Clamp(value.x, moveArea.Left * destScale, moveArea.Right * destScale), Mathf.Clamp(value.y, moveArea.Bottom * destScale, moveArea.Top * destScale)); }
        }
        Vector3 refPosition = Vector3.zero;
        public Vector2 currentPosition {
            get { return target.anchoredPosition; }
            set { target.anchoredPosition = value; }
        }
        Vector2 startTouchPosition01;
        Vector2 startGroundPosition;
        Vector2 lastTouchPosition01;
        Vector2 curTouchPosition01;
        Vector2 lastTouchPosition02;
        Vector2 curTouchPosition02;
        [SerializeField]
        Action m_OnBeginDrag;
        public Action onBeginDrag {
            get { return m_OnBeginDrag; }
        }
        bool m_Actionable = true;
        public bool actionable {
            get { return m_Actionable; }
            set { m_Actionable = value; }
        }
        private void OnEnable()
        {
            destPosition = currentPosition = Vector3.zero;
        }
        public void OnBeginDrag(PointerEventData eventData)
        {
#if UNITY_EDITOR || UNITY_STANDALONE
            if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left)
            {
                TwoFingerHandleBegin();
            }
            else if (eventData.button == PointerEventData.InputButton.Left)
            {
                OneFingerHandleBegin(eventData);
            }
#else
        if (Input.touchCount == 2) {
            TwoFingerHandleBegin();
        }
        if (Input.touchCount == 1) {
            OneFingerHandleBegin(eventData);
        }
#endif
            onBeginDrag?.Invoke();
        }
        public void OnDrag(PointerEventData eventData)
        {
#if UNITY_EDITOR || UNITY_STANDALONE
            if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left)
            {
                TwoFingerHandle();
            }
            else if (eventData.button == PointerEventData.InputButton.Left)
            {
                OneFingerHandle(eventData);
            }
#else
        if (Input.touchCount == 2) {
            TwoFingerHandle();
        }
        if (Input.touchCount == 1) {
            OneFingerHandle(eventData);
        }
#endif
        }
        public void OnEndDrag(PointerEventData eventData)
        {
        }
        void LateUpdate()
        {
            if (!actionable)
            {
                return;
            }
            if (Mathf.Abs(currentScale - destScale) > 0.01f)
            {
                float newScale = Mathf.SmoothDamp(currentScale, destScale, ref refScale, 0.15f);
                currentScale = newScale;
            }
            if (Vector2.Distance(currentPosition, destPosition) > 0.1f)
            {
                Vector2 newPosition = Vector3.SmoothDamp(currentPosition, destPosition, ref refPosition, 0.15f);
                currentPosition = newPosition;
            }
        }
        private void OneFingerHandleBegin(PointerEventData eventData)
        {
            startTouchPosition01 = Vector2.zero;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out startTouchPosition01);
            startGroundPosition = currentPosition;
        }
        private void OneFingerHandle(PointerEventData eventData)
        {
            Vector2 localMouse;
            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out localMouse))
            {
                var pointerDelta = localMouse - startTouchPosition01;
                destPosition = startGroundPosition + pointerDelta;
            }
        }
        private void TwoFingerHandle()
        {
            // 方便PC调试逻辑
#if UNITY_EDITOR || UNITY_STANDALONE
            curTouchPosition01 = new Vector2(Screen.width / 2, Screen.height / 2);
            curTouchPosition02 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
#else
        Touch touchFirst = Input.touches[0];
        Touch touchSecond = Input.touches[1];
        curTouchPosition01 = touchFirst.position;
        curTouchPosition02 = touchSecond.position;
#endif
            float lastLength = Vector2.Distance(lastTouchPosition01, lastTouchPosition02);
            float curLength = Vector2.Distance(curTouchPosition01, curTouchPosition02);
            destScale *= curLength / Mathf.Clamp(lastLength, 1, float.MaxValue);
            lastTouchPosition01 = curTouchPosition01;
            lastTouchPosition02 = curTouchPosition02;
        }
        private void TwoFingerHandleBegin()
        {
            // 方便PC调试逻辑
#if UNITY_EDITOR || UNITY_STANDALONE
            curTouchPosition01 = new Vector2(Screen.width / 2, Screen.height / 2);
            curTouchPosition02 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
#else
        Touch touchFirst = Input.touches[0];
        Touch touchSecond = Input.touches[1];
        curTouchPosition01 = touchFirst.position;
        curTouchPosition02 = touchSecond.position;
#endif
            lastTouchPosition01 = curTouchPosition01;
            lastTouchPosition02 = curTouchPosition02;
        }
        [Serializable]
        public struct ScaleRange
        {
            public float min;
            public float max;
        }
        [Serializable]
        public struct MoveArea
        {
            public float Left;
            public float Right;
            public float Top;
            public float Bottom;
            public MoveArea(float _left, float _right, float _top, float _bottom)
            {
                this.Left = _left;
                this.Right = _right;
                this.Top = _top;
                this.Bottom = _bottom;
            }
/// <summary>
/// 实现拖拽和缩放功能的组件,支持单指拖拽和双指缩放。
/// </summary>
public class BoundedDrag : MonoBehaviour, IEndDragHandler, IBeginDragHandler, IDragHandler
{
    [SerializeField]
    RectTransform m_Target; // 拖拽的目标对象
    public RectTransform target {
        get { return m_Target; }
        set {
            m_Target = value;
        }
    }
    public RectTransform rectTransform { get { return this.transform as RectTransform; } }
    [SerializeField]
    ScaleRange m_ScaleRange; // 缩放范围
    public ScaleRange scaleRange {
        get { return m_ScaleRange; }
        set { m_ScaleRange = value; }
    }
    [SerializeField]
    float m_DefaultScale; // 默认缩放值
    public float defaultScale { get { return m_DefaultScale; } }
    [SerializeField]
    float m_DestScale = 1f; // 目标缩放值
    public float destScale {
        get { return m_DestScale; }
        set { m_DestScale = Mathf.Clamp(value, scaleRange.min, scaleRange.max); }
    }
    float refScale = 0f; // 用于平滑缩放的参考值
    public float currentScale {
        get {
            return target.localScale.x;
        }
        set {
            target.localScale = Vector3.one * Mathf.Clamp(value, scaleRange.min, scaleRange.max);
        }
    }
    [SerializeField]
    MoveArea m_MoveArea; // 拖拽的边界区域
    public MoveArea moveArea {
        get { return m_MoveArea; }
        set { m_MoveArea = value; }
    }
    [SerializeField]
    Vector2 m_DestPosition = Vector2.zero; // 目标位置
    public Vector2 destPosition {
        get { return m_DestPosition; }
        set { m_DestPosition = new Vector2(Mathf.Clamp(value.x, moveArea.Left * destScale, moveArea.Right * destScale), Mathf.Clamp(value.y, moveArea.Bottom * destScale, moveArea.Top * destScale)); }
    }
    Vector3 refPosition = Vector3.zero; // 用于平滑移动的参考值
    public Vector2 currentPosition {
        get { return target.anchoredPosition; }
        set { target.anchoredPosition = value; }
    }
    Vector2 startTouchPosition01; // 单指拖拽的起始触摸位置
    Vector2 startGroundPosition; // 单指拖拽的起始地面位置
    Vector2 lastTouchPosition01; // 双指缩放的上一帧触摸位置1
    Vector2 curTouchPosition01; // 双指缩放的当前帧触摸位置1
    Vector2 lastTouchPosition02; // 双指缩放的上一帧触摸位置2
    Vector2 curTouchPosition02; // 双指缩放的当前帧触摸位置2
    [SerializeField]
    Action m_OnBeginDrag; // 拖拽开始事件
    public Action onBeginDrag {
        get { return m_OnBeginDrag; }
    }
    bool m_Actionable = true; // 是否可操作
    public bool actionable {
        get { return m_Actionable; }
        set { m_Actionable = value; }
    }
    private void OnEnable()
    {
        destPosition = currentPosition = Vector3.zero; // 初始化位置
    }
    /// <summary>
    /// 拖拽开始事件处理
    /// </summary>
    public void OnBeginDrag(PointerEventData eventData)
    {
#if UNITY_EDITOR || UNITY_STANDALONE
        if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left)
        {
            TwoFingerHandleBegin(); // 双指缩放开始
        }
        else if (eventData.button == PointerEventData.InputButton.Left)
        {
            OneFingerHandleBegin(eventData); // 单指拖拽开始
        }
#else
    if (Input.touchCount == 2) {
        TwoFingerHandleBegin();
    }
    if (Input.touchCount == 1) {
        OneFingerHandleBegin(eventData);
    }
#endif
        onBeginDrag?.Invoke(); // 触发拖拽开始事件
    }
    /// <summary>
    /// 拖拽过程中的事件处理
    /// </summary>
    public void OnDrag(PointerEventData eventData)
    {
#if UNITY_EDITOR || UNITY_STANDALONE
        if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left)
        {
            TwoFingerHandle(); // 双指缩放
        }
        else if (eventData.button == PointerEventData.InputButton.Left)
        {
            OneFingerHandle(eventData); // 单指拖拽
        }
#else
    if (Input.touchCount == 2) {
        TwoFingerHandle();
    }
    if (Input.touchCount == 1) {
        OneFingerHandle(eventData);
    }
#endif
    }
    /// <summary>
    /// 拖拽结束事件处理
    /// </summary>
    public void OnEndDrag(PointerEventData eventData)
    {
    }
    /// <summary>
    /// 每帧更新,平滑处理缩放和位置
    /// </summary>
    void LateUpdate()
    {
        if (!actionable)
        {
            return;
        }
        if (Mathf.Abs(currentScale - destScale) > 0.01f)
        {
            float newScale = Mathf.SmoothDamp(currentScale, destScale, ref refScale, 0.15f);
            currentScale = newScale;
        }
        if (Vector2.Distance(currentPosition, destPosition) > 0.1f)
        {
            Vector2 newPosition = Vector3.SmoothDamp(currentPosition, destPosition, ref refPosition, 0.15f);
            currentPosition = newPosition;
        }
    }
    /// <summary>
    /// 单指拖拽开始
    /// </summary>
    private void OneFingerHandleBegin(PointerEventData eventData)
    {
        startTouchPosition01 = Vector2.zero;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out startTouchPosition01);
        startGroundPosition = currentPosition;
    }
    /// <summary>
    /// 单指拖拽处理
    /// </summary>
    private void OneFingerHandle(PointerEventData eventData)
    {
        Vector2 localMouse;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out localMouse))
        {
            var pointerDelta = localMouse - startTouchPosition01;
            destPosition = startGroundPosition + pointerDelta;
        }
    }
    /// <summary>
    /// 双指缩放处理
    /// </summary>
    private void TwoFingerHandle()
    {
        // 方便PC调试逻辑
#if UNITY_EDITOR || UNITY_STANDALONE
        curTouchPosition01 = new Vector2(Screen.width / 2, Screen.height / 2);
        curTouchPosition02 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
#else
    Touch touchFirst = Input.touches[0];
    Touch touchSecond = Input.touches[1];
    curTouchPosition01 = touchFirst.position;
    curTouchPosition02 = touchSecond.position;
#endif
        float lastLength = Vector2.Distance(lastTouchPosition01, lastTouchPosition02);
        float curLength = Vector2.Distance(curTouchPosition01, curTouchPosition02);
        destScale *= curLength / Mathf.Clamp(lastLength, 1, float.MaxValue);
        lastTouchPosition01 = curTouchPosition01;
        lastTouchPosition02 = curTouchPosition02;
    }
    /// <summary>
    /// 双指缩放开始
    /// </summary>
    private void TwoFingerHandleBegin()
    {
        // 方便PC调试逻辑
#if UNITY_EDITOR || UNITY_STANDALONE
        curTouchPosition01 = new Vector2(Screen.width / 2, Screen.height / 2);
        curTouchPosition02 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
#else
    Touch touchFirst = Input.touches[0];
    Touch touchSecond = Input.touches[1];
    curTouchPosition01 = touchFirst.position;
    curTouchPosition02 = touchSecond.position;
#endif
        lastTouchPosition01 = curTouchPosition01;
        lastTouchPosition02 = curTouchPosition02;
    }
    /// <summary>
    /// 缩放范围结构体
    /// </summary>
    [Serializable]
    public struct ScaleRange
    {
        public float min; // 最小缩放值
        public float max; // 最大缩放值
    }
    /// <summary>
    /// 拖拽区域结构体
    /// </summary>
    [Serializable]
    public struct MoveArea
    {
        public float Left; // 左边界
        public float Right; // 右边界
        public float Top; // 上边界
        public float Bottom; // 下边界
        public MoveArea(float _left, float _right, float _top, float _bottom)
        {
            this.Left = _left;
            this.Right = _right;
            this.Top = _top;
            this.Bottom = _bottom;
        }
    }
}
Main/Component/UI/Common/DragContainer.cs
@@ -3,13 +3,13 @@
//    [  Date ]:           Monday, July 31, 2017
//--------------------------------------------------------
using UnityEngine;
using System.Collections;
//DragContainer挂载在有射线检测的物体上,指向主物件
public class DragContainer : MonoBehaviour
{
    public int pos;
    public Transform mainTransform; // 主节点 Transform
}
Main/Component/UI/Common/DragItem.cs
@@ -13,6 +13,8 @@
/// </summary>
public class DragItem:MonoBehaviour,ICanvasRaycastFilter,IBeginDragHandler,IDragHandler,IEndDragHandler 
{
    [SerializeField] public Canvas parentCanvas;
    [SerializeField] public Canvas canvas;
    // 拖拽区域限制
    [SerializeField]
    RectTransform m_Area;
@@ -26,12 +28,13 @@
        private set { m_RaycastTarget = value; }
    }
    [SerializeField] public int pos;
    [NonSerialized] public int pos;
    private Vector3 orgScale;
    private DragContainer lastTransform;
    // 当前对象的RectTransform组件
    public RectTransform rectTransform { get { return this.transform as RectTransform; } }
    RectTransform rectTransform { get { return this.transform as RectTransform; } }
    /// <summary>
    /// 开始拖拽时调用
@@ -40,8 +43,10 @@
    {
        raycastTarget = false;
        this.transform.position = UIUtility.ClampWorldPosition(area, eventData);
        orgScale = rectTransform.localScale;
        rectTransform.localScale = orgScale * 1.2f;
        rectTransform.localScale = Vector3.one * 1.2f;
        canvas.sortingLayerID =  parentCanvas.sortingLayerID;
        canvas.sortingOrder = parentCanvas.sortingOrder + pos + 10;
    }
    /// <summary>
@@ -51,21 +56,23 @@
        this.transform.position = UIUtility.ClampWorldPosition(area,eventData);
        
        // 检测是否进入目标区域
        if (eventData.pointerEnter != null) {
            var target = eventData.pointerEnter.transform;
            if (target != null) {
                // 进入目标区域,放大 1.2 倍
                target.localScale = Vector3.one * 1.2f;
        if (eventData.pointerEnter != null)
        {
            if (lastTransform != null && lastTransform != eventData.pointerEnter.GetComponent<DragContainer>())
            {
                lastTransform.mainTransform.localScale = Vector3.one;
                lastTransform = null;
            }
        } else {
            // 离开目标区域,恢复大小
            if (eventData.pointerPress != null) {
                var target = eventData.pointerPress.transform;
                if (target != null) {
                    target.localScale = Vector3.one;
                }
            var target = eventData.pointerEnter.GetComponent<DragContainer>();
            // 输出组件路径
            if (target != null)
            {
                lastTransform = target;
                // 进入目标区域,放大 1.2 倍
                lastTransform.mainTransform.localScale = Vector3.one * 1.2f;
            }
        }
        rectTransform.localScale = Vector3.one * 1.2f;
    }
    /// <summary>
@@ -73,10 +80,17 @@
    /// </summary>
    public Action<int, int> onEndDragEvent;
    public void OnEndDrag(PointerEventData eventData) {
    public void OnEndDrag(PointerEventData eventData)
    {
        raycastTarget = true;
        rectTransform.localScale = orgScale;
        rectTransform.localScale = Vector3.one;
        
        if (lastTransform != null)
        {
            lastTransform.mainTransform.localScale = Vector3.one;
            lastTransform = null;
        }
        if (eventData.pointerEnter == null)
        {
            onEndDragEvent?.Invoke(pos, -1);
@@ -84,16 +98,14 @@
        }
        var container = eventData.pointerEnter.GetComponent<DragContainer>();
        if(container == null) {
        if (container == null)
        {
            onEndDragEvent?.Invoke(pos, -1);
            return;
        }
        // var contain = UIUtility.RectTransformContain(eventData.pointerEnter.transform as RectTransform,rectTransform);
        // if(contain) {
        //     rectTransform.position = eventData.pointerEnter.transform.position;
        // }
        onEndDragEvent?.Invoke(pos, container.pos);
        canvas.sortingLayerID =  parentCanvas.sortingLayerID;
        canvas.sortingOrder = parentCanvas.sortingOrder + pos + 1;
    }
    /// <summary>
Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -84,20 +84,20 @@
            return string.Empty;
        }
        if (config.Name.Contains("%s"))
        if (config.ShowName.Contains("%s"))
        {
            if (id == 52)
            {
                return Regex.Replace(config.Name, "%s", (value * 0.0001f).ToString("f2"));
                return Regex.Replace(config.ShowName, "%s", (value * 0.0001f).ToString("f2"));
            }
            else
            {
                return Regex.Replace(config.Name, "%s", value.ToString());
                return Regex.Replace(config.ShowName, "%s", value.ToString());
            }
        }
        else
        {
            return string.Format("{0} +{1}", config.Name, GetValueDescription(id, value));
            return string.Format("{0} +{1}", config.ShowName, GetValueDescription(id, value));
        }
    }
Main/System/HeroUI/HeroPosWin.cs
@@ -93,6 +93,7 @@
        RefreshOnTeamCountry();
        RefreshOnTeamBtn();
        RefreshTeamHero();
        RefreshFlyHead();
        if (HeroUIManager.Instance.heroOnTeamSortList.Count == 0)
        {
@@ -109,9 +110,17 @@
        fiterManager.Display(0, 0, 0, SelectJobCountry);
        fightPowerText.text = "1234k";
    }
    void RefreshFlyHead()
    {
        var flyCanvas = flyAlphaTween.GetComponent<Canvas>();
        flyCanvas.sortingLayerID = canvas.sortingLayerID;
        flyCanvas.sortingOrder = canvas.sortingOrder + 9;
        flyAlphaTween.alpha = 0;
        flyHead.transform.localScale = Vector3.zero;
        fightPowerText.text = "1234k";
    }
    void SelectJobCountry(int job, int country)
@@ -197,6 +206,7 @@
            }
        }
    }
    //管理布阵入口按钮:如竞技场是否根据功能显隐,通天塔和主线只有进攻方布阵默认不显示
@@ -240,12 +250,19 @@
                sceneHero[i].Display(teamHero.guid, i);
                //按scenePosImgs 顺序排序对应位置
                sceneHero[i].transform.position = scenePosImgs[i].transform.position;
                sceneHero[i].transform.localScale = Vector3.one;
            }
        }
        RefreshPosScale();
    }
    void RefreshPosScale()
    {
        for (int i = 0; i < scenePosImgs.Count; i++)
        {
            scenePosImgs[i].transform.localScale = Vector3.one;
        }
    }
    /// <summary>
@@ -269,9 +286,12 @@
                sceneHero[i].Display(teamHero.guid, i, flyFrom >= 0);
                //按scenePosImgs 顺序排序对应位置
                sceneHero[i].transform.position = scenePosImgs[i].transform.position;
                sceneHero[i].transform.localScale = Vector3.one;
            }
        }
        RefreshPosScale();
        heroListScroller.m_Scorller.RefreshActiveCellViews();
        //表现飞入,连续点击不同头像触发的话则重置
        if (flyFrom > -1)
@@ -296,6 +316,7 @@
            sequence.Append(flyHead.transform.DOMove(targetPos, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
                .Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
                .Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad));
            sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; };
        }
    }
@@ -308,13 +329,9 @@
        {
            team.AddHero(HeroManager.Instance.GetHero(guidList[i]), i);
        }
        List<int> posList = new List<int>();
        for (int i = 0; i < guidList.Count; i++)
        {
            posList.Add(i);
        }
        TeamChangeEvent(posList, -1, Vector3.zero);
        heroListScroller.m_Scorller.RefreshActiveCellViews();
        TeamChangeEvent(new List<int>() { 0, 1, 2, 3, 4, 5 }, -1, Vector3.zero);
    }
    void SaveTeam()
Main/System/HeroUI/HeroScenePosCell.cs
@@ -20,6 +20,7 @@
    [SerializeField] DragItem dragObj;
    [SerializeField] Transform objForfly;  //点击飞入的时候的显隐控制
    public void Display(string guid, int index, bool isFly = false)
    {
        var hero = HeroManager.Instance.GetHero(guid);
@@ -46,7 +47,11 @@
            suggestForm.SetActive(false);
        }
        dragObj.pos = index;
        dragObj.onEndDragEvent -= SwitchPos;
        dragObj.onEndDragEvent += SwitchPos;
        dragObj.canvas.sortingLayerID =  dragObj.parentCanvas.sortingLayerID;
        dragObj.canvas.sortingOrder = dragObj.parentCanvas.sortingOrder + index + 1;
        heroBtn.AddListener(() =>
        {
@@ -72,6 +77,23 @@
    void SwitchPos(int pos1, int pos2)
    {
        Debug.Log("交换位置:" + pos1 + "   " + pos2);
        var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
        if (pos2 == -1)
        {
            //下阵
            team.RemoveHero(pos1);
            HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1 }, -1, Vector3.zero);
        }
        else if (pos1 == pos2)
        {
            HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1 }, -1, Vector3.zero);
        }
        else
        {
            //通知刷新
            team.SwapPosition(pos1, pos2);
            HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1, pos2 }, -1, Vector3.zero);
        }
    }
    async UniTask DelayShow()