///// <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> /// 状态的改变发生在这里 /// </summary> public void CheckTrigger(SoldierFSMSystem fsm) { for (int i = 0; i < _fsmTrriggerList.Count; i++) { //if (_fsmTrriggerList[i].CheckTrigger(fsm)) if (_fsmTrriggerList[i].CheckTriggerFunc(fsm)) { var state = SoldierFSMFactory.GetStateIdByTrigger(_fsmTrriggerList[i].triggerId); fsm.ChangeState(state); //Debug.Log("切换状态:" + state); break; } } }
/// <summary> /// 设置切换映射关系 /// </summary> /// <param name="mapDic">切换关系列表</param> /// <param name="triggerFuncDic">节点具体行为列表</param> public void SetStateMappingConfig(Dictionary <SoldierStateID, List <SoldierStateID> > mapDic, Dictionary <SoldierTriggerID, Func <SoldierFSMSystem, bool> > triggerFuncDic) { if (mapDic == null) { return; } foreach (var kv in mapDic) { var keyType = SoldierFSMFactory.GetStateTypeByStateId(kv.Key); var keyStateInvoke = (SoldierFSMState)keyType.InvokeMember("", BindingFlags.Public | BindingFlags.CreateInstance, null, null, null); foreach (var mapStateId in kv.Value) { // 设置映射关系 keyStateInvoke.AddMappingTrigger(SoldierFSMFactory.GetTriggerByStateId(mapStateId), triggerFuncDic[SoldierFSMFactory.GetTriggerByStateId(mapStateId)]); } // 添加状态 fsm.AddState(keyStateInvoke); } }
/// <summary> /// 初始化行为状态机 /// </summary> /// <param name="behaviorType"></param> public void InitState(int behaviorType) { SetStateMappingConfig(SoldierFSMFactory.GetBehaviorMappingDicById(behaviorType), SoldierFSMFactory.GetTriggerFuncDicById(behaviorType)); }