En AI State Machine kommer i forskellige former og størrelser, men den jeg vælger at arbejde i her er kaldet en (stack) Finite-State-Machine hvilket betyder at State Machinen kan cære præcis EN State ud af et finite antal States.
tænk på en state machine som en stak bøger, men du må kun røre ved, læse eller bruge bogen på toppen af stakken, det smarte her er at en State machine selv kan finde ud af hvilken bog der er på toppen af stakken (fx klokken ringer, fysik er færdig nu skal man have matematik, og State machinen putter så matematik bogen på toppen af stakken)
Min State machine skal helst gerne tjekke hvilken state den skal være i og så gøre hvad den state siger man (i mit tilfælde fjenden) skal gøre.
literaturen såvel som animation, model og material prefabs har jeg anskaffet mig gennem Zenva.com
Min state machine skal gerne kunne:
- Stå stille
- Gå formålsløst rundt.
- Jagte en spiller hvis han/hun kommer for tæt på en fjende.
- Angribe en spiller hvis en fjende kommer helt tæt på spilleren.
Jeg vælger for hver State at have 3 sup states (en aktiv, en startup/OnEnter og en afsluttende/OnExit)
Spillets mål med spillet er at undvige fjenderne og holde mig i live så længe som muligt, mens fjender skal jagte mig hvis jeg kommer for tæt på playeren.
Mit mål her er at lære om teorien af State Machines og at benytte en State Machine i et spil.
Det først jeg gør er at sætte min state machine op, dvs den skal kunne finde den current active state, men inden den begynder at execute Active State skal den execute denne states OnEnter method og skal man skifte state (Push eller Pop) så ved min state machine at den skal kalde den tidligere Active States OnExit Metode inden den nye States OnEnter metode bliver kaldt.
Min player skal ikke have så meget med min state machine at gøre, da min AI her som udgangspunkt er tiltænkt AI enemies, player behøves derfor kun et player script til at håndtere og modtage vector inputs så denne kan bevæge sig.
I Enemy.cs ligger mine forskellige States og bemærk her at hvergang jeg pusher en State til toppen af stakken så ved den fra push state at den modtager statesne i formatten Active, OnEnter, OnExit, derfor er det vigtigt at man har styr på hvilken State man vil have som sin Active State da det er denne som kaldes hver frame, hvorimod OnEnter kaldes én gang umiddelbart før Active begynder at blive kaldt, og OnExit lige som OnEnter kaldes én gang OnExit kaldes dog kun mellem et Active og et OnEnter call.
Mit Enemy.cs script er derfor rigt på if statement som tjekker om State Machinen skal skifte State.
Link til min State machine på github. Se Zipfilerne
