Example #1
0
    /// <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);
    }
Example #2
0
    /// <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);
    }