using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
using DG.Tweening;
|
using DG.Tweening.Core;
|
|
|
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)
|
{
|
// 1. 获取目标的最终 anchoredPosition(加上 offset)
|
Vector2 targetAnchoredPos = target.anchoredPosition + offset;
|
Vector3 worldAnchorPos = target.TransformPoint(targetAnchoredPos);
|
|
|
// 转换 target 的 anchoredPosition 到 sourceParent 的坐标系
|
Vector2 localPoint;
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(
|
transform,
|
RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, worldAnchorPos),
|
CameraManager.uiCamera,
|
out localPoint);
|
|
// 3. DOTween 移动
|
var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
|
tween.onComplete += () =>
|
{
|
onComplete?.Invoke();
|
};
|
|
return tween;
|
}
|
|
public static string DisplayDamageNum(long num, int attackType)
|
{
|
var basePowerStr = UIHelper.ReplaceLargeArtNum(num);
|
var result = string.Empty;
|
for (int i = 0; i < basePowerStr.Length; i++)
|
{
|
var numChar = (char)GetDamageNumKey((DamageType)attackType, basePowerStr[i]);
|
if (numChar > 0)
|
{
|
result += numChar;
|
}
|
}
|
return result;
|
}
|
|
public static int GetDamageNumKey(DamageType damageType, int _num)
|
{
|
var config = DamageNumConfig.Get(damageType.ToString());
|
//.的ASCII码是46
|
if (_num == 46)
|
{
|
return config.nums[10];
|
}
|
//k的ASCII码是107
|
else if (_num == 107)
|
{
|
return config.nums[11];
|
}
|
//m的ASCII码是109
|
else if (_num == 109)
|
{
|
return config.nums[12];
|
}
|
//b的ASCII码是98
|
else if (_num == 98)
|
{
|
return config.nums[13];
|
}
|
//t的ASCII码是116
|
else if (_num == 116)
|
{
|
return config.nums[14];
|
}
|
return config.nums[_num - 48];
|
}
|
|
/// <summary>
|
/// 保证所有分配项加起来等于totalDamage,避免因整除导致的误差
|
/// </summary>
|
public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
|
{
|
List<long> fixedDamageList = new List<long>();
|
long assigned = 0;
|
int count = damageDivide.Length;
|
|
for (int i = 0; i < count; i++)
|
{
|
long damage;
|
if (i == count - 1)
|
{
|
// 最后一个分配项修正为剩余
|
damage = totalDamage - assigned;
|
}
|
else
|
{
|
damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 四舍五入
|
assigned += damage;
|
}
|
fixedDamageList.Add(damage);
|
}
|
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)
|
{
|
var deadPack = pack as HB422_tagMCTurnFightObjDead;
|
deadPacks.Add(deadPack);
|
}
|
else if (pack is CustomHB426CombinePack)
|
{
|
// 找死亡包不要越过技能包
|
var combinePack = pack as CustomHB426CombinePack;
|
if (combinePack.startTag.Tag.StartsWith("Skill_"))
|
{
|
break;
|
}
|
}
|
}
|
return deadPacks;
|
}
|
|
|
public static List<HB423_tagMCTurnFightObjReborn> FindRebornPack(List<GameNetPackBasic> packList)
|
{
|
List<HB423_tagMCTurnFightObjReborn> rebornPack = new List<HB423_tagMCTurnFightObjReborn>();
|
for (int i = 0; i < packList.Count; i++)
|
{
|
var pack = packList[i];
|
// 寻找死亡包 找到死亡包之后要找掉落包 不能超过技能包
|
if (pack is HB423_tagMCTurnFightObjReborn)
|
{
|
var deadPack = pack as HB423_tagMCTurnFightObjReborn;
|
rebornPack.Add(deadPack);
|
}
|
else if (pack is CustomHB426CombinePack)
|
{
|
// 找死亡包不要越过技能包
|
var combinePack = pack as CustomHB426CombinePack;
|
if (combinePack.startTag.Tag.StartsWith("Skill_"))
|
{
|
break;
|
}
|
}
|
}
|
return rebornPack;
|
}
|
}
|