Exemple #1
0
    ///// <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);
    }
Exemple #2
0
 /// <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;
         }
     }
 }
Exemple #3
0
    /// <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);
        }
    }
Exemple #4
0
 /// <summary>
 /// 初始化行为状态机
 /// </summary>
 /// <param name="behaviorType"></param>
 public void InitState(int behaviorType)
 {
     SetStateMappingConfig(SoldierFSMFactory.GetBehaviorMappingDicById(behaviorType),
                           SoldierFSMFactory.GetTriggerFuncDicById(behaviorType));
 }