FSMSystem class represents the Finite State Machine class. It has a List with the States the NPC has and methods to add, delete a state, and to change the current state the Machine is on.
コード例 #1
0
ファイル: NPCControl.cs プロジェクト: AlbertWjw/Voxel-Game
    //建造状态机
    private void MakeFSM()
    {
        InspectionState inspection = new InspectionState();

        inspection.AddTransition(Transition.SawPlayer, StateID.ChasingPlayer);
        inspection.AddTransition(Transition.LostPlayer, StateID.FollowingPath);

        PatrolState follow = new PatrolState(transform.position, scope);

        follow.AddTransition(Transition.SawPlayer, StateID.ChasingPlayer);
        follow.AddTransition(Transition.ArrivePath, StateID.Inspection);

        ChasePlayerState chase = new ChasePlayerState();

        chase.AddTransition(Transition.LostPlayer, StateID.FollowingPath);
        chase.AddTransition(Transition.NearPlayer, StateID.AttackPlayer);

        AttackPlayerState attack = new AttackPlayerState();

        attack.AddTransition(Transition.LostPlayer, StateID.FollowingPath);

        fsm = new FsmSystem();
        fsm.AddState(inspection);//添加状态到状态机,第一个添加的状态将作为初始状态
        fsm.AddState(follow);
        fsm.AddState(chase);
        fsm.AddState(attack);
    }
コード例 #2
0
ファイル: AttackTarget.cs プロジェクト: luoshujie/Chess
 public AttackTarget(PersonBase myself, FsmSystem fsmSystem, Animator _anim)
 {
     myPerson = myself;
     stateID  = StateID.Attack;
     Fsm      = fsmSystem;
     anim     = _anim;
 }
コード例 #3
0
        private void InitSystems()
        {
            _systemsManager = new SystemsManager();
            _systemsManager.Push(new PlayerInputHandlingSystem(IntentProvider, _configurationService));
            _systemsManager.Push(new CommandHandlingSystem());
            _systemsManager.Push(new SpriteDrawingSystem(ContentManager, SpriteBatch));
            _systemsManager.Push(new AnimationSystem(_configurationService.GetFps()));
            _systemsManager.Push(new MoveToScreenPositionSystem());
            _systemsManager.Push(new TileEventsSystem());

            var fsmSystem = new FsmSystem();

            fsmSystem.RegisterHandler(new PlayerIdleHandler(ContentManager, InputMapProvider));
            fsmSystem.RegisterHandler(new PlayerMovingHandler(InputMapProvider));
            fsmSystem.RegisterHandler(new PlayerDeadHandler());
            fsmSystem.RegisterHandler(new TileDestroyedHandler());
            fsmSystem.RegisterHandler(new TileTouchedHandler());
            fsmSystem.RegisterHandler(new EndOpenHandler());
            _systemsManager.Push(fsmSystem);

            _systemsManager.Peek <PlayerInputHandlingSystem>().SetActive(true);
            _systemsManager.Peek <CommandHandlingSystem>().SetActive(true);
            _systemsManager.Peek <SpriteDrawingSystem>().SetActive(true);
            _systemsManager.Peek <AnimationSystem>().SetActive(true);
            _systemsManager.Peek <MoveToScreenPositionSystem>().SetActive(true);
            _systemsManager.Peek <FsmSystem>().SetActive(true);
            _systemsManager.Peek <TileEventsSystem>().SetActive(true);
        }
コード例 #4
0
 public override void Reason()
 {
     if (!PlayerInAttackRange()) // 超出攻击范围
     {
         FsmSystem.ChangeStateTo <NPCChasePlayerState>();
     }
 }
コード例 #5
0
 public MoveToTarget(PersonBase mySelf, FsmSystem fsmSystem, Animator _anim)
 {
     myPerson = mySelf;
     stateID  = StateID.MoveToTarget;
     Fsm      = fsmSystem;
     anim     = _anim;
 }
