/// <summary>
    /// 初始化
    /// </summary>
    /// <param name="attacker">攻击者数据</param>
    /// <param name="effectKey">子弹预设key(或path)</param>
    /// <param name="releasePos">子弹飞行起点</param>
    /// <param name="targetObj">子弹目标单位</param>
    /// <param name="scopeRaduis">范围半径</param>
    /// <param name="speed">子弹飞行速度</param>
    /// <param name="durTime">范围特效持续时间</param>
    /// <param name="taType">子弹飞行轨迹</param>
    /// <param name="callback">攻击结束回调</param>
    /// <param name="callbackForEveryOne">每个单位被击回调</param>
    public PointToObjScopeGeneralAttack(PositionObject attacker,
                                        string[] effectKey,
                                        Vector3 releasePos,
                                        GameObject targetObj,
                                        float scopeRaduis,
                                        float speed,
                                        float durTime,
                                        TrajectoryAlgorithmType taType,
                                        Action callback,
                                        Action <GameObject> callbackForEveryOne = null)
    {
        if (attacker == null)
        {
            //throw new Exception("攻击者集群数据为空");
            return;
        }
        var key1 = effectKey[0];
        var key2 = effectKey[1];
        // 范围伤害
        Action scopeDemage = () =>
        {
            var positionScopeAttack = new PositionScopeGeneralAttack(attacker, key2, targetObj.transform.position, scopeRaduis,
                                                                     durTime, callback, callbackForEveryOne);
            positionScopeAttack.Begin();
        };

        var effectData    = attacker.AllData.EffectData;
        var muzzleEffect  = effectData.MuzzleFlashEffect;
        var muzzleDurTime = effectData.MuzzleFlashEffectTime;

        if (muzzleDurTime > 0)
        {
            // 对每个单位播受击特效
            var muzzleAngle = Utils.GetAngleWithZ(attacker.MapCellObj.transform.forward);
            // TODO 使用挂点
            EffectsFactory.Single.CreatePointEffect(muzzleEffect,
                                                    ParentManager.Single.GetParent(ParentManager.BallisticParent).transform,
                                                    attacker.MapCellObj.transform.position,
                                                    new Vector3(1, 1, 1),
                                                    muzzleDurTime,
                                                    0,
                                                    null,
                                                    Utils.EffectLayer,
                                                    new Vector2(0, muzzleAngle)).Begin();
        }

        // 飞行轨迹
        effect = EffectsFactory.Single.CreatePointToObjEffect(key1,
                                                              ParentManager.Single.GetParent(ParentManager.BallisticParent).transform,
                                                              releasePos,
                                                              targetObj,
                                                              new Vector3(1, 1, 1),
                                                              speed,
                                                              taType,
                                                              scopeDemage,
                                                              Utils.EffectLayer);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 创建连线特效
    /// </summary>
    /// <param name="effectKey">特效Key</param>
    /// <param name="parent">特效父级</param>
    /// <param name="receiveObj">结束对象</param>
    /// <param name="durTime">持续时间</param>
    /// <param name="completeCallback">结束回调</param>
    /// <param name="effectLayer">特效渲染层级</param>
    /// <returns></returns>
    public EffectBehaviorAbstract CreateLinerEffect(string effectKey,
                                                    Transform parent,
                                                    GameObject receiveObj,
                                                    float durTime,
                                                    Action completeCallback = null,
                                                    int effectLayer         = 0)
    {
        EffectBehaviorAbstract result = null;

        result = new LinerEffect(effectKey, parent, receiveObj, durTime, completeCallback, effectLayer);

        return(result);
    }
Ejemplo n.º 3
0
    /// <summary>
    /// 创建点对点特效
    /// 特效会从start按照速度与轨迹飞到目标对象位置
    /// </summary>
    /// <returns>特效对象</returns>
    public EffectBehaviorAbstract CreatePointToObjEffect(string effectKey,
                                                         Transform parent,
                                                         Vector3 position,
                                                         GameObject targetObj,
                                                         Vector3 scale,
                                                         float speed,
                                                         TrajectoryAlgorithmType flytype = TrajectoryAlgorithmType.Line,
                                                         Action completeCallback         = null,
                                                         int effectLayer = 0)
    {
        EffectBehaviorAbstract result = null;

        result = new PointToTargetEffect(effectKey, parent, position, targetObj, scale, speed, flytype, completeCallback, effectLayer);

        return(result);
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 生成行为节点
    /// </summary>
    /// <param name="paramsPacker">数据包装类</param>
    /// <returns>行为节点</returns>
    public override IFormula GetFormula(FormulaParamsPacker paramsPacker)
    {
        if (paramsPacker == null)
        {
            return(null);
        }

        // 替换替换符数据
        ReplaceData(paramsPacker);
        // 数据本地化

        var      myFormulaType = FormulaType;
        var      myReleasePos  = ReleasePos;
        var      myReceivePos  = ReceivePos;
        IFormula result        = null;

        result = new Formula((callback, scope) =>
        {
            // 获取目标位置
            var sourcePos = GetPosByType(myReleasePos, paramsPacker, scope);
            var targetPos = GetPosByType(myReceivePos, paramsPacker, scope);

            EffectBehaviorAbstract effect = null;
            if (ReceivePos == 3)
            {
                effect = EffectsFactory.Single.CreateLinerEffect(EffectKey,
                                                                 // TODO 应该使用挂点
                                                                 paramsPacker.ReleaseMember.ClusterData.transform
                                                                 , paramsPacker.ReceiverMenber.ClusterData.gameObject
                                                                 , DurTime, callback, Utils.EffectLayer);
            }
            else
            {
                effect = EffectsFactory.Single.CreateLinerEffect(EffectKey,
                                                                 ParentManager.Instance().GetParent(ParentManager.BallisticParent).transform,
                                                                 sourcePos, targetPos, DurTime, callback, Utils.EffectLayer);
            }

            effect.Begin();
        }, myFormulaType);



        return(result);
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 创建点特效
    /// 特效只在一个位置上
    /// </summary>
    /// <param name="effectKey"></param>
    /// <param name="parent"></param>
    /// <param name="position"></param>
    /// <param name="scale"></param>
    /// <param name="durTime"></param>
    /// <param name="speed"></param>
    /// <param name="completeCallback">完成回调</param>
    /// <param name="effectLayer">特效所在渲染层</param>
    /// <param name="rotate">x,y旋转量</param>
    /// <returns>特效对象</returns>
    public EffectBehaviorAbstract CreatePointEffect(string effectKey,
                                                    Transform parent,
                                                    Vector3 position,
                                                    Vector3 scale,
                                                    float durTime,
                                                    float speed,
                                                    Action completeCallback = null,
                                                    int effectLayer         = 0,
                                                    Vector2 rotate          = new Vector2())
    {
        EffectBehaviorAbstract result = null;

        result = new PointEffect(effectKey,
                                 parent,
                                 position,
                                 scale,
                                 durTime,
                                 speed,
                                 completeCallback,
                                 effectLayer,
                                 rotate);

        return(result);
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="attacker">攻击者数据</param>
    /// <param name="beAttackMember">被攻击者数据</param>
    /// <param name="effectKey">子弹预设key(或path)</param>
    /// <param name="releasePos">子弹飞行起点</param>
    /// <param name="targetObj">子弹目标单位</param>
    /// <param name="speed">子弹飞行速度</param>
    /// <param name="taType">子弹飞行轨迹</param>
    /// <param name="callback">攻击结束回调</param>
    public NormalGeneralAttack(PositionObject attacker,
                               PositionObject beAttackMember,
                               string effectKey,
                               Vector3 releasePos,
                               GameObject targetObj,
                               float speed,
                               TrajectoryAlgorithmType taType,
                               Action <GameObject> callback)
    {
        if (attacker == null || beAttackMember == null)
        {
            //throw new Exception("被攻击者或攻击者数据为空");
            return;
        }
        // 特效数据
        var    effectData = beAttackMember.AllData.EffectData;
        Action demage     = () =>
        {
            //var attackerDisplayOwner = FightUnitManager.Single.GetElementByPositionObject(attacker);
            //var beAttackerDisplayOwner = FightUnitManager.Single.GetElementByPositionObject(beAttackMember);

            //if (beAttackerDisplayOwner == null
            //    || attackerDisplayOwner == null
            //    || null == beAttackerDisplayOwner.ClusterData)
            //{
            //    return;
            //}
            // 判断是否命中
            //var isMiss = HurtResult.AdjustIsMiss(attackerDisplayOwner, beAttackerDisplayOwner);
            //if (!isMiss)
            //{
            //    // 计算伤害
            //    // TODO 伤害计算加入Buff与技能的计算
            //    //var hurt = HurtResult.GetHurt(attackerDisplayOwner, beAttackerDisplayOwner);
            //    //// 记录被击触发 记录扣血 伤害结算时结算
            //    //SkillManager.Single.SetTriggerData(new TriggerData()
            //    //{
            //    //    HealthChangeValue = hurt,
            //    //    ReceiveMember = attackerDisplayOwner,
            //    //    ReleaseMember = beAttackerDisplayOwner,
            //    //    TypeLevel1 = TriggerLevel1.Fight,
            //    //    TypeLevel2 = TriggerLevel2.BeAttack,
            //    //    DemageType = DemageType.NormalAttackDemage,
            //    //    IsCrit = HurtResult.IsCrit
            //    //});
            //    //// 命中时检测技能
            //    //SkillManager.Single.SetTriggerData(new TriggerData()
            //    //{
            //    //    // 将造成的伤害带回
            //    //    HealthChangeValue = hurt,
            //    //    ReceiveMember = beAttackerDisplayOwner,
            //    //    ReleaseMember = attackerDisplayOwner,
            //    //    TypeLevel1 = TriggerLevel1.Fight,
            //    //    TypeLevel2 = TriggerLevel2.Hit,
            //    //    DemageType = DemageType.NormalAttackDemage
            //    //});

            //    var getHitEffect = effectData.GetHitByBulletEffect;
            //    var getHitDurTime = 0f;
            //    // 分辨特效类型
            //    switch (effectData.BulletType)
            //    {
            //        case 1:
            //            getHitEffect = effectData.GetHitByBulletEffect;
            //            getHitDurTime = effectData.GetHitByBulletEffectTime;
            //            break;

            //        case 2:
            //            getHitEffect = effectData.GetHitByBombEffect;
            //            getHitDurTime = effectData.GetHitByBombEffectTime;
            //            break;
            //    }
            //    if (getHitDurTime > 0)
            //    {
            //        // 对每个单位播受击特效
            //        // 计算旋转角度
            //        var beAttackAngle = Utils.GetAngleWithZ(attacker.MapCellObj.gameObject.transform.forward) + 180;
            //        // TODO 使用挂点
            //        EffectsFactory.Single.CreatePointEffect(getHitEffect,
            //            ParentManager.Single.GetParent(ParentManager.BallisticParent).transform,
            //            beAttackMember.MapCellObj.transform.position,
            //            new Vector3(1, 1, 1),
            //            getHitDurTime,
            //            0,
            //            null,
            //            Utils.EffectLayer,
            //            new Vector2(0, beAttackAngle)).Begin();
            //    }
            //}
            //else
            //{
            //    //// 闪避时事件
            //    //SkillManager.Single.SetTriggerData(new TriggerData()
            //    //{
            //    //    ReceiveMember = attackerDisplayOwner,
            //    //    ReleaseMember = beAttackerDisplayOwner,
            //    //    TypeLevel1 = TriggerLevel1.Fight,
            //    //    TypeLevel2 = TriggerLevel2.Dodge
            //    //});
            //    //var beAttackVOBase = beAttackerDisplayOwner.ClusterData.AllData.MemberData;
            //    // 抛出miss事件
            //    //FightManager.Single.DoHealthChangeAction(beAttackerDisplayOwner.GameObj, beAttackVOBase.TotalHp,
            //    //    beAttackVOBase.CurrentHP, 0f, FightManager.HurtType.Miss, beAttackVOBase.ObjID.ObjType);

            //}
        };

        // 枪口火焰
        var muzzleEffect  = effectData.MuzzleFlashEffect;
        var muzzleDurTime = effectData.MuzzleFlashEffectTime;

        if (muzzleDurTime > 0)
        {
            // 对每个单位播枪口火焰特效
            // 计算角度
            var muzzleAngle = Utils.GetAngleWithZ(attacker.MapCellObj.transform.forward);
            // TODO 使用挂点
            EffectsFactory.Single.CreatePointEffect(muzzleEffect,
                                                    ParentManager.Single.GetParent(ParentManager.BallisticParent).transform,
                                                    attacker.MapCellObj.transform.position,
                                                    new Vector3(1, 1, 1),
                                                    muzzleDurTime,
                                                    0,
                                                    null,
                                                    Utils.EffectLayer,
                                                    new Vector2(0, muzzleAngle)).Begin();
        }


        Action action = () =>
        {
            if (callback != null && beAttackMember != null)
            {
                callback(beAttackMember.MapCellObj);
            }
        };


        effect = EffectsFactory.Single.CreatePointToObjEffect(effectKey,
                                                              ParentManager.Single.GetParent(ParentManager.BallisticParent).transform,
                                                              releasePos,
                                                              targetObj,
                                                              new Vector3(1, 1, 1),
                                                              speed,
                                                              taType,
                                                              demage + action,
                                                              Utils.EffectLayer);
    }