Пример #1
0
    /// <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);
    }
Пример #2
0
    /// <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));
    }
Пример #3
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);
    }
Пример #4
0
    /// <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);
    }