yyl
2025-08-25 cec8b67d82c2c2c1662d55c818c4a46bcc0487db
Main/System/Battle/BattleUtility.cs
@@ -10,28 +10,110 @@
{
    // 其他通用的战斗工具方法可以放在这里
    public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(RectTransform transform, RectTransform target, Vector2 offset, float duration, Action onComplete = null)
    public static void MarkStartAndEnd(RectTransform startNode, RectTransform endNode)
    {
        // 1. 获取目标的最终 anchoredPosition(加上 offset)
        Vector2 targetAnchoredPos = target.anchoredPosition + offset;
        Vector3 worldAnchorPos = target.TransformPoint(targetAnchoredPos);
        // 运行时才执行
        if (!Application.isPlaying)
        {
            Debug.LogWarning("请在运行时使用该功能!");
            return;
        }
        var battleField = BattleManager.Instance.storyBattleField;
        if (battleField == null)
        {
            BattleDebug.LogError("BattleManager.storyBattleField 未初始化!");
            return;
        }
        // 转换 target 的 anchoredPosition 到 sourceParent 的坐标系
        BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
        RectTransform canvasRect = battleWin.transform as RectTransform;
        CreateMarker(canvasRect, startNode, "StartMarker");
        CreateMarker(canvasRect, endNode, "EndMarker");
    }
    private static void CreateMarker(RectTransform canvasRect, RectTransform targetNode, string markerName)
    {
        // 获取目标节点的世界坐标(中心点)
        Vector3 worldPos = targetNode.TransformPoint(targetNode.rect.center);
        // 转换到Canvas本地坐标
        Vector2 localPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            transform,
            RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, worldAnchorPos),
            CameraManager.uiCamera,
            canvasRect,
            RectTransformUtility.WorldToScreenPoint(null, worldPos),
            null,
            out localPoint);
        // 3. DOTween 移动
        // 创建RawImage
        GameObject marker = new GameObject(markerName, typeof(RawImage));
        GameObject.Destroy(marker, 5f);
        marker.transform.SetParent(canvasRect, false);
        var rawImage = marker.GetComponent<RawImage>();
        rawImage.color = Color.white;
        rawImage.rectTransform.sizeDelta = new Vector2(100, 100);
        rawImage.rectTransform.anchoredPosition = localPoint;
    }
    public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(
        RectTransform transform, RectTransform target, Vector2 offset, float duration, Action onComplete = null)
    {
        // 获取目标节点的世界坐标(中心点)
        Vector3 worldPos = target.TransformPoint(target.rect.center + offset);
        RectTransform canvasRect = transform.parent as RectTransform;
        // 转换到Canvas本地坐标
        Vector2 localPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            canvasRect,
            RectTransformUtility.WorldToScreenPoint(null, worldPos),
            null,
            out localPoint);
        // 创建RawImage
        var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
        tween.onComplete += () =>
        {
            onComplete?.Invoke();
        };
        // MarkStartAndEnd(transform as RectTransform, target);
        // // 1. 获取目标的世界坐标(加 offset)
        // Vector3 targetWorldPos = target.TransformPoint(target.anchoredPosition + offset);
        // // 2. 获取源节点的 parent
        // RectTransform sourceParent = transform.parent as RectTransform;
        // if (sourceParent == null)
        // {
        //     BattleDebug.LogError("源节点没有父节点,无法转换坐标!");
        //     return null;
        // }
        // // 3. 把目标世界坐标转换到源 parent 的本地坐标
        // Vector2 targetAnchoredPos;
        // RectTransformUtility.ScreenPointToLocalPointInRectangle(
        //     sourceParent,
        //     RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, targetWorldPos),
        //     CameraManager.uiCamera,
        //     out targetAnchoredPos);
        // // 4. DOTween 移动
        // var tween = transform.DOAnchorPos(targetAnchoredPos, duration).SetEase(Ease.Linear);
        // tween.onComplete += () =>
        // {
        //     onComplete?.Invoke();
        // };
        return tween;
    }