/// <summary> /// 范围伤害(扇形) /// </summary> /// <param name="attacker">攻击者数据</param> /// <param name="effectKey">范围特效</param> /// <param name="targetPos">目标位置</param> /// <param name="scopeRaduis">范围半径</param> /// <param name="openAngle">扇形角度</param> /// <param name="rotate">旋转角度(0度为z轴正方向)</param> /// <param name="durTime">持续时间</param> /// <param name="callback">结束回调</param> /// <param name="callbackForEveryOne">每个受击单位的回调</param> /// <returns></returns> public IGeneralAttack GetPositionSectorScopeGeneralAttack(PositionObject attacker, string effectKey, Vector3 targetPos, float scopeRaduis, float openAngle, float rotate, float durTime, Action callback, Action <GameObject> callbackForEveryOne = null) { IGeneralAttack result = null; // 创建图形 var graphics = new SectorGraphics(new Vector2(targetPos.x, targetPos.z), rotate, scopeRaduis, openAngle); result = new PositionScopeGeneralAttack(attacker, effectKey, targetPos, graphics, durTime, callback, callbackForEveryOne); return(result); }
/// <summary> /// 生成行为单元 /// </summary> /// <returns>行为单元对象</returns> public override IFormula GetFormula(FormulaParamsPacker paramsPacker) { if (paramsPacker == null) { return(null); } IFormula result = null; // 替换替换符的数据 ReplaceData(paramsPacker); // 数据本地化 var myReceivePos = ReceivePos; var myTargetCamps = TargetCamps; var clusterData = paramsPacker.ReleaseMember.ClusterData; var myFormulaType = FormulaType; var myScopeType = ScopeType; var myTargetCount = TargetCount; var myIsFollowDir = IsFollowDir; // 目标权重筛选数据 var targetSelectData = TargetSelectDataId > 0 ? new SelectWeightData(SData_armyaim_c.Single.GetDataOfID(TargetSelectDataId)) : null; result = new Formula((callback, scope) => { // 检测范围 ICollisionGraphics graphics = null; var pos = Utils.V3ToV2WithouY(GetPosByType(myReceivePos, paramsPacker, scope)); var plusAngle = 0f; if (myIsFollowDir) { plusAngle = Utils.GetAngleWithZ(clusterData.Direction); } // 获取图形对象 switch (myScopeType) { case GraphicType.Circle: // 圆形 graphics = new CircleGraphics(pos, Arg1); break; case GraphicType.Rect: // 矩形 graphics = new RectGraphics(pos, Arg1, Arg2, Arg3 + plusAngle); break; case GraphicType.Sector: // 扇形 graphics = new SectorGraphics(pos, Arg3 + plusAngle, Arg1, Arg2); break; } // 获取周围单位DisplayOwner列表 var packerList = FormulaParamsPackerFactroy.Single.GetFormulaParamsPackerList(graphics, paramsPacker.StartPos, myTargetCamps, paramsPacker.Skill, paramsPacker.TargetMaxCount); // 根据权重数据筛选目标 if (targetSelectData != null) { packerList = TargetSelecter.TargetFilter(targetSelectData, clusterData, packerList); // 对他们释放技能(技能编号) if (packerList != null) { var counter = 0; var completeCount = 0; var allCount = packerList.Count; foreach (var packer in packerList) { // 如果设置了数量上限, 并且超过数量上限则跳出 if (myTargetCount > 0 && counter >= myTargetCount) { break; } // 执行子行为链 if (SubFormulaItem != null) { var subSkill = new SkillInfo(packer.SkillNum); FormulaParamsPackerFactroy.Single.CopyPackerData(paramsPacker, packer); subSkill.DataList = packer.DataList; subSkill.AddActionFormulaItem(SubFormulaItem); //subSkill.GetFormula(packer); SkillManager.Single.DoSkillInfo(subSkill, packer, true, () => { // 执行完成, 回调 completeCount++; if (completeCount >= myTargetCount || completeCount >= allCount) { callback(); } }); } counter++; } } } }, myFormulaType); return(result); }