| | |
| | | { |
| | | // 其他通用的战斗工具方法可以放在这里 |
| | | |
| | | 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; |
| | | } |
| | | |