示例#1
0
 /// <summary>
 /// 技能状态发生变化
 /// </summary>
 /// <param name="iSkillState"></param>
 /// <param name="fieldName"></param>
 private void ISkillStateChanged(ISkillState iSkillState, string fieldName)
 {
     //组合技能改变
     if (string.Equals(fieldName, GameState.Instance.GetFieldName <ISkillState, SkillBaseStruct[]>(temp => temp.CombineSkills)))
     {
         ChangeSpriteLattice();
     }
     //释放技能
     else if (string.Equals(fieldName, GameState.Instance.GetFieldName <ISkillState, bool>(temp => temp.IsSkillStartHolding)))
     {
         ChangeHoldingImage();
     }
     //蓄力时间
     else if (string.Equals(fieldName, GameState.Instance.GetFieldName <ISkillState, float>(temp => temp.SkillStartHoldingTime)))
     {
         ChangeHoldingImage();
     }
     //公共冷却时间
     else if (string.Equals(fieldName, GameState.Instance.GetFieldName <ISkillState, float>(temp => temp.PublicCoolingTime)))
     {
         ChangeSpriteLattice();
     }
     //技能冷却时间
     else if (string.Equals(fieldName, GameState.Instance.GetFieldName <ISkillState, Func <int, float> >(temp => temp.GetSkillRuntimeCoolingTime)))
     {
         ChangeSpriteLattice();
     }
 }
    /// <summary>
    /// 造成伤害
    /// </summary>
    /// <param name="attackHurtStruct"></param>
    public override CalculateHurt.Result GiveAttackHurtStruct(AttackHurtStruct attackHurtStruct)
    {
        IPlayerState        iPlayerState        = GameState.Instance.GetEntity <IPlayerState>();
        IAttributeState     playerAttribute     = iPlayerState.GetResultAttribute();
        PhysicDefenseFactor physicDefenseFactor = new PhysicDefenseFactor()//物理防御系数
        {
            CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.physicDefenseToHurtRateRatio,
            ImmunityInjury = iPlayerState.SelfRoleOfRaceInfoStruct.physicQuickToHurtExemptRatio
        };
        MagicDefenseFactor magicDefenseFactor = new MagicDefenseFactor() //魔法防御系数
        {
            CoefficientRatioReducingDamageFactor = iPlayerState.SelfRoleOfRaceInfoStruct.magicDefenseToHurtRateRatio
        };

        CalculateHurt.Result calculateHurtResult = CalculateHurt.Calculate(attackHurtStruct, playerAttribute, physicDefenseFactor, magicDefenseFactor);
        if (calculateHurtResult.hurt >= 0)
        {
            if (calculateHurtResult.hurt != 0)
            {
                //减血(因为这里是整合的属性,必须在外部将自身血量减去)
                iPlayerState.HP -= calculateHurtResult.hurt;
                //终端咏唱
                ISkillState iSkillState = GameState.Instance.GetEntity <ISkillState>();
                iSkillState.GetHitToSkillState();
                //手柄震动
                iPlayerState.SetVibration(0.1f, 0.7f, 0.7f);
            }
            //显示伤害
            base.ShowHurt(calculateHurtResult, iPlayerState.PlayerObj);
        }
        return(calculateHurtResult);
    }
示例#3
0
 /// <summary>
 /// 初始化数据对象
 /// </summary>
 private void InitDataTarget()
 {
     keyContactData  = DataCenter.Instance.GetEntity <KeyContactData>();
     skillStructData = DataCenter.Instance.GetMetaData <SkillStructData>();
     iSkillState     = GameState.Instance.GetEntity <ISkillState>();
     iGameState      = GameState.Instance.GetEntity <IGameState>();
     iPlayerState    = GameState.Instance.GetEntity <IPlayerState>();
 }
示例#4
0
 private void Start()
 {
     GameState.Instance.Registor <ISkillState>(ISkillStateChanged);
     GameState.Instance.Registor <IAttributeState>(IAttributeStateChanged);
     skillStructData = DataCenter.Instance.GetMetaData <SkillStructData>();
     iSkillState     = GameState.Instance.GetEntity <ISkillState>();
     iAttributeState = GameState.Instance.GetEntity <IAttributeState>();
 }
 void Start()
 {
     keyImage        = GetComponent <Image>();
     keyContactData  = DataCenter.Instance.GetEntity <KeyContactData>();
     playerState     = DataCenter.Instance.GetEntity <PlayerState>();
     skillStructData = DataCenter.Instance.GetMetaData <SkillStructData>();
     iSkillState     = GameState.Instance.GetEntity <ISkillState>();
     iPlayerState    = GameState.Instance.GetEntity <IPlayerState>();
     Show();
 }
 public static void ClearSession(this ISkillState state)
 {
     if (state.Session.Attributes == null)
     {
         state.Session.Attributes = new Dictionary <string, object>();
     }
     else
     {
         state.Session.Attributes.Clear();
     }
 }
示例#7
0
        public SkillStateMachine(ISkillEntity iSkillEntity)
        {
            skillPreparingState = new SkillPreparingState(this);
            skillSingingState   = new SkillSingingState(this);
            skillReleasingState = new SkillReleasingState(this);
            skillHittingState   = new SkillHittingState(this);

            //设置技能实体类
            this.iSkillEntity = iSkillEntity;

            //技能状态机初始化状态为skillPreparingState
            this.SetSkillState(skillPreparingState);
        }
    /// <summary>
    /// 根据技能获取粒子的初始化数据
    /// </summary>
    /// <param name="playerObj">对象</param>
    /// <param name="nowIAttributeState">本次计算所使用的状态数据</param>
    /// <param name="skills">技能数组</param>
    /// <returns></returns>
    public ParticalInitParamData[] GetParticalInitParamData(GameObject playerObj, IAttributeState nowIAttributeState, params SkillBaseStruct[] skills)
    {
        List <ParticalInitParamData> resultList            = new List <ParticalInitParamData>();
        ParticalInitParamData        particalInitParamData = default(ParticalInitParamData);
        ISkillState iSkillState = GameState.Instance.GetEntity <ISkillState>();
        PlayerState playerState = DataCenter.Instance.GetEntity <PlayerState>();

        EnumSkillType[] skillTyps = skills.Where(temp => temp != null).Select(temp => temp.skillType).OrderBy(temp => (int)temp).ToArray();
        //耗魔量
        float        holdingRate  = iSkillState.SkillStartHoldingTime / GameState.BaseSkillStartHoldingTime; //计算蓄力程度
        float        maxUseMana   = nowIAttributeState.MaxUseMana;                                           //当前的最大耗魔上限
        float        baseUseMana  = nowIAttributeState.MustUsedBaseMana;                                     //基础耗魔值
        float        thisUsedMana = baseUseMana + maxUseMana * holdingRate;                                  //该技能的耗魔值
        IPlayerState iPlayerState = GameState.Instance.GetEntity <IPlayerState>();

        if (iPlayerState.Mana < thisUsedMana)
        {
            thisUsedMana = iPlayerState.Mana;
        }
        //技能附加的特效(特殊效果和debuff)
        StatusData statusData = DataCenter.Instance.GetMetaData <StatusData>();                                                          //保存特殊状态的数据
        Dictionary <StatusDataInfo.StatusLevelDataInfo, int> statusEffects = new Dictionary <StatusDataInfo.StatusLevelDataInfo, int>(); //特殊效果对应该等级数据与对应等级字典

        foreach (SkillBaseStruct skillBaseStruct in skills)
        {
            if (skillBaseStruct == null)
            {
                continue;
            }
            //选取debuff和特殊效果
            IEnumerable <EnumStatusEffect> enumStatusEffects = skillBaseStruct.skillStatusEffect.Where(temp => (temp > EnumStatusEffect.DebuffStart && temp < EnumStatusEffect.DebuffEnd) || (temp > EnumStatusEffect.SpecialStart && temp < EnumStatusEffect.SpecialEnd));
            foreach (EnumStatusEffect enumStatusEffect in enumStatusEffects)
            {
                StatusDataInfo statusDataInfo = statusData[enumStatusEffect];
                if (statusDataInfo == null)
                {
                    continue;
                }
                int level = 0;
                playerState.SkillPoint.TryGetValue(skillBaseStruct.skillType, out level);
                StatusDataInfo.StatusLevelDataInfo statusLevelDataInfo = statusDataInfo[level];
                if (statusLevelDataInfo != null)
                {
                    if (statusEffects.Count(temp => temp.Key.EffectType == enumStatusEffect) > 0)//如果已经存在相同类型的特效
                    {
                        KeyValuePair <StatusDataInfo.StatusLevelDataInfo, int> tempStatusEffect = statusEffects.FirstOrDefault(temp => temp.Key.EffectType == enumStatusEffect);
                        int nowLevel = tempStatusEffect.Value;
                        if (nowLevel < level)//计算当前存放的特效等级是否高于新加的等级
                        {
                            statusEffects.Remove(tempStatusEffect.Key);
                            statusEffects.Add(statusLevelDataInfo, level);
                        }
                    }
                    else
                    {
                        statusEffects.Add(statusLevelDataInfo, level);
                    }
                }
            }
        }
        StatusDataInfo.StatusLevelDataInfo[] statusLevelDataInfos = statusEffects.Keys.ToArray();
        //这几个是基础数据
        particalInitParamData.position = playerObj.transform.position + playerObj.transform.forward * 0.3f + playerObj.transform.up * 1.5f;
        particalInitParamData.lifeTime = 5;
        particalInitParamData.checkCollisionIntervalTime = 1;
        particalInitParamData.targetObjs = new GameObject[0];
        particalInitParamData.forward    = playerObj.transform.forward;
        particalInitParamData.color      = new Color(0.5f, 0.5f, 0.5f, 0.1f);
        particalInitParamData.layerMask  = LayerMask.GetMask("Monster", "Default");
        //下面的是变化数据
        //颜色
        SkillBaseStruct combine_secondSkill = skills.Where(temp => temp != null).FirstOrDefault(temp => temp.skillType > EnumSkillType.MagicCombinedLevel2Start && temp.skillType < EnumSkillType.MagicCombinedLevel2End);

        if (combine_secondSkill != null)
        {
            switch (combine_secondSkill.skillType)
            {
            case EnumSkillType.YSX01:    //火元素
                particalInitParamData.color = Color.red;
                break;

            case EnumSkillType.YSX02:    //水元素
                particalInitParamData.color = Color.blue;
                break;

            case EnumSkillType.YSX03:    //土元素
                particalInitParamData.color = Color.yellow;
                break;

            case EnumSkillType.YSX04:    //风元素
                particalInitParamData.color = Color.green;
                break;

            case EnumSkillType.SM06:    //冰元素
                particalInitParamData.color = Color.cyan;
                break;

            case EnumSkillType.SM07:    //雷元素
                particalInitParamData.color = new Color(0.5f, 0, 0.5f, 1);
                break;

            case EnumSkillType.DSM03:        //光明元素
            case EnumSkillType.XYX01_Target: //光明信仰基础_对敌军
                particalInitParamData.color = Color.white;
                break;

            case EnumSkillType.DSM04:        //黑暗元素
            case EnumSkillType.XYX02_Target: //黑暗信仰基础_对敌军
                particalInitParamData.color = Color.black;
                break;

            case EnumSkillType.XYX03_Target:    //生物信仰基础_对敌军
                particalInitParamData.color = new Color(0, 1, 0.2f, 1);
                break;

            case EnumSkillType.XYX04_Target:    //自然信仰基础_对敌军
                //颜色选择为当前环境对应的元素
                IEnvironment iEnvironment = GameState.Instance.GetEntity <IEnvironment>();
                switch (iEnvironment.TerrainEnvironmentType)
                {
                case EnumEnvironmentType.Plain:
                    particalInitParamData.color = new Color(0.5f, 0, 0.5f, 1);
                    break;

                case EnumEnvironmentType.Swamp:
                    particalInitParamData.color = Color.blue;
                    break;

                case EnumEnvironmentType.Desert:
                    particalInitParamData.color = Color.yellow;
                    break;

                case EnumEnvironmentType.Forest:
                    particalInitParamData.color = Color.green;
                    break;

                case EnumEnvironmentType.Volcano:
                    particalInitParamData.color = Color.red;
                    break;
                }
                break;
            }
        }
        //技能最基础表现形式
        SkillBaseStruct    combine_firstSkill = skills.Where(temp => temp != null).FirstOrDefault(temp => temp.skillType > EnumSkillType.MagicCombinedLevel1Start && temp.skillType < EnumSkillType.MagicCombinedLevel1End);
        IMonsterCollection iMonsterCollection = GameState.Instance.GetEntity <IMonsterCollection>();
        GameObject         selectTargetObj    = null;//魔力导向选中的对象

        if (combine_firstSkill != null)
        {
            switch (combine_firstSkill.skillType)
            {
            case EnumSkillType.FS01:                          //奥数弹
                particalInitParamData.range             = 20; //表示距离
                particalInitParamData.CollisionCallBack = temp => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                break;

            case EnumSkillType.FS02:                         //奥数震荡
                particalInitParamData.range             = 1; //表示比例
                particalInitParamData.CollisionCallBack = temp => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                particalInitParamData.position          = playerObj.transform.position + playerObj.transform.forward * 2f;
                break;

            case EnumSkillType.FS03:                         //魔力屏障
                particalInitParamData.range             = 1; //表示比例
                particalInitParamData.CollisionCallBack = temp => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                break;

            case EnumSkillType.FS04:    //魔力导向
                //查找前方45度方位内距离自己最近的怪物
                GameObject[] selectObjs = iMonsterCollection.GetMonsters(playerObj, 45, 20);
                if (selectObjs != null && selectObjs.Length > 0)
                {
                    selectTargetObj = selectObjs[0];
                }
                if (selectTargetObj)
                {
                    particalInitParamData.range             = Vector3.Distance(selectTargetObj.transform.position, playerObj.transform.position);//表示距离
                    particalInitParamData.targetObjs        = new GameObject[] { selectTargetObj };
                    particalInitParamData.CollisionCallBack = temp => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                }
                else
                {
                    particalInitParamData.range = 10;
                }
                break;

            case EnumSkillType.MFS05:            //魔力脉冲
                particalInitParamData.range = 1; //表示比例
                if (combine_secondSkill != null)
                {
                    switch (combine_secondSkill.skillType)
                    {
                    case EnumSkillType.YSX03:       //土元素 大地咆哮
                    case EnumSkillType.YSX04:       //风元素 风暴突袭
                    case EnumSkillType.SM06:        //冰元素 寒霜吐息
                        particalInitParamData.position = playerObj.transform.position + playerObj.transform.forward * 1f;
                        break;
                    }
                }
                particalInitParamData.CollisionCallBack = temp => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                break;
            }
        }
        resultList.Add(particalInitParamData);
        //第三阶段的连续魔力导向有点特殊
        SkillBaseStruct combine_thirdSkill = skills.Where(temp => temp != null).FirstOrDefault(temp => temp.skillType > EnumSkillType.MagicCombinedLevel3Start && temp.skillType < EnumSkillType.MagicCombinedLevel3End);

        if (combine_thirdSkill != null && combine_thirdSkill.skillType == EnumSkillType.MFS06)
        {
            //查找周围距离查找到的怪物的最近的怪物
            if (selectTargetObj)
            {
                GameObject[]       nextObjs     = iMonsterCollection.GetMonsters(selectTargetObj, -1, 100);//测试用100 默认是10
                Queue <GameObject> queueNextObj = new Queue <GameObject>();
                queueNextObj.Enqueue(selectTargetObj);
                foreach (var item in nextObjs)
                {
                    queueNextObj.Enqueue(item);
                }
                while (queueNextObj.Count > 1)
                {
                    GameObject            firstObj  = queueNextObj.Dequeue(); //第一个怪物
                    GameObject            secondObj = queueNextObj.Peek();    //第二个怪物
                    ParticalInitParamData temp_particalInitParamData = particalInitParamData;
                    temp_particalInitParamData.forward           = (secondObj.transform.position - firstObj.transform.position).normalized;
                    temp_particalInitParamData.position          = firstObj.transform.position + temp_particalInitParamData.forward;
                    temp_particalInitParamData.range             = Vector3.Distance(firstObj.transform.position, secondObj.transform.position);
                    temp_particalInitParamData.targetObjs        = new GameObject[] { secondObj };
                    temp_particalInitParamData.CollisionCallBack = (temp) => CalculateCombineMagicHurt(nowIAttributeState, temp, thisUsedMana, statusLevelDataInfos, skillTyps);
                    resultList.Add(temp_particalInitParamData);
                }
            }
        }

        return(resultList.ToArray());
    }
示例#9
0
 public void SetSkillState(ISkillState skillState)
 {
     this.skillState = skillState;
 }