//向目标地点使用技能 public void UseSkill(List <BattleAction> actions, GridUnit target, BattleSkillAnalysis skillAnalysis) { if (target == null || skillAnalysis == null) { UtilityHelper.LogError("Use skill error, none target or skill"); return; } List <BattleHeroSkillResult> skillResults = new List <BattleHeroSkillResult>(); for (int i = 0; i < skillAnalysis.suitableUnits.Count; ++i) { //范围内的都受到伤害 if (target.Distance(skillAnalysis.suitableUnits[i].mapGrid) <= skillAnalysis.battleSkill.rangeRadius) { skillResults.Add(BattleCalculator.Instance.CalcSingle(this, skillAnalysis.suitableUnits[i], skillAnalysis.battleSkill)); } } //产生使用技能的动作 if (actions != null) { BattleHeroSkillAction action = new BattleHeroSkillAction(this, skillAnalysis.battleSkill.skillID); action.skillResult = skillResults.ToArray(); actions.Add(action); } //产生伤害 for (int i = 0; i < skillResults.Count; ++i) { skillResults[i].battleUnit.AcceptSkillResult(skillResults[i].syncAttribute, actions); } }
//检查是否在攻击范围 private void CheckUnderAttackRadius() { skillAnalysis = BattleCalculator.Instance.AnalyseBattleSkill(this, AISkill); }
//某个战斗单位点击了使用技能 public void BattleUnitUseSkill(BattleUnit battleUnit, SO_BattleSkill skill) { if (battleUnit == null || battleUnit.battleUnitRenderer == null || !battleUnit.battleUnitRenderer.Equals(manualOperatingBattleUnitRenderer)) { UtilityHelper.LogError("Battle unit use skill failed."); UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption); return; } //获取推算的技能释放结果 selectedBattleSkillAnalysis = BattleCalculator.Instance.AnalyseBattleSkill(battleUnit, skill); if (selectedBattleSkillAnalysis == null) { UtilityHelper.LogError("Battle unit use skill failed.Error analyse."); UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption); return; } //显示技能释放范围 if (skill.releaseRadius > 0) { SetCircularRangeRenderStateActive( true, GridRenderType.SkillReleaseRange, battleUnit.mapGrid.row, battleUnit.mapGrid.column, skill.releaseRadius); } //根据类型判断技能显示状态 switch (skill.targetType) { //对单个目标 case BattleSkillTargetType.BattleUnit: //可以被选中的 for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i) { selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selectable); } //不可以被选中的 for (int i = 0; i < selectedBattleSkillAnalysis.distanceLimit.Count; ++i) { selectedBattleSkillAnalysis.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable); } //队伍不合适的 for (int i = 0; i < selectedBattleSkillAnalysis.teamLimit.Count; ++i) { selectedBattleSkillAnalysis.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal); } //设定技能操作类型 skillOperationType = skill.rangeRadius > 0 ? SkillOperationType.SurroundBattleUnit : SkillOperationType.SingleBattleUnitTarget; break; //对范围(某一个位置)目标 case BattleSkillTargetType.GridUnit: //以自身为中心攻击周围目标 if (skill.releaseRadius <= 0) { //可以被选中,标记为已被选中 for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i) { selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected); } //不可以被选中的 for (int i = 0; i < selectedBattleSkillAnalysis.distanceLimit.Count; ++i) { selectedBattleSkillAnalysis.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable); } //队伍不合适的 for (int i = 0; i < selectedBattleSkillAnalysis.teamLimit.Count; ++i) { selectedBattleSkillAnalysis.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal); } skillOperationType = SkillOperationType.SurroundSelf; //省去一步点击操作,直接展示区域 OnBattleUnitAndGridTouched_StateSkill_SurroundSelf(battleUnit.mapGrid, battleUnit); } //需要指定范围,需要点击目标地块 else { skillOperationType = SkillOperationType.GridUnitTarget; } break; default: break; } //切换操作状态 manualOperationState = ManualOperationState.Skill; UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption); }