/// <summary> /// triggerId转stateId /// </summary> /// <param name="id">SoldierTriggerID</param> /// <returns>SoldierStateID</returns> public static SoldierStateID GetStateIdByTrigger(SoldierTriggerID id) { switch (id) { case SoldierTriggerID.RuChang: return(SoldierStateID.RuChang); case SoldierTriggerID.Xingjin: return(SoldierStateID.Xingjin); case SoldierTriggerID.Zhunbeizhandou: return(SoldierStateID.Zhunbeizhandou); case SoldierTriggerID.PutongGongji: return(SoldierStateID.PutongGongji); case SoldierTriggerID.JinengGongji: return(SoldierStateID.JinengGongji); case SoldierTriggerID.SiWang: return(SoldierStateID.SiWang); case SoldierTriggerID.ZhuiJi: return(SoldierStateID.ZhuiJi); case SoldierTriggerID.DaiJi: return(SoldierStateID.DaiJi); } return(SoldierStateID.NullState); }
/// <summary> /// stateId转FSMState类type /// </summary> /// <param name="id">SoldierTriggerID</param> /// <returns>FSMState类Type</returns> public static Type GetTriggerTypeByTriggerId(SoldierTriggerID id) { switch (id) { case SoldierTriggerID.RuChang: return(typeof(RuChangTrigger)); case SoldierTriggerID.Xingjin: return(typeof(XingjinTrigger)); case SoldierTriggerID.Zhunbeizhandou: return(typeof(ZhunbeizhandouTrigger)); case SoldierTriggerID.PutongGongji: return(typeof(PutongGongjiTrigger)); case SoldierTriggerID.JinengGongji: return(typeof(JinengGongjiTrigger)); case SoldierTriggerID.SiWang: return(typeof(SiwangTrigger)); case SoldierTriggerID.ZhuiJi: return(typeof(ZhuiJiTrigger)); case SoldierTriggerID.DaiJi: return(typeof(DaiJiTrigger)); } return(typeof(RuChangTrigger)); }
///// <summary> ///// 添加状态 转换和状态id必须成对存在 且唯一 ///// </summary> ///// <param name="trigger"></param> ///// <param name="id"></param> //public void AddTrigger(SoldierTriggerID trigger, SoldierStateID id)//增加关联对(转换,状态ID) //{ // //-----------------------------验证参数的合法性----------------------------------- // if (dict.ContainsKey(trigger)) // { // Debug.LogError("SoldierFSMState ERROR: SoldierTriggerID" + id + " 已经存在" + trigger); // return; // } // dict.Add(trigger, id); // ////通过转换反射出对应的触发器再把触发器添加到触发器列表 // //Type type = Type.GetType(trigger + "Trigger"); // //SoldierFSMTrigger fsmtrigger = Activator.CreateInstance(type) as SoldierFSMTrigger; // //_fsmTrriggerList.Add(fsmtrigger); // //SoldierFSMFactory.GetTrigger(trigger, _fsmTrriggerList); //} /// <summary> /// 添加映射trigger /// </summary> /// <param name="triggerId">被映射TriggerId</param> /// <param name="triggerFunc">trigger具体行为</param> public void AddMappingTrigger(SoldierTriggerID triggerId, Func <SoldierFSMSystem, bool> triggerFunc) { var triggerType = SoldierFSMFactory.GetTriggerTypeByTriggerId(triggerId); var triggerInvoke = (SoldierFSMTrigger)triggerType.InvokeMember("", BindingFlags.Public | BindingFlags.CreateInstance, null, null, null); triggerInvoke.CheckTriggerFunc = triggerFunc; _fsmTrriggerList.Add(triggerInvoke); }
/// <summary> /// 获取对应行为类型的trigger检测方法 /// </summary> /// <param name="triggerId">trigger类型</param> /// <param name="behaviorType">行为类型</param> /// <returns>检测方法</returns> public static Func <SoldierFSMSystem, bool> GetTriggerFuncByBehaviorType(SoldierTriggerID triggerId, int behaviorType) { Func <SoldierFSMSystem, bool> result = null; switch (behaviorType) { // 常规士兵类型 case SoldierFSMFactory.SoldierType: { // -------------------------------常规士兵类型----------------------------- switch (triggerId) { case SoldierTriggerID.RuChang: // -----------------------入场------------------------------ result = (fsm) => { return(false); }; break; case SoldierTriggerID.Xingjin: // -----------------------行进------------------------------ result = (fsm) => { if (fsm.Display.ClusterData.AllData.MemberData.CurrentHP <= 0) { return(false); } switch (fsm.CurrentStateID) { case SoldierStateID.RuChang: case SoldierStateID.DaiJi: return(fsm.IsCanRun); //case SoldierStateID.PutongGongji: //case SoldierStateID.JinengGongji: // return fsm.TargetIsLoseEfficacy; //case SoldierStateID.ZhuiJi: // return !fsm.IsZhuiJi; } return(false); }; break; case SoldierTriggerID.Zhunbeizhandou: // -----------------------准备战斗------------------------------ result = (fsm) => { // 状态检查路由 switch (fsm.CurrentStateID) { // 行进追击切准备战斗 case SoldierStateID.Xingjin: case SoldierStateID.ZhuiJi: case SoldierStateID.DaiJi: { return(ZhunbeizhandouTrigger.CheckChangeState(fsm)); } // 技能攻击/普通攻击切准备战斗 case SoldierStateID.PutongGongji: { //Debug.Log("普通攻击检测技能释放"); // 检测是否有技能可释放 return(ZhunbeizhandouTrigger.CheckSkillRelease(fsm)); } } return(false); }; break; case SoldierTriggerID.PutongGongji: // -----------------------普通攻击------------------------------ result = (fsm) => { switch (fsm.CurrentStateID) { case SoldierStateID.Zhunbeizhandou: return(fsm.IsCanInPutonggongji); } return(false); }; break; case SoldierTriggerID.JinengGongji: // -----------------------技能攻击------------------------------ result = (fsm) => { // 当前单位技能释放判断 switch (fsm.CurrentStateID) { case SoldierStateID.Zhunbeizhandou: return(fsm.IsCanInJinenggongji); default: return(false); } }; break; case SoldierTriggerID.SiWang: // -----------------------死亡------------------------------ result = (fsm) => { return(fsm.Display.ClusterData.AllData.MemberData.CurrentHP <= 0); }; break; case SoldierTriggerID.ZhuiJi: result = ZhuiJiTrigger.Check; break; case SoldierTriggerID.DaiJi: result = (fsm) => { // 状态检查路由 switch (fsm.CurrentStateID) { // 行进追击切准备战斗 case SoldierStateID.Xingjin: case SoldierStateID.ZhuiJi: { return(ZhunbeizhandouTrigger.CheckChangeState(fsm)); } // 技能攻击/普通攻击切准备战斗 case SoldierStateID.PutongGongji: case SoldierStateID.JinengGongji: { return(fsm.TargetIsLoseEfficacy); } } return(false); }; break; } } break; // 防御塔类型 case SoldierFSMFactory.TurretType: { // --------------------------------防御塔类型------------------------------------ switch (triggerId) { case SoldierTriggerID.RuChang: // -----------------------入场------------------------------ result = (fsm) => { return(false); }; break; case SoldierTriggerID.Zhunbeizhandou: // -----------------------准备战斗------------------------------ result = (fsm) => { // 状态检查路由 switch (fsm.CurrentStateID) { // 行进追击切准备战斗 case SoldierStateID.DaiJi: { return(ZhunbeizhandouTrigger.CheckNormalAttack(fsm)); } // 技能攻击/普通攻击切准备战斗 case SoldierStateID.PutongGongji: { return(false); } } return(false); }; break; case SoldierTriggerID.PutongGongji: // -----------------------普通攻击------------------------------ result = (fsm) => { switch (fsm.CurrentStateID) { case SoldierStateID.Zhunbeizhandou: return(fsm.IsCanInPutonggongji); } return(false); }; break; case SoldierTriggerID.SiWang: // -----------------------死亡------------------------------ result = (fsm) => { return(fsm.Display.ClusterData.AllData.MemberData.CurrentHP <= 0); }; break; case SoldierTriggerID.DaiJi: result = (fsm) => { // 状态检查路由 switch (fsm.CurrentStateID) { // 行进追击切准备战斗 case SoldierStateID.RuChang: { return(true); } // 技能攻击/普通攻击切准备战斗 case SoldierStateID.PutongGongji: { return(fsm.TargetIsLoseEfficacy); } } return(false); }; break; } } break; // 基地类型 case SoldierFSMFactory.BaseType: { // -----------------------------------基地类型--------------------------------- switch (triggerId) { case SoldierTriggerID.RuChang: // -----------------------入场------------------------------ result = (fsm) => { return(false); }; break; case SoldierTriggerID.DaiJi: //-----------------------待机------------------------------ result = (fsm) => { // 切待机状态 return(true); }; break; case SoldierTriggerID.SiWang: // -----------------------死亡------------------------------ result = (fsm) => { return(fsm.Display.ClusterData.AllData.MemberData.CurrentHP <= 0); }; break; } } break; // 地雷类型 case SoldierFSMFactory.MineType: { // ----------------------------------地雷类型--------------------------------- switch (triggerId) { case SoldierTriggerID.RuChang: // -----------------------入场------------------------------ result = (fsm) => { return(false); }; break; case SoldierTriggerID.Zhunbeizhandou: // -----------------------准备战斗------------------------------ result = (fsm) => { // 状态检查路由 switch (fsm.CurrentStateID) { // 行进追击切准备战斗 case SoldierStateID.RuChang: case SoldierStateID.DaiJi: case SoldierStateID.ZhuiJi: { return(ZhunbeizhandouTrigger.CheckChangeState(fsm)); } // 技能攻击/普通攻击切准备战斗 case SoldierStateID.JinengGongji: { return(false); } } return(false); }; break; case SoldierTriggerID.JinengGongji: // -----------------------技能攻击------------------------------ result = (fsm) => { // 当前单位技能释放判断 switch (fsm.CurrentStateID) { case SoldierStateID.Zhunbeizhandou: return(fsm.IsCanInJinenggongji); default: return(false); } }; break; case SoldierTriggerID.SiWang: // -----------------------死亡------------------------------ result = (fsm) => { return(fsm.Display.ClusterData.AllData.MemberData.CurrentHP <= 0); }; break; } } break; } return(result); }