// /// <summary> /// 使用技能 /// </summary> /// <param name="useSkillIdex">使用的技能在当前生物可用技能表中的下标</param> public virtual bool ToUseSkill(int useSID) { //技能冷却、MP判定 if (Logic.time - SkillLastFireTime[useSID] < curSkillDataList[useSID].CoolingTime) { return(false); //技能未冷却 } if (curCreatureData.curMP < curSkillDataList[useSID].CostMP) { return(false); //MP不足 } //询问状态机状态是否能够改变 if (!curFSM.ChangeState(curSkillDataList[useSID].StateName)) { return(false); //不可更改为当前技能; } //更改当前正在释放的技能为请求释放的技能 curSID = useSID; //技能进入冷却时间 SkillReset(curSID); curCreatureData.curMP -= curSkillDataList[useSID].CostMP; //--------------------------------攻击属性---------------------------------------------------------------- foreach (var t in curSkillDataList[useSID].ATKs) { SkillAttackType e = t; timer.Add((Logic.time + e.SkillAttackJudgeBeginTime, delegate() { MeleeMultiplayerAttack(e); })); } //--------------------------------BUFF属性---------------------------------------------------------------- foreach (var t in curSkillDataList[useSID].BUFFs) { SkillBUFFType e = t; timer.Add((Logic.time + e.BeginTime, delegate(){ for (int i = 0; i < e.RoleTimes; i++) { int j = i; BUFFtimer.Add((Logic.time + e.BeginTime + j * e.EachRoleTime, delegate() { if ((e.RoleAttribute & 1) != 0) { HPRecover(e.EffectValue); //curCreatureData.curHP += e.EffectValue; //if(curCreatureData.curHP>curCreatureData.maxMP) curCreatureData.curHP = curCreatureData.maxHP; } if ((e.RoleAttribute & 2) != 0) { MPRecover(e.EffectValue); //curCreatureData.curMP += e.EffectValue; //if(curCreatureData.curMP>curCreatureData.maxMP) curCreatureData.curMP = curCreatureData.maxMP; } if ((e.RoleAttribute & 4) != 0) { //curCreatureData.Speed *= e.EffectRatio>1?0:(1-e.EffectRatio); SpeedChange(e.EffectRatio); } if ((e.RoleAttribute & 8) != 0) { //curCreatureData.Defence *= e.EffectRatio>1?0:(1-e.EffectRatio); DefenceChange(e.EffectRatio); } if ((e.RoleAttribute & 16) != 0) { //curCreatureData.Attack *= e.EffectRatio>1?0:(1-e.EffectRatio); AttackChange(e.EffectRatio); } })); if (e.IfRecycle) { BUFFtimer.Add((Logic.time + e.BeginTime + e.RoleTimes * e.EachRoleTime, delegate() { if ((e.RoleAttribute & 1) != 0) { HPRecover(-e.EffectValue * e.RoleTimes); //curCreatureData.curHP -= e.EffectValue*e.RoleTimes; } if ((e.RoleAttribute & 2) != 0) { MPRecover(-e.EffectValue * e.RoleTimes); //curCreatureData.curMP -= e.EffectValue*e.RoleTimes; } if ((e.RoleAttribute & 4) != 0) { //curCreatureData.Speed *= e.EffectRatio>1?0:(1-e.EffectRatio); SpeedChange(-e.EffectRatio); } if ((e.RoleAttribute & 8) != 0) { //curCreatureData.Defence *= e.EffectRatio>1?0:(1-e.EffectRatio); DefenceChange(-e.EffectRatio); } if ((e.RoleAttribute & 16) != 0) { //curCreatureData.Attack *= e.EffectRatio>1?0:(1-e.EffectRatio); AttackChange(-e.EffectRatio); } })); } } })); } //--------------------------------子弹属性---------------------------------------------------------------- foreach (var t in curSkillDataList[useSID].Bullets) { SkillBulletType e = t; timer.Add((Logic.time + e.BulletFireTime, delegate() { BulletsManager.CreateBullet(name, e); })); } //--------------------------------位移属性---------------------------------------------------------------- foreach (var t in curSkillDataList[useSID].MOVEs) { SkillMoveType e = t; for (float i = 0; i < e.DuringTime; i += Logic.eachframtime) { timer.Add((Logic.time + e.BeginTime + i, delegate() { Move(e.Speed); //float angle = 15.0f * dir; //float f = (float)(angle*Math.PI/180.0f); //pos += (new Vector3((float)Math.Sin(f),0,(float)Math.Cos(f)))*((float)(e.Speed*Logic.eachframtime)); //rot = new Vector3(0,15.0f*dir,0); })); } } //curSkillStage = (0,0,0); //技能释放成功 //Debug.Log("use skill " + useSID); return(true); }