コード例 #6
0
ファイル: RunState.cs プロジェクト: zzhehe/3DDemo
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        Player player = gameObject.GetComponent <Player>();

        if (Input.GetKeyDown(KeyCode.Space))
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_JUMP);
        }

        if (Mathf.Abs(player.h) == 0 && Mathf.Abs(player.v) == 0)
        {
            fsmSystem.IsCanChange = true;
            if (player.IsInBattle)
            {
                fsmSystem.ChangeState(StateType.FSM_ATTACKIDLE);
            }
            else
            {
                fsmSystem.ChangeState(StateType.FSM_IDLE);
            }
        }
        if (Input.GetMouseButton(0))
        {
            if (player.IsInBattle)
            {
                fsmSystem.IsCanChange = true;
                fsmSystem.ChangeState(StateType.FSM_ATTACK);
            }
        }
    }
コード例 #7
0
    // Use this for initialization
    void Start()
    {
        hearts        = new GameObject[3];
        bulletDisplay = new GameObject[3];

        fsm = new FsmSystem();
        fsm.AddState(new FsmState(FsmStateId.Player)
                     .WithUpdateAction(PlayerUpdate)
                     .WithTransition(FsmTransitionId.Complete, FsmStateId.Bullets)
                     );
        fsm.AddState(new FsmState(FsmStateId.Bullets)
                     .WithBeforeEnteringAction(BulletProcess)
                     .WithTransition(FsmTransitionId.Complete, FsmStateId.Monster)
                     );
        fsm.AddState(new FsmState(FsmStateId.Monster)
                     .WithBeforeEnteringAction(MonsterProcess)
                     .WithTransition(FsmTransitionId.Complete, FsmStateId.Player)
                     );

        GenLevel();

        // add the health display
        for (int i = 0; i < 3; i++)
        {
            bulletDisplay [i] = (GameObject)Instantiate(spriteHolder, new Vector3(i + 3, map.sy, 0), Quaternion.identity);
            bulletDisplay [i].GetComponent <SpriteRenderer> ().sprite = bulletV;
            bulletDisplay [i].GetComponent <SpriteRenderer> ().color  = Color.grey;
            hearts [i] = (GameObject)Instantiate(spriteHolder, new Vector3(i, map.sy, 0), Quaternion.identity);
            hearts [i].GetComponent <SpriteRenderer> ().sprite = heart;
            hearts [i].GetComponent <SpriteRenderer> ().color  = Color.red;
        }

        // center the camera on the game
        Camera.main.transform.position = new Vector3(map.sx / 2, map.sy / 2, -10);
    }
コード例 #8
0
 public override void Reason()
 {
     if (PlayerInView()) //npc看到玩家, 开始追逐玩家
     {
         FsmSystem.ChangeStateTo <NPCChasePlayerState>();
     }
 }
コード例 #9
0
        public static void AddState <T>(BaseEntity entity, FsmSystem system, E_StateId stateId)
            where T : FsmState, new()
        {
            T t = new T();

            t.entity = entity;
            system.AddState(t);
        }
コード例 #10
0
 //在构造函数内初始化这两个游戏物体
 public EnemyState(Transform Player, Transform Npc, FsmSystem Fsm)
 {
     player = Player;
     npc    = Npc;
     fsm    = Fsm;
     SetStateName();
     InitDic();
 }
コード例 #11
0
 public void Initialize(FsmSystem fsmSystem, OperateStateBase[] states)
 {
     if (fsmSystem == null)
     {
         throw new Exception("FsmSystem为null");
     }
     this.fsmSystem = fsmSystem;
     fsm            = this.fsmSystem.CreatFsm(this, states);
 }
コード例 #12
0
 public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
 {
     //现在的动画状态
     AnimatorStateInfo currentBaseState = gameObject.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0);
     if (currentBaseState.normalizedTime > 1 && currentBaseState.IsName("Jump"))
     {
         fsmSystem.IsCanChange = true;
         fsmSystem.ChangeState(StateType.FSM_IDLE);
     }
 }
コード例 #13
0
 public override void Reason()
 {
     if (!PlayerInView()) //npc视野失去玩家, 开始巡逻
     {
         FsmSystem.ChangeStateTo <NPCPatrollingState>();
     }
     else if (PlayerInAttackRange()) // 玩家进入npc攻击范围
     {
         FsmSystem.ChangeStateTo <NPCAttackPlayerState>();
     }
 }
