170 likes | 306 Vues
This article explores the application of Finite State Machines (FSMs) in representing non-player characters (NPCs) within game design. It discusses how NPCs can operate in various states, controlled by stimuli and energy levels, impacting their actions such as chasing or patrolling. Examples like the Guardbot and Pac-Man illustrate state behavior, transitions, and the implementation of emotional FSMs, enhancing realism in gameplay. Techniques for structuring FSMs with classes, methods, and state management are examined to create dynamic, responsive NPCs in games.
E N D
Artificial Intelligence in Game Design Representing NPCs as Finite State Machines
Finite State Machines • Non-player character in one of several possible states • Must be some initial state • That state controls actions taken by the NPC • Transitions to other states caused by internal/external stimuli Another State Current StateActions incurrent state Stimuli Another State Stimuli
“Guardbot” Example Chase Move towards player Energy = Energy - 1 PatrolMove back and forth in front of door Energy at 100% Player visible Player not visible Energy below 50% ReturnMove towards door Energy = Energy - 1 At door
Finite State Machines • Note: Each state can be reflex agentExample: “fight” state Fight Player swings Raise shield Player waits Swing sword Player moves Move towards player Run Hit points < 5
Designing FSMs • What different things does NPC do? • Types of action taken • Chase, wander, etc. • Steps in some process • Get food from fridge Cook food eat food • Can include “terminal” state • Object destroyed and deallocated ReturnMove towards door Energy = Energy - 1 Energy == 0 Dead
Implementing FSMs • Can treat each state like a C++/Java class • Possibly derived from some base “State” class • Typical methods in class: • Enter()Executed once when state enteredExample: entering “Fight” state causes NPC to select weapon • Exit()Executed before go to another state Example: exiting “Guard door” state causes NPC to lock door
Implementing FSMs • Typical methods in class: • Update()Executed by the game engine each framewhile NPC in this stateExample: reflex actions taken by NPC in “Fight” state • int CheckTransitions() • Executed by the game engine each framewhile NPC in this state • Returns the number of the next state to enter based on current stimuli (same as current state if no change)
Implementing FSMs class Chase extends State { int stateNumber = 1; // Patrol = 0, Return = 2 public: void Enter() {say(“intruder alert”);} void Exit() {say(“intruder has escaped”);} void Update() { moveTowards(player.getLocation); if (rand() < 0.3) say (“exterminate”); energyLevel--; } int checkTransitions() { if (energyLevel <= distance(location(door.getLocation)) || distance(location(door.getLocation)) > 10) return 2; else return 1; } }
Emotional FSMs • States represent emotions for character • Actions express emotion • Stimuli change emotional state Player HP < 10 Confident Angry Small hit by player Heavy hit by player Heavy hit by me My HP < 10 Frightened
Emotional FSMs • Can combine with action states appropriate to emotion • Looks more realistic if orc displays fear before running Player HP < 10 Confident Angry Small hit by player Heavy hit by player Heavy hit by me My HP < 10 Frightened My HP < 5 Running
Emotional FSMs • NPC must clearly express emotional state • Facial expression (difficult in low resolution) • Body language • Posture, motion, etc. • Sound (speakers must be on) • Spoken phrases • Sounds (growl, etc.) • Abilities • Strong emotion might make character less accurate!
Timeouts in FSMs • Problem: Abrupt transitions in FSMsExample: • As player approaches, NPC jumps back and forth between “Walk around” and “Run” states Player < 5 feet away Player >= 5 feet away
Timeouts in FSMs • Solution: State “timeouts” • Continue high-emotion states for fixed amount of time after stimulus gone • Keep running for time even after at safe distance • Supported by evidence from biology Stay in running state for at least 10 seconds even in player not close
Timeouts in FSMs class Run extends State { int timeout;void Update() { Flee(player.getLocation()); if (distance(location, player.getLocation()) < 5) timeout = 10; // run for 10 frames even after escape) }int CheckTransitions() { if (timeout > 0) { timeout--; return 1; // stay in run state } else return 0; // go to walk around state }
Weaknesses of FSMs • Abrupt transitions between emotional states • Confident Terrified not a realistic transition • May need more intermediate statesConfident Worried Terrified • Multiple next states may be indicated by stimuli • Must make sure all are mutually exclusive Attack Chasing Within 1 unit Return Energy < 10