From 39001a600fcae2bcf27c225df8752d75fb92fef4 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 31 十月 2025 11:18:26 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
---
Main/System/Battle/BattleUtility.cs | 351 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 337 insertions(+), 14 deletions(-)
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 5ac2287..2f9276c 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -4,29 +4,352 @@
using UnityEngine.UI;
using DG.Tweening;
using DG.Tweening.Core;
-
+using System.Linq;
public static class BattleUtility
{
// 鍏朵粬閫氱敤鐨勬垬鏂楀伐鍏锋柟娉曞彲浠ユ斁鍦ㄨ繖閲�
- 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)
{
- Vector3 targetWorldPos = target.TransformPoint(target.anchoredPosition + offset);
+ // 杩愯鏃舵墠鎵ц
+ if (!Application.isPlaying)
+ {
+ Debug.LogWarning("璇峰湪杩愯鏃朵娇鐢ㄨ鍔熻兘锛�");
+ return;
+ }
- RectTransform parentRect = transform.parent as RectTransform;
+ var battleField = BattleManager.Instance.storyBattleField;
+ if (battleField == null)
+ {
+ Debug.LogError("BattleManager.storyBattleField 鏈垵濮嬪寲锛�");
+ return;
+ }
- Vector2 targetAnchoredPos;
- RectTransformUtility.ScreenPointToLocalPointInRectangle(
- parentRect,
- RectTransformUtility.WorldToScreenPoint(null, targetWorldPos),
- null,
- out targetAnchoredPos);
- // 3. DOTween 绉诲姩
- return transform.DOAnchorPos(targetAnchoredPos, duration)
- .SetEase(Ease.Linear)
- .OnComplete(() => onComplete?.Invoke());
+ 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);
+
+ // 杞崲鍒癈anvas鏈湴鍧愭爣
+ Vector2 localPoint;
+ RectTransformUtility.ScreenPointToLocalPointInRectangle(
+ canvasRect,
+ RectTransformUtility.WorldToScreenPoint(null, worldPos),
+ null,
+ out localPoint);
+
+ // 鍒涘缓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, Action onComplete = null, float speed = 500f)
+ {
+ // 鑾峰彇鐩爣鑺傜偣鐨勪笘鐣屽潗鏍囷紙閿氱偣浣嶇疆锛�
+ Vector3 worldPos = target.position;
+
+ // 濡傛灉闇�瑕佸姞 offset锛岄渶鑰冭檻 scale
+ Vector3 offsetWorld = target.TransformVector(offset);
+ worldPos += offsetWorld;
+
+ RectTransform canvasRect = transform.parent as RectTransform;
+
+ // 杞崲鍒癈anvas鏈湴鍧愭爣
+ Vector2 localPoint;
+ RectTransformUtility.ScreenPointToLocalPointInRectangle(
+ canvasRect,
+ RectTransformUtility.WorldToScreenPoint(null, worldPos),
+ null,
+ out localPoint);
+
+ float distance = Vector2.Distance(transform.anchoredPosition, localPoint);
+ float duration = distance / speed;
+
+ var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
+ tween.onComplete += () =>
+ {
+ onComplete?.Invoke();
+ };
+
+ return tween;
+ }
+
+ public static string DisplayDamageNum(long num, int attackType)
+ {
+ var config = DamageNumConfig.Get(attackType);
+ var basePowerStr = UIHelper.ReplaceLargeArtNum(num);
+ var result = string.Empty;
+ for (int i = 0; i < basePowerStr.Length; i++)
+ {
+ var numChar = (char)GetDamageNumKey(config, basePowerStr[i]);
+ if (numChar > 0)
+ {
+ result += numChar;
+ }
+ }
+ return result;
+ }
+
+ public static string DisplayDamageNum(BattleDmg damage)
+ {
+ var config = DamageNumConfig.Get(damage.attackType);
+
+ string result = string.Empty;
+
+ // 濡傛灉鏄棯閬� 鍒欏彧鏄剧ず闂伩涓や釜瀛�
+ if (damage.IsType(DamageType.Dodge))
+ {
+ result += (char)config.prefix;
+ }
+ else
+ {
+ result = ConvertToArtFont(config, damage.damage);
+ }
+
+ return result;
+ }
+
+ public static string ConvertToArtFont(DamageNumConfig config, float _num)
+ {
+ var stringBuild = new System.Text.StringBuilder();
+
+ if (0 != config.plus)
+ stringBuild.Append((char)config.plus);
+ if (0 != config.prefix)
+ stringBuild.Append((char)config.prefix);
+
+ var chars = UIHelper.ReplaceLargeArtNum(_num);
+ for (var i = 0; i < chars.Length; i++)
+ {
+ int numChar = GetDamageNumKey(config, (int)chars[i]);
+
+ if (numChar > 0)
+ {
+ stringBuild.Append((char)numChar);
+ }
+ }
+
+ return stringBuild.ToString();
+ }
+
+ public static int GetMainTargetPositionNum(BattleObject caster, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> targetList, SkillConfig skillConfig)
+ {
+ int returnIndex = 0;
+ // 鏍规嵁鏁屾柟琛�閲忛樀钀� 瀛樻椿浜烘暟鏉ラ�夋嫨
+ BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+ List<BattleObject> targetObjList = caster.battleField.battleObjMgr.GetBattleObjList(battleCamp);
+
+
+ // 鐬勫噯鐨勭洰鏍囪寖鍥达紝濡傛灉鐩爣涓暟涓�0鍒欎负鑼冨洿鍐呭叏閮�
+ // 0 鍏ㄩ儴鑼冨洿
+ // 1 瀵逛綅锛岄粯璁ゅ彧閫�1涓�
+ // 2 鍓嶆帓
+ // 3 鍚庢帓
+ // 4 绾垫帓锛屾寜瀵逛綅瑙勫垯閫夋嫨绾垫帓
+ // 5 鑷繁锛岄粯璁ゅ彧閫夎嚜宸�
+
+ switch (skillConfig.TagAim)
+ {
+ case 0:
+ // 0 鍏ㄩ儴鑼冨洿锛�
+ // 鑻agCount鐩爣涓暟涓�0鎴�6锛屾牴鎹甌agFriendly鏁屾垜閰嶇疆锛屼唬琛ㄤ綔鐢ㄤ簬鏁屾柟鍏ㄤ綋鎴栨垜鏂瑰叏浣擄紝姝ゆ椂涓荤洰鏍囦负鏁屾垜绔欎綅涓殑2鍙蜂綅缃�
+ // 鑻agCount鐩爣涓暟涓�1~5涓紝鏍规嵁TagFriendly鏁屾垜+TagAffect缁嗗垎鐩爣閰嶇疆锛屼唬琛ㄩ殢鏈轰綔鐢ㄤ簬鏁屾柟鎴栨垜鏂箈涓灏嗭紝绗竴涓负涓荤洰鏍�
+ if (skillConfig.TagCount == 0 || skillConfig.TagCount == 6)
+ {
+ returnIndex = 1;
+ }
+ else
+ {
+ uint objId = targetList[0].ObjID;
+ BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+ return target.teamHero.positionNum;
+ }
+ break;
+ case 1:
+ // 1 瀵逛綅锛�
+ // 榛樿鍙��1涓紝瀵逛綅瑙勫垯涓篈1浼樺厛鎵揃1锛孉2浼樺厛鎵揃2锛孉3浼樺厛鎵揃3锛屽浣嶇洰鏍囨浜℃椂锛屼紭鍏堝墠鎺掞紝姣斿B2宸茬粡姝讳骸锛岄偅涔圓2灏嗕紭鍏堟墦B1锛屽墠鎺�1銆�2銆�3鍙蜂綅缃叏閮ㄦ浜′箣鍚庢墠寮�濮嬮�夋嫨鍚庢帓4銆�5銆�6鍙蜂綅缃紝瀵逛綅鍙彲閫�1涓洰鏍囷紝鍗充富鐩爣
+ if (targetList.Count > 0)
+ {
+ BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)targetList[0].ObjID);
+ if (battleObject != null)
+ {
+ returnIndex = battleObject.teamHero.positionNum;
+ }
+ else
+ {
+ Debug.LogError("GetMainTargetPositionNum 鎵句笉鍒扮洰鏍� ObjId : " + targetList[0].ObjID);
+ returnIndex = 0;
+ }
+ }
+ else
+ {
+ Debug.LogError("targetList 鐩爣鍒楄〃涓虹┖");
+ returnIndex = 0;
+ }
+ break;
+ case 2:
+ // 1銆�2銆�3鍙蜂綅涓哄墠鎺掞紝榛樿2鍙蜂綅缃负涓荤洰鏍囷紝褰�1銆�2銆�3鍙蜂綅缃鑹插叏閮ㄦ浜★紝鍓嶆帓灏嗘浛鎹㈡垚鍚庢帓锛�5鍙蜂綅缃彉鏇翠负涓荤洰鏍囷紝
+ // 鑻ラ厤缃甌agAffect缁嗗垎鐩爣锛屼笖浜烘暟灏忎簬3锛屽垯鎵�鏈夎閫夋嫨鐩爣鍧囦负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+ // 锛堝嵆鍓嶆帓榛樿2鍙蜂綅鎴�5鍙蜂綅瑙勫垯鏃犳晥锛屽疄闄呬綔鐢ㄥ灏戜汉灏辨槸澶氬皯涓富鐩爣锛� (YL : TagAffect>0 && TagAffect != 3灏辨槸鍏ㄤ綋閮芥槸涓荤洰鏍� 鍚庢帓涓�鏍� )
+ if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+ {
+ uint objId = targetList[0].ObjID;
+ BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+ returnIndex = target.teamHero.positionNum;
+ }
+ else
+ {
+ // 鐪嬬湅瀵归潰鍓嶆帓鏄惁閮芥椿鐫�
+ List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum < 3 select bo);
+ if (front.Count > 0)
+ {
+ returnIndex = 1;
+ }
+ else
+ {
+ returnIndex = 4;
+ }
+ }
+ break;
+ case 3:
+ if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+ {
+ uint objId = targetList[0].ObjID;
+ BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+ returnIndex = target.teamHero.positionNum;
+ }
+ else
+ {
+ // 鐪嬬湅瀵归潰鍚庢帓鏄惁閮芥椿鐫�
+ List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum >= 3 select bo);
+ if (back.Count > 0)
+ {
+ returnIndex = 4;
+ }
+ else
+ {
+ returnIndex = 1;
+ }
+ }
+ break;
+ // 4 绾垫帓锛屾寜瀵逛綅瑙勫垯閫夋嫨绾垫帓
+ case 4:
+ returnIndex = int.MaxValue;
+ for (int i = 0; i < targetList.Count; i++)
+ {
+ var hurt = targetList[i];
+ BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+ if (target == null)
+ {
+ Debug.LogError("GetMainTargetPositionNum 鎵句笉鍒扮洰鏍� ObjId : " + hurt.ObjID);
+ continue;
+ }
+ else
+ {
+ returnIndex = Mathf.Min(returnIndex, target.teamHero.positionNum);
+ }
+ }
+ break;
+ // 5 鑷繁锛岄粯璁ゅ彧閫夎嚜宸�
+ case 5:
+ returnIndex = caster.teamHero.positionNum;
+ break;
+ default:
+ Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閫夋嫨涓荤洰鏍� 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " TagAim " + skillConfig.TagAim);
+ returnIndex = 0;
+ break;
+ }
+
+ return returnIndex;
+ }
+
+ public static int GetDamageNumKey(DamageNumConfig config, int _num)
+ {
+ if (_num == 46) return config.nums[10]; // '.'
+ else if (_num == 107) return config.nums[11]; // 'k'
+ else if (_num == 109) return config.nums[12]; // 'm'
+ else if (_num == 98) return config.nums[13]; // 'b'
+ else if (_num == 116) return config.nums[14]; // 't'
+ int targetNum = _num - 48;
+ if (targetNum >= config.nums.Length || targetNum < 0)
+ {
+ Debug.LogError("damage config " + config.TypeID + " _num is " + _num + " out of range");
+ return _num;
+ }
+ return config.nums[_num - 48];
+ }
+
+ /// <summary>
+ /// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
+ /// </summary>
+ public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
+ {
+ List<long> fixedDamageList = new List<long>();
+
+ for (int i = 0; i < damageDivide.Length; i++)
+ {
+ float fixedDamage = (float)totalDamage * (float)damageDivide[i] / 10000f;
+ fixedDamageList.Add((int)fixedDamage);
+ }
+
+ return fixedDamageList;
+ }
+
+ public static List<HB422_tagMCTurnFightObjDead> FindDeadPack(List<GameNetPackBasic> packList)
+ {
+ List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>();
+ for (int i = 0; i < packList.Count; i++)
+ {
+ var pack = packList[i];
+ // 瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
+ if (pack is HB422_tagMCTurnFightObjDead deadPack)
+ {
+ deadPacks.Add(deadPack);
+ }
+ else if (pack is CustomHB426CombinePack)
+ {
+ break;
+ }
+ }
+ // Debug.LogError("find dead pack " + deadPacks.Count);
+ return deadPacks;
+ }
+
+
+ public static List<HB423_tagMCTurnFightObjReborn> FindRebornPack(List<GameNetPackBasic> packList)
+ {
+ List<HB423_tagMCTurnFightObjReborn> rebornPackList = new List<HB423_tagMCTurnFightObjReborn>();
+ for (int i = 0; i < packList.Count; i++)
+ {
+ var pack = packList[i];
+ // 瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
+ if (pack is HB423_tagMCTurnFightObjReborn rebornPack)
+ {
+ rebornPackList.Add(rebornPack);
+ }
+ else if (pack is CustomHB426CombinePack)
+ {
+ break;
+ }
+ }
+ return rebornPackList;
+ }
}
\ No newline at end of file
--
Gitblit v1.8.0