private void Start() { fsm = new FiniteStateMachine("AITest FSM"); IdleState = fsm.AddState("IdleState"); ScanState = fsm.AddState("ScanState"); PatrolState = fsm.AddState("WanderState"); PatrolAction = new WanderAction(PatrolState); IdleAction = new IdleAction(IdleState); ScanAction = new ScanningAction(ScanState); deathState = fsm.AddState("DeathState"); DeathAction = new DeathState(deathState); //This adds the actions to the state and add state to it's transition map PatrolState.AddAction(PatrolAction); IdleState.AddAction(IdleAction); PatrolState.AddTransition("ToIdle", IdleState); IdleState.AddTransition("ToPatrol", PatrolState); ScanState.AddTransition("ToScanning", ScanState); deathState.AddTransition("ToDeath", deathState); PatrolAction.Init(target, 3.0f, gameObject.GetComponent <EnemyAstar>(), "ToIdle"); IdleAction.Init(target, "AI on Idle", 3.0f, gameObject.GetComponent <EnemyAstar>(), "ToPatrol"); DeathAction.Init(3.0f, gameObject.GetComponent <EnemyAstar>()); ScanAction.Init(3.0f); fsm.StartMachine("IdleState"); }
// Start is called before the first frame update void Awake() { damage = enemyPreset.damage; moveTime = enemyPreset.moveTime; idleTimeMin = enemyPreset.idleTimeMin; idleTimeMax = enemyPreset.idleTimeMax; wanderRadius = enemyPreset.wanderRadius; home = transform.position; trigger = GetComponentInChildren <DetectPlayer>(); trigger.GetComponent <SphereCollider>().radius = enemyPreset.detectionRadius; navMeshAgent = GetComponent <NavMeshAgent>(); navMeshAgent.speed = enemyPreset.speed; fsm = new FSM("MeleeAI FSM"); WanderState = fsm.AddState("WanderState"); IdleState = fsm.AddState("IdleState"); AlertState = fsm.AddState("AlertState"); MeleeState = fsm.AddState("MeleeState"); WanderAction = new WanderAction(WanderState); IdleAction = new TextAction(IdleState); alertAction = new AlertAction(AlertState); meleeAction = new MeleeAction(MeleeState); WanderState.AddAction(WanderAction); IdleState.AddAction(IdleAction); AlertState.AddAction(alertAction); MeleeState.AddAction(meleeAction); WanderState.AddTransition("ToIdle", IdleState); WanderState.AddTransition("PlayerDetect", AlertState); IdleState.AddTransition("ToWander", WanderState); IdleState.AddTransition("PlayerDetect", AlertState); AlertState.AddTransition("ToIdle", IdleState); AlertState.AddTransition("ToMelee", MeleeState); MeleeState.AddTransition("ToAlert", AlertState); WanderAction.Init(this.transform, home, navMeshAgent, wanderRadius, moveTime, "ToIdle"); IdleAction.Init("Idling", Random.Range(idleTimeMin, idleTimeMax), "ToWander"); alertAction.Init(trigger, navMeshAgent, "ToIdle"); meleeAction.Init(this.transform, damage, trigger, FindObjectOfType <PlayerManager>(), "ToAlert"); fsm.Start("IdleState"); }