コード例 #14
0
    // Use this for initialization
    void Start()
    {
        enemyFsm = new FsmSystem();
        FsmStateBase patrol = new PatrolState(player, transform, enemyFsm);
        FsmStateBase trace  = new TraceState(player, transform, enemyFsm);
        FsmStateBase attack = new AttackState(player, transform, enemyFsm);

        enemyFsm.AddState(patrol);
        enemyFsm.AddState(trace);
        enemyFsm.AddState(attack);
    }
コード例 #15
0
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        Player player = gameObject.GetComponent <Player>();
        //
        AnimatorStateInfo currentBaseState = gameObject.GetComponent <Animator>().GetCurrentAnimatorStateInfo(1);

        if (currentBaseState.normalizedTime > 1 && (currentBaseState.IsName("Jab") || currentBaseState.IsName("Jab 0")))
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_ATTACKIDLE);
        }
    }
コード例 #16
0
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        GameObject player = GameObject.FindGameObjectWithTag("Player");

        float distance = (player.transform.position - gameObject.transform.position).magnitude;

        if (distance > 5)
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.EnemyPatrol);
        }
    }
コード例 #17
0
 public override void OnInitalization()
 {
     GameProcess = new FsmSystem();
     GameProcess.RegisterFsmState <StateGameEnd>();
     GameProcess.RegisterFsmState <StateGamePlaying>();
     GameProcess.RegisterFsmState <StateGameReady>();
     GameProcess.RegisterFsmState <StateGamePlayback>();
     GameProcess.RegisterFsmState <StateGameInfoInit>();
     GameProcess.RegisterFsmState <StateGameContinue>();
     GameProcess.RegisterFsmState <StateGameReconnect>();
     GameProcess.RegisterFsmState <StateGameSceneInit>();
 }
コード例 #18
0
ファイル: Main.cs プロジェクト: Bramvanelderen10/tribotsmash
    void Start()
    {
        _fsm = FsmSystem <MenuStates> .Initialize(this);

        foreach (var obj in _menus)
        {
            _fsm.AddState(obj, obj.State);
        }
        _fsm.Push(MenuStates.Main);

        PlayerSettings.Instance.OnNameChange = UpdateName;
        UpdateName();
    }
コード例 #19
0
    private void MakeFSM()
    {
        fsm = new FsmSystem <StateID>();
        NormalMove crawl = new NormalMove(this);

        fsm.addState(StateID.CRAWL, crawl);

        StealMode steal = new StealMode(this);

        fsm.addState(StateID.STEAL, steal);

        fsm.init(StateID.CRAWL);
    }
コード例 #20
0
        /// <summary>
        /// 这里的状态不是指的AI,而是不同的状态下,播放不同的动作,接受不同的输入,有不同的行为
        /// </summary>
        /// <returns></returns>
        public static FsmSystem CreateFsmSystem(BaseEntity entity)
        {
            FsmSystem fsmSystem = new FsmSystem(entity);

            AddState <EntityIdleState>(entity, fsmSystem, E_StateId.idle);
            AddState <EntityAttackState>(entity, fsmSystem, E_StateId.attack);
            AddState <EntitySleepState>(entity, fsmSystem, E_StateId.sleep);
            AddState <EntityMoveState>(entity, fsmSystem, E_StateId.move);
            AddState <EntityDieState>(entity, fsmSystem, E_StateId.die);
            AddState <EntitySkillState>(entity, fsmSystem, E_StateId.skill);
            AddState <EntityHurtState>(entity, fsmSystem, E_StateId.hurt);
            fsmSystem.Start();
            return(fsmSystem);
        }
コード例 #21
0
    private void Start()
    {
        EnemyFollowState followState = new EnemyFollowState();

        followState.onFixedUpdateMethod += onUpdateFollowState;
        EnemyPatrolState patrolState = new EnemyPatrolState();

        patrolState.onFixedUpdateMethod += onUpdatePatrolState;

        fsmSystem = new FsmSystem();
        fsmSystem.AddState(followState);
        fsmSystem.AddState(patrolState);
        fsmSystem.ChangeState(StateType.EnemyPatrol);

        enemy  = this.gameObject.GetComponent <EnemyCharacter>();
        player = GameObject.FindGameObjectWithTag("Player");
    }
コード例 #22
0
        public void InitialState()
        {
            Prototype prototype = new Prototype();
            Alpha     alpha     = new Alpha();
            Release   release   = new Release();

            FsmSystem <State> fsm = new FsmSystem <State>();

            fsm.AddTransition(prototype, Transitions.Fix, alpha);
            fsm.AddTransition(alpha, Transitions.Optimize, release);

            fsm.SetInitialState(prototype);

            fsm.PerformTransition(Transitions.Fix);
            fsm.PerformTransition(Transitions.Optimize);

            Assert.AreEqual(fsm.GetCurrentState(), release);
        }
コード例 #23
0
ファイル: AttackWalkState.cs プロジェクト: zzhehe/3DDemo
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        Player player = gameObject.GetComponent <Player>();


        if (Mathf.Abs(player.h) < 0.1f && Mathf.Abs(player.v) < 0.1f)
        {
            fsmSystem.IsCanChange = true;
            if (player.IsInBattle)
            {
                fsmSystem.ChangeState(StateType.FSM_ATTACKIDLE);
            }
            else
            {
                fsmSystem.ChangeState(StateType.FSM_IDLE);
            }
        }
    }
コード例 #24
0
ファイル: PlayerControl.cs プロジェクト: zzhehe/3DDemo
    // Use this for initialization
    void Start()
    {
        player = FindObjectOfType <Player>();

        IdleState idleState = new IdleState();

        idleState.onEnterMethod       += OnEnterIdleState;
        idleState.onUpdateMethod      += OnUpDateIdleState;
        idleState.onFixedUpdateMethod += OnFixedUpDateIdleState;
        RunState runState = new RunState();

        runState.onFixedUpdateMethod += OnFixedUpDateRunState;
        runState.onUpdateMethod      += OnUpDateRunState;
        runState.onEnterMethod       += OnEnterRunState;
        JumpState jumpState = new JumpState();

        jumpState.onEnterMethod += OnEnterJumpState;
        AttackIdleState AttackIdleState = new AttackIdleState();

        AttackIdleState.onEnterMethod  += OnEnterAttackIdleState;
        AttackIdleState.onUpdateMethod += OnUpdateAttackIdleState;

        AttackWalkState attackWalkState = new AttackWalkState();

        attackWalkState.onFixedUpdateMethod += OnFixedUpDateAttackWalkState;
        attackWalkState.onUpdateMethod      += OnUpDateAttackWalkState;
        attackWalkState.onEnterMethod       += OnEnterAttackWalkState;

        AttackDoState attackDoState = new AttackDoState();

        //attackDoState.onFixedUpdateMethod += OnFixedUpDateAttackWalkState;
        attackDoState.onUpdateMethod += OnUpDateAttackDoState;
        attackDoState.onEnterMethod  += OnEnterAttackDoState;

        fsmSystem = new FsmSystem();
        fsmSystem.AddState(idleState);
        fsmSystem.AddState(runState);
        fsmSystem.AddState(jumpState);
        fsmSystem.AddState(AttackIdleState);
        fsmSystem.AddState(attackWalkState);
        fsmSystem.AddState(attackDoState);
        fsmSystem.ChangeState(StateType.FSM_IDLE);
    }
コード例 #25
0
ファイル: AttackIdleState.cs プロジェクト: zzhehe/3DDemo
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        Player            player           = gameObject.GetComponent <Player>();
        AnimatorStateInfo currentBaseState = gameObject.GetComponent <Animator>().GetCurrentAnimatorStateInfo(1);

        if (player.IsInBattle && Mathf.Abs(player.h) > 0.1f || Mathf.Abs(player.v) > 0.1f)
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_ATTACKWALK);
        }

        if (!player.IsInBattle && Mathf.Abs(player.h) > 0.1f || Mathf.Abs(player.v) > 0.1f)
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_RUN);
        }

        if (Mathf.Abs(player.h) < 0.1f && Mathf.Abs(player.v) < 0.1f)
        {
            //如果离敌人距离过远
            if (true)
            {
                if (!stateChanging)
                {
                    player.StartCoroutine(DelayToInvokeDo(() => {
                        fsmSystem.IsCanChange = true;
                        player.IsInBattle     = false;
                        stateChanging         = false;
                        Debug.Log("进入攻击准备状态");
                        fsmSystem.ChangeState(StateType.FSM_IDLE);
                    }, 5.0f));
                    stateChanging = true;
                }
            }
        }

        if (Input.GetMouseButton(0))
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_ATTACK);
        }
    }
コード例 #26
0
ファイル: Master.cs プロジェクト: luoshujie/Chess
        private void InitFSMSystem()
        {
            fsm = new FsmSystem();

            SeekTarget seekTarget = new SeekTarget(this, fsm, anim);

            seekTarget.AddTransition(Transition.MoveToTarget, StateID.MoveToTarget);
            seekTarget.AddTransition(Transition.Attack, StateID.Attack);

            MoveToTarget moveToTarget = new MoveToTarget(this, fsm, anim);

            moveToTarget.AddTransition(Transition.SeekTarget, StateID.SeekTarget);
            moveToTarget.AddTransition(Transition.Attack, StateID.Attack);

            AttackTarget attackTarget = new AttackTarget(this, fsm, anim);

            attackTarget.AddTransition(Transition.SeekTarget, StateID.SeekTarget);
            attackTarget.AddTransition(Transition.MoveToTarget, StateID.MoveToTarget);

            fsm.AddState(seekTarget);
            fsm.AddState(moveToTarget);
            fsm.AddState(attackTarget);
        }
コード例 #27
0
    public override void TriggerEvent(FsmSystem fsmSystem, GameObject gameObject)
    {
        Player player = gameObject.GetComponent <Player>();

        if (Mathf.Abs(player.h) > 0.1f || Mathf.Abs(player.v) > 0.1f)
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_RUN);
        }


        if (Input.GetKeyDown(KeyCode.Space))
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_JUMP);
        }

        if (Input.GetKeyDown(KeyCode.Z))
        {
            fsmSystem.IsCanChange = true;
            fsmSystem.ChangeState(StateType.FSM_ATTACKIDLE);
        }
    }
コード例 #28
0
 public void SetOwner(FsmSystem _fsm)
 {
     machine = _fsm;
 }
コード例 #29
0
 /*
  * private void OnAddLabelToAutoLocaList(UILabel label, string locaCode)
  * {
  *
  *  log.DebugMS("OnAddLabelToAutoLocaList - locaCode: " + locaCode);
  *  // translate directly, no language switching supported anyway
  *  label.text = Loca.Get(locaCode);
  * }
  */
 public void ChangeState(string stateName, object onEnterParams = null)
 {
     FsmSystem.ChangeState(stateName, onEnterParams);
 }
コード例 #30
0
 public void SetOwner(FsmSystem _fsm)
 {
     machine = _fsm;
 }
コード例 #31
0
    // Use this for initialization
    void Start()
    {
        hearts = new GameObject[3];
        bulletDisplay = new GameObject[3];

        fsm = new FsmSystem ();
        fsm.AddState (new FsmState (FsmStateId.Player)
            .WithUpdateAction (PlayerUpdate)
            .WithTransition (FsmTransitionId.Complete, FsmStateId.Bullets)
        );
        fsm.AddState (new FsmState (FsmStateId.Bullets)
            .WithBeforeEnteringAction (BulletProcess)
            .WithTransition (FsmTransitionId.Complete, FsmStateId.Monster)
        );
        fsm.AddState (new FsmState (FsmStateId.Monster)
            .WithBeforeEnteringAction (MonsterProcess)
            .WithTransition (FsmTransitionId.Complete, FsmStateId.Player)
        );

        GenLevel ();

        // add the health display
        for (int i = 0; i < 3; i++) {
            bulletDisplay [i] = (GameObject)Instantiate (spriteHolder, new Vector3 (i+3, map.sy, 0), Quaternion.identity);
            bulletDisplay [i].GetComponent<SpriteRenderer> ().sprite = bulletV;
            bulletDisplay [i].GetComponent<SpriteRenderer> ().color = Color.grey;
            hearts [i] = (GameObject)Instantiate (spriteHolder, new Vector3 (i, map.sy, 0), Quaternion.identity);
            hearts [i].GetComponent<SpriteRenderer> ().sprite = heart;
            hearts [i].GetComponent<SpriteRenderer> ().color = Color.red;
        }

        // center the camera on the game
        Camera.main.transform.position = new Vector3 (map.sx / 2, map.sy / 2, -10);
    }
コード例 #32
0
 public AttackState(Transform Player, Transform Npc, FsmSystem Fsm) : base(Player, Npc, Fsm)
 {
 }