| | |
| | | protected SkillEffect skillEffect; |
| | | public HB427_tagSCUseSkill tagUseSkillAttack; |
| | | public SkillConfig skillConfig; |
| | | |
| | | public SkillSkinConfig skillSkinConfig; |
| | | protected bool isFinished = false; |
| | | protected BattleField battleField = null; // 战场 |
| | | protected RectTransform targetNode = null; // 目标节点 |
| | |
| | | tagUseSkillAttack = vNetData; |
| | | battleField = _battleField; |
| | | packList = _packList; |
| | | |
| | | if (_caster is HeroBattleObject heroBattleObject) |
| | | { |
| | | skillSkinConfig = skillConfig.GetSkillSkinConfig(heroBattleObject.teamHero.SkinID); |
| | | |
| | | if (null == skillSkinConfig) |
| | | { |
| | | Debug.LogError("找不到技能皮肤表 " + "skillId: " + skillConfig.SkillID + " skinId: " + heroBattleObject.teamHero.SkinID); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | skillSkinConfig = skillConfig.GetOriginSkinConfig(); |
| | | } |
| | | |
| | | |
| | | // 注册正在释放的技能 |
| | | if (battleField != null && caster != null) |
| | |
| | | // 命格释放技能时 teamHero 为 null,监听器会正确处理(已有 null 检查) |
| | | EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero); |
| | | |
| | | if (skillConfig.SkinllSFX1 != 0) |
| | | if (skillSkinConfig.SkinllSFX1 != 0) |
| | | { |
| | | battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX1, false); |
| | | battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX1, false); |
| | | } |
| | | |
| | | if (caster != null) |
| | |
| | | HighLightAllTargets(); |
| | | |
| | | // 根据释放模式执行相应逻辑 |
| | | switch (skillConfig.castMode) |
| | | switch (skillSkinConfig.castMode) |
| | | { |
| | | case SkillCastMode.None: |
| | | case SkillCastMode.Self: |
| | |
| | | DashCast(OnAttackFinish); |
| | | break; |
| | | default: |
| | | Debug.LogError("强制结束技能 暂时不支持其他的方式释放 有需求please联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition); |
| | | Debug.LogError("强制结束技能 暂时不支持其他的方式释放 有需求please联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillSkinConfig.CastPosition); |
| | | ForceFinished(); |
| | | break; |
| | | } |
| | |
| | | // 对敌方释放技能:移动到敌方区域进行攻击 |
| | | protected void CastToEnemy() |
| | | { |
| | | RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig); |
| | | RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillSkinConfig); |
| | | ExecuteMoveAndCastSequence(target, () => |
| | | { |
| | | if (skillConfig.ClientTriggerTiming == 1) |
| | |
| | | // 对友方释放技能:移动到友方区域进行治疗或增益 |
| | | protected void CastToAllies() |
| | | { |
| | | RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig); |
| | | RectTransform target = battleField.GetTeamNode(caster.Camp, skillSkinConfig); |
| | | ExecuteMoveAndCastSequence(target, () => |
| | | { |
| | | if (skillConfig.ClientTriggerTiming == 1) |
| | |
| | | private void ExecuteMoveAndCastSequence(RectTransform target, Action onReturnComplete) |
| | | { |
| | | ShadowIllutionCreate(true); |
| | | MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () => |
| | | MoveToTarget(target, new Vector2(skillSkinConfig.CastDistance, 0), () => |
| | | { |
| | | if (skillConfig.CastDistance < 9999 && skillConfig.SkinllSFX2 != 0) |
| | | if (skillSkinConfig.CastDistance < 9999 && skillSkinConfig.SkinllSFX2 != 0) |
| | | { |
| | | battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX2, false); |
| | | battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX2, false); |
| | | } |
| | | |
| | | TurnBack(() => |
| | |
| | | // 移动到目标位置:处理角色的移动动画和逻辑 |
| | | protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 750f) |
| | | { |
| | | if (skillConfig.CastDistance >= 9999) |
| | | if (skillSkinConfig.CastDistance >= 9999) |
| | | { |
| | | _onComplete?.Invoke(); |
| | | return; |
| | |
| | | // 转身逻辑:根据技能配置处理角色转向 |
| | | protected void TurnBack(Action _onComplete, float forward) |
| | | { |
| | | if (skillConfig.CastDistance < 0) |
| | | if (skillSkinConfig.CastDistance < 0) |
| | | { |
| | | caster.SetFacing(forward); |
| | | } |
| | |
| | | // 执行技能释放动画和逻辑:播放施法动作并提供回调 |
| | | protected TrackEntry CastImpl(Action onComplete = null) |
| | | { |
| | | return caster.PlaySkillAnimation(skillConfig, this, tagUseSkillAttack.BattleType == 4, onComplete); |
| | | return caster.PlaySkillAnimation(skillConfig, skillSkinConfig, this, tagUseSkillAttack.BattleType == 4, onComplete); |
| | | } |
| | | |
| | | // 技能开始回调:处理死亡、子技能、技能效果初始化 |
| | |
| | | // 再处理 内嵌技能 |
| | | ProcessSubSkill(); |
| | | |
| | | skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack); |
| | | skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, skillSkinConfig, tagUseSkillAttack); |
| | | skillEffect.Play(OnHitTargets); |
| | | |
| | | |
| | |
| | | if (pack is HB427_tagSCUseSkill skillPack) |
| | | { |
| | | SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID); |
| | | if (!string.IsNullOrEmpty(ssc.SkillMotionName)) |
| | | SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig(); |
| | | if (!string.IsNullOrEmpty(sscSkin.SkillMotionName)) |
| | | { |
| | | break; |
| | | } |
| | |
| | | { |
| | | HB427_tagSCUseSkill sp = combinePack.GetMainHB427SkillPack(); |
| | | SkillConfig ssc = SkillConfig.Get((int)sp.SkillID); |
| | | |
| | | if (!string.IsNullOrEmpty(ssc.SkillMotionName)) |
| | | SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig(); |
| | | if (!string.IsNullOrEmpty(sscSkin.SkillMotionName)) |
| | | { |
| | | break; |
| | | } |
| | |
| | | #if UNITY_EDITOR |
| | | private void PrintHurtParamDebugInfo(BattleHurtParam hurtParam) |
| | | { |
| | | bool isLastHit = hurtParam.hitIndex >= hurtParam.skillConfig.DamageDivide.Length - 1; |
| | | bool isLastHit = hurtParam.hitIndex >= hurtParam.skillSkinConfig.DamageDivide.Length - 1; |
| | | |
| | | long currentHitDamage = hurtParam.hurter.damageList != null ? hurtParam.hurter.damageList.Sum() : 0; |
| | | long currentHitSuckHp = hurtParam.caster.suckHpList != null ? hurtParam.caster.suckHpList.Sum() : 0; |
| | |
| | | $"攻击者: {hurtParam.caster.casterObj.GetName()} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" + |
| | | $"目标: {hurtParam.hurter.hurtObj.GetName()} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" + |
| | | $"技能: {hurtParam.skillConfig.SkillName} (ID:{hurtParam.skillConfig.SkillID})\n" + |
| | | $"击数: 第{hurtParam.hitIndex + 1}击 / 共{hurtParam.skillConfig.DamageDivide.Length}击" + (isLastHit ? " [最后一击]" : " [中间击]") + "\n" + |
| | | $"击数: 第{hurtParam.hitIndex + 1}击 / 共{hurtParam.skillSkinConfig.DamageDivide.Length}击" + (isLastHit ? " [最后一击]" : " [中间击]") + "\n" + |
| | | $"\n" + |
| | | $"========== 目标受伤数据 ==========\n" + |
| | | $"伤害: {currentHitDamage} / 总伤害: {totalDamage}\n" + |
| | |
| | | if (moveFinished) |
| | | { |
| | | // 如果技能有动画(SkillMotionName不为空),需要等待动画播放完成 |
| | | if (skillConfig != null && !string.IsNullOrEmpty(skillConfig.SkillMotionName)) |
| | | if (skillSkinConfig != null && !string.IsNullOrEmpty(skillSkinConfig.SkillMotionName)) |
| | | { |
| | | if (!isMotionCompleted) |
| | | { |
| | |
| | | return false; |
| | | } |
| | | |
| | | if (string.IsNullOrEmpty(skillConfig.SkillMotionName)) |
| | | if (string.IsNullOrEmpty(skillSkinConfig.SkillMotionName)) |
| | | { |
| | | return true; |
| | | } |