Exemplo n.º 1
0
    /// <summary>
    /// 初始化状态机时,构造一个状态机
    /// </summary>
    void ConstructFSM()
    {
        FSM = new FSMSystem();

        AttackState attackState = new AttackState(gameObject);

        attackState.AddTransition(Transition.LostEnemy, StateID.Wander);

        MoveToState moveToState = new MoveToState(gameObject, MoveTarget);

        moveToState.AddTransition(Transition.ReadyToAttack, StateID.Attack);
        moveToState.AddTransition(Transition.LostEnemy, StateID.Wander);

        WanderState wanderState = new WanderState(gameObject, wanderPoints);

        wanderState.AddTransition(Transition.SawEnemy, StateID.MoveTo);
        wanderState.AddTransition(Transition.SawItem, StateID.MoveTo);



        FSM.AddState(attackState);
        FSM.AddState(wanderState);
        FSM.AddState(moveToState);



        FSM.start(StateID.Wander);
    }
Exemplo n.º 2
0
    private void MakeFSM()
    {
        WanderState wander = new WanderState();

        wander.AddTransition(Transition.SawPlayer, StateID.Flee);

        FleeState flee = new FleeState();

        flee.AddTransition(Transition.NoPlayer, StateID.Wander);

        fsm = new FSMSystem();

        fsm.AddState(wander);
        fsm.AddState(flee);
    }
Exemplo n.º 3
0
    private void MakeFSM()
    {
        WanderState wander = new WanderState();

        wander.AddTransition(Transition.SawPlayer, StateID.Fighting);

        FightingState fight = new FightingState();

        fight.AddTransition(Transition.LostPlayer, StateID.Wander);

        fsm = new FSMSystem();

        fsm.AddState(wander);
        fsm.AddState(fight);
    }
    private void makeFSM()
    {
        fsm = new FSMSystem();

        WanderState wanderState = new WanderState(gameObject, Vector3.forward * speed,
                                                  NpcType.PlayerBot, detectRange, guntipPosition);

        wanderState.AddTransition(Transition.Wander_Attack, StateID.EnemyAttackStateID);

        attackState = new AttackState(guntipPosition, Vector3.forward * speed,
                                      Resources.Load("Prefabs/shot_prefab") as GameObject, id);
        attackState.Target = GameManager.Instance.Player;
        attackState.AddTransition(Transition.Attack_Wander, StateID.EnemyWanderStateID);

        fsm.AddState(wanderState);
        fsm.AddState(attackState);
    }
Exemplo n.º 5
0
    public override void Init()
    {
        base.Init();
        wanderState     = new WanderState(this);
        hideState       = new HideState(this);
        retreatState    = new Retreat(this, enemyObj.health.maxHealth);
        refillAmmoState = new RefifllAmmo(this);
        stunnedState    = new StunnedState(this);

        hideState.AddTransition(() =>
        {
            if (hideState.doneHiding)
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Ok, done hiding");
                return(true);
            }
            return(false);
        }, wanderState);

        //Will look for healthpack if health is not at max
        wanderState.AddTransition(() =>
        {
            if (enemyObj.health.GetHealth() < enemyObj.health.maxHealth)
            {
                var packs = GameManager.Instance.GetAvailableHealthPacks();
                if (packs.Count > 0)
                {
                    if (stateMachine.GetCurrentState() != retreatState)
                    {
                        retreatState.allPacks = packs.ToArray();

                        Diagnostic.Instance.AddLog(enemyObj.gameObject, "Low health, got nothing to do, going to get some");
                        return(true);
                    }
                }
            }
            return(false);
        }, retreatState);

        //Will look for healthpack if health is not at max
        wanderState.AddTransition(() =>
        {
            if (enemyObj.rifle.Ammo < enemyObj.rifle.MaxAmmo)
            {
                var packs = GameManager.Instance.GetAvailableAmmoPacks();
                if (packs.Count > 0)
                {
                    if (stateMachine.GetCurrentState() != refillAmmoState)
                    {
                        refillAmmoState.allPacks = packs.ToArray();

                        Diagnostic.Instance.AddLog(enemyObj.gameObject, "Low ammo, got nothing to do, going to get some");
                        return(true);
                    }
                }
            }
            return(false);
        }, refillAmmoState);

        retreatState.AddTransition(() =>
        {
            var packs = GameManager.Instance.GetAvailableHealthPacks();
            //If the health was restored, or no packs available  go back wandering
            if (enemyObj.health.GetHealth() >= enemyObj.health.maxHealth ||
                enemyObj.health.GetHealth() < enemyObj.health.maxHealth && packs.Count == 0)
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Feeling better, going to stroll around...");
                return(true);
            }

            return(false);
        }, wanderState);

        refillAmmoState.AddTransition(() =>
        {
            var packs = GameManager.Instance.GetAvailableAmmoPacks();
            //If the health was restored, or no packs available  go back wandering
            if (enemyObj.rifle.Ammo >= enemyObj.rifle.MaxAmmo ||
                enemyObj.rifle.Ammo < enemyObj.rifle.MaxAmmo && packs.Count == 0)
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Feeling better, going to stroll around...");
                return(true);
            }

            return(false);
        }, wanderState);

        stunnedState.AddTransition(() =>
        {
            if (!stunnedState.isStunned)
            {
                return(true);
            }

            return(false);
        },
                                   hideState);

        stateMachine.SetState(wanderState);
    }
Exemplo n.º 6
0
    public override void Init()
    {
        base.Init();
        wanderState        = new WanderState(this);
        shootState         = new ShootState(this, enemyObj.shootRate);
        investigationState = new InvestigateState(this);
        stunnedState       = new StunnedState(this);
        meleeAttackState   = new MeleeAttackState(this);
        refillAmmoState    = new RefifllAmmo(this);
        retreatState       = new Retreat(this, minHealthForRetreat);

        qMark = Resources.Load <Sprite>("StateIcons\\what");

        wanderState.AddTransition(() =>
        {
            if (enemyObj.enemySight.IsPlayerInSight() && enemyObj.rifle.Ammo > 0)
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "See the player, shooting!");

                return(true);
            }
            return(false);
        }, shootState);

        wanderState.AddTransition(() =>
        {
            if (enemyObj.rifle.Ammo <= 0)
            {
                var packs = GameManager.Instance.GetAvailableAmmoPacks();
                if (packs.Count > 0)
                {
                    if (stateMachine.GetCurrentState() != refillAmmoState)
                    {
                        refillAmmoState.allPacks = packs.ToArray();
                        Diagnostic.Instance.AddLog(enemyObj.gameObject, "No ammo, got nothing to do, going to get some");
                        return(true);
                    }
                }
            }
            return(false);
        }, refillAmmoState);

        wanderState.AddTransition(() =>
        {
            if (enemyObj.health.GetHealth() < minHealthForRetreat)
            {
                var packs = GameManager.Instance.GetAvailableHealthPacks();
                if (packs.Count > 0)
                {
                    if (stateMachine.GetCurrentState() != retreatState)
                    {
                        retreatState.allPacks = packs.ToArray();

                        Diagnostic.Instance.AddLog(enemyObj.gameObject, "Low health, got nothing to do, going to get some");
                        return(true);
                    }
                }
            }
            return(false);
        }, retreatState);

        wanderState.AddTransition(() =>
        {
            if (enemyObj.rifle.Ammo <= 0)
            {
                var packs = GameManager.Instance.GetAvailableAmmoPacks();
                if (packs.Count > 0)
                {
                    if (stateMachine.GetCurrentState() != refillAmmoState)
                    {
                        Diagnostic.Instance.AddLog(enemyObj.gameObject, "No ammo, got nothing to do, going to get some");
                        return(true);
                    }
                }
            }
            return(false);
        }, refillAmmoState);

        wanderState.AddTransition(() =>
        {
            if (enemyObj.enemySight.IsPlayerInSight() && enemyObj.rifle.Ammo <= 0)
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "See the player, no ammo, will attack with hands!");

                return(true);
            }
            return(false);
        }, meleeAttackState);

        refillAmmoState.AddTransition(() =>
        {
            if (enemyObj.rifle.Ammo > 0)
            {
                if (refillAmmoState.playerLastKnowsPosition == null)
                {
                    Diagnostic.Instance.AddLog(enemyObj.gameObject, "Go ammo, don't know where player is, will wander around");
                    return(true);
                }
            }

            return(false);
        }, wanderState);

        refillAmmoState.AddTransition(() =>
        {
            if (enemyObj.enemySight.IsPlayerInSight())
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Saw player, no time for refill ammo, attack!");
                return(true);
            }

            return(false);
        }, meleeAttackState);

        retreatState.AddTransition(() =>
        {
            if (enemyObj.enemySight.IsPlayerInSight())
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Saw player, no time for get healthpack, attack!");
                return(true);
            }

            return(false);
        }, shootState);

        retreatState.AddTransition(() =>
        {
            //If the health was restored OR health is low but no packs available, go back wandering
            if (enemyObj.health.GetHealth() > minHealthForRetreat ||
                (enemyObj.health.GetHealth() <= minHealthForRetreat && GameManager.Instance.GetAvailableHealthPacks().Count == 0))
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Feeling better, going to stroll around...");
                return(true);
            }

            return(false);
        }, wanderState);

        shootState.AddTransition(() =>
        {
            if (!enemyObj.enemySight.IsPlayerInSight())
            {
                investigationState.waitBeforeGoingToPoint = 0;
                investigationState.investigationPoint     = Player.Instance.transform.position;
                shootTimer = 15.0f;
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "Lost sight of player, going to check last known psition (and keep shooting, why not)");

                return(true);
            }
            return(false);
        }, investigationState);

        shootState.AddTransition(() => {
            return(enemyObj.rifle.Ammo <= 0);
        }, meleeAttackState);

        meleeAttackState.AddTransition(() => {
            if (meleeAttackState.playerLastKnownPosition != null)
            {
                investigationState.investigationPoint = meleeAttackState.playerLastKnownPosition.Value;
                return(true);
            }

            return(false);
        }, investigationState);

        investigationState.AddTransition(() => {
            if (enemyObj.enemySight.IsPlayerInSight())
            {
                Diagnostic.Instance.AddLog(enemyObj.gameObject, "See the player, shooting!");

                return(true);
            }
            return(false);
        }, shootState);

        investigationState.AddTransition(() => {
            return(investigationState.done);
        }, wanderState);

        stunnedState.AddTransition(() =>
        {
            if (!stunnedState.isStunned)
            {
                investigationState.investigationPoint = enemyObj.transform.position;

                return(true);
            }

            return(false);
        },
                                   investigationState);


        //Beserk will respond to alarm
        Enemy.OnAlarmSent += GoInsestigateSOS;
        stateMachine.SetState(wanderState);
    }