| | |
| | | |
| | | private void OnDamageTaken(BattleDmgInfo damageInfo) |
| | | { |
| | | SetTargetDamage(damageInfo); |
| | | SetSelfDamage(damageInfo); |
| | | } |
| | | |
| | | private void SetSelfDamage(BattleDmgInfo damageInfo) |
| | | { |
| | | if (damageInfo.casterDamageList.Count > 0) |
| | | { |
| | | GameObject damageContent = damagePrefabPool.Request(); |
| | | DamageContent content = damageContent.GetComponent<DamageContent>(); |
| | | damageContent.transform.SetParent(damageNode, false); |
| | | |
| | | var heroRect = damageInfo.casterObj.heroRectTrans; |
| | | if (heroRect == null) |
| | | { |
| | | damagePrefabPool.Release(damageContent); |
| | | return; |
| | | } |
| | | |
| | | var contentRect = content.GetComponent<RectTransform>(); |
| | | var contentParentRect = contentRect.parent as RectTransform; |
| | | |
| | | // 获取 heroRect 的世界坐标(锚点为中心) |
| | | Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center); |
| | | |
| | | // 转换到 content 父节点下的 anchoredPosition |
| | | Vector2 anchoredPos; |
| | | RectTransformUtility.ScreenPointToLocalPointInRectangle( |
| | | contentParentRect, |
| | | RectTransformUtility.WorldToScreenPoint(null, worldTargetPos), |
| | | null, |
| | | out anchoredPos); |
| | | |
| | | // 设置动态位置(会覆盖配置中的位置) |
| | | Vector2 beginPos = anchoredPos; |
| | | Vector2 endPos = anchoredPos + new Vector2(0, 150); |
| | | content.SetPosition(beginPos, endPos); |
| | | |
| | | // 设置速度比例 |
| | | if (battleField != null) |
| | | { |
| | | content.SetRatio(battleField.speedRatio, 1f); |
| | | } |
| | | |
| | | content.SetDamage(damageInfo, damageInfo.casterDamageList, () => RemoveDamageContent(content)); |
| | | damageContentList.Add(content); |
| | | } |
| | | } |
| | | |
| | | private void SetTargetDamage(BattleDmgInfo damageInfo) |
| | | { |
| | | if (damageInfo.targetDamageList.Count > 0) |
| | | { |
| | | GameObject damageContent = damagePrefabPool.Request(); |
| | | DamageContent content = damageContent.GetComponent<DamageContent>(); |
| | | damageContent.transform.SetParent(damageNode, false); |
| | |
| | | content.SetRatio(battleField.speedRatio, 1f); |
| | | } |
| | | |
| | | // 设置伤害数据并开始播放 |
| | | content.SetDamage(damageInfo, () => RemoveDamageContent(content)); |
| | | content.SetDamage(damageInfo, damageInfo.targetDamageList, () => RemoveDamageContent(content)); |
| | | damageContentList.Add(content); |
| | | } |
| | | } |
| | | |
| | | public void SetBattleField(BattleField _battleField) |
| | | { |
| | |
| | | private set; |
| | | } |
| | | |
| | | protected BattleDrops battleDrops; |
| | | protected BattleDrops m_battleDrops; |
| | | |
| | | private RectTransform m_heroRectTrans; |
| | | |
| | |
| | | |
| | | if (isFatalAttack) |
| | | { |
| | | if (null != battleDrops) |
| | | if (null != battleHurtParam.battleDrops) |
| | | { |
| | | PushDropItems(battleDrops); |
| | | PushDropItems(battleHurtParam.battleDrops); |
| | | } |
| | | battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>() { battleHurtParam.deadPack }); |
| | | |
| | |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | public void SuckHp(uint suckHP, SkillConfig skillConfig) |
| | | { |
| | | // teamHero.curHp = Math.Min(teamHero.maxHp, teamHero.curHp + (int)suckHP); |
| | | } |
| | | |
| | | public void HurtByReflect(uint bounceHP, SkillConfig skillConfig) |
| | | { |
| | | // teamHero.curHp = Math.Max(0, teamHero.curHp - (int)bounceHP); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | public void PushDropItems(BattleDrops _battleDrops) |
| | | { |
| | | battleDrops = _battleDrops; |
| | | m_battleDrops = _battleDrops; |
| | | } |
| | | |
| | | public void PerformDrop() |
| | | { |
| | | if (null == battleDrops || battleDrops.dropItemPackIndex.Count == 0) |
| | | if (null == m_battleDrops || m_battleDrops.dropItemPackIndex.Count == 0) |
| | | return; |
| | | |
| | | EventBroadcast.Instance.Broadcast<string, BattleDrops, Action>( |
| | | EventName.BATTLE_DROP_ITEMS, battleField.guid, battleDrops, OnPerformDropFinish); |
| | | EventName.BATTLE_DROP_ITEMS, battleField.guid, m_battleDrops, OnPerformDropFinish); |
| | | } |
| | | |
| | | protected void OnPerformDropFinish() |
| | | { |
| | | battleDrops = null; |
| | | m_battleDrops = null; |
| | | } |
| | | |
| | | public void SetBack() |
| | |
| | | public List<long> damageList { get { return battleHurtParam.damageList; } } |
| | | public BattleObject hurtObj { get { return battleHurtParam.hurtObj; } } |
| | | |
| | | public BattleObject casterObj { get { return battleHurtParam.casterObj; } } |
| | | |
| | | public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get { return battleHurtParam.hurt; } } |
| | | |
| | | public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } } |
| | |
| | | |
| | | public bool isLastHit = false; |
| | | |
| | | public List<BattleDmg> battleDamageList = new List<BattleDmg>(); |
| | | public List<BattleDmg> targetDamageList = new List<BattleDmg>(); |
| | | |
| | | public List<BattleDmg> casterDamageList = new List<BattleDmg>(); |
| | | |
| | | public BattleDmgInfo(string battleFieldGuid, BattleHurtParam battleHurtParam) |
| | | { |
| | |
| | | long reflectHp = battleHurtParam.reflectHpList[i]; |
| | | if (reflectHp > 0) |
| | | { |
| | | battleDamageList.Add(new BattleDmg |
| | | casterDamageList.Add(new BattleDmg |
| | | { |
| | | damage = reflectHp, |
| | | attackType = (int)DamageType.Reflect |
| | |
| | | long suckHp = battleHurtParam.suckHpList[i]; |
| | | if (suckHp > 0) |
| | | { |
| | | battleDamageList.Add(new BattleDmg |
| | | casterDamageList.Add(new BattleDmg |
| | | { |
| | | damage = suckHp, |
| | | attackType = (int)DamageType.SuckHP |
| | |
| | | // 计算格挡伤害 |
| | | long totalDamage = (long)(actualDamage / (1 - blockRatio)); |
| | | long blockDmg = totalDamage - actualDamage; |
| | | battleDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block }); |
| | | targetDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block }); |
| | | |
| | | // 真实伤害特殊处理 |
| | | if (IsRealdamage()) |
| | | { |
| | | int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | } |
| | | else |
| | | { |
| | |
| | | else |
| | | UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); |
| | | } |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | } |
| | | } |
| | | else |
| | |
| | | if (IsRealdamage()) |
| | | { |
| | | int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0); |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType }); |
| | | } |
| | | else |
| | | { |
| | |
| | | else |
| | | UnityEngine.Debug.LogError($"强制转换失败,该类型不是治疗也不是伤害 {attackType}"); |
| | | } |
| | | battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType }); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, suckHp); |
| | | |
| | | List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, hurt.BounceHP); |
| | | List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, reflectHp); |
| | | // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount; |
| | | |
| | | // 计算当前这一击的实际伤害(所有分段伤害之和) |
| | |
| | | currentHitReflectHp += reflect; |
| | | } |
| | | |
| | | long toHp = Math.Max(0, fromHp - currentHitDamage + currentHitSuckHp - currentHitReflectHp); |
| | | long toHp = Math.Max(0, fromHp - currentHitDamage); |
| | | |
| | | |
| | | // 更新目标血量 |
| | |
| | | $"伤害: {currentHitDamage} (总伤害: {totalDamage})\n" + |
| | | $"吸血: {currentHitSuckHp}\n" + |
| | | $"反伤: {currentHitReflectHp}\n" + |
| | | $"血量变化: {fromHp} -> {toHp}" |
| | | $"血量变化: {fromHp} -> {toHp}\n" + |
| | | $"技能包里的血量是: {GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx)}\n" |
| | | ); |
| | | #endif |
| | | |
| | |
| | | if (tween) |
| | | { |
| | | // 同样的修复 |
| | | sliderXp.value = fromValue; // ← 这行是关键! |
| | | sliderXp.value = fromValue; |
| | | xpTween = sliderXp.DOValue(targetValue, 0.2f).SetAutoKill(false); |
| | | battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween); |
| | | } |
| | |
| | | controller?.SetRuntimePosition(beginPos, endPos); |
| | | } |
| | | |
| | | public async void SetDamage(BattleDmgInfo _damageInfo, Action _onComplete) |
| | | public async void SetDamage(BattleDmgInfo _battleDmgInfo, List<BattleDmg> damages, Action _onComplete) |
| | | { |
| | | battleDmgInfo = _damageInfo; |
| | | |
| | | var damages = battleDmgInfo.battleDamageList; |
| | | |
| | | battleDmgInfo = _battleDmgInfo; |
| | | for (int i = damages.Count; i < damageLineList.Count; i++) |
| | | { |
| | | damageLineList[i].SetActive(false); |