/// <summary> /// 如果当选择目标是空的话,则选择一个怪物 /// </summary> public void Update() { selectTime -= Time.deltaTime; if (selectTime < 0 && iGameState.SelectTargetModel == EnumSelectTargetModel.SelectMonster && iPlayerState.SelectObj == null && iPlayerState.PlayerObj != null) { selectTime = 2;//两秒检测一次 //选择一个最近的怪物 GameObject selectObj = iMonsterCollection.GetMonsters(iPlayerState.PlayerObj, -1, 20).FirstOrDefault(); iPlayerState.SelectObj = selectObj; } //在选择模式下如果选择的目标距离超出则取消当前锁定的怪物 if (iGameState.SelectTargetModel == EnumSelectTargetModel.SelectMonster && iPlayerState.SelectObj != null && iPlayerState.PlayerObj != null) { float dis = Vector3.Distance(iPlayerState.SelectObj.transform.position, iPlayerState.PlayerObj.transform.position); if (dis > 20) { iPlayerState.SelectObj = null; selectTime = 0; } } }
/// <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()); }