using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum Transition
{
SeePlayer,
NearPlayer,
LostPlayer,
Dead
}
public enum State
{
Chase,
Attack,
Patrol,
Dead
}
public class FSMManager : FSM {
private List<FSMState> stateList = new List<FSMState>();
private FSMState curFSMState;
private State curState;
private AnimationManagerEnemy _anim;
public void AddFSMState(FSMState state)
{
if (stateList.Count == 0)
{
stateList.Add(state);
curFSMState = state;
curState = state.state;
return;
}
foreach (FSMState item in stateList)
{
if (state == item)
{
return;
}
}
stateList.Add(state);
}
public void DeleteState(FSMState state)
{
foreach (FSMState item in stateList)
{
if (state == item)
{
stateList.Remove(item);
}
}
}
public void StateTransition(Transition trans)
{
State state = curFSMState.GetState(trans);
curState = state;
foreach (FSMState item in stateList)
{
if (item.state == curState)
{
curFSMState = item;
}
}
Debug.Log(curFSMState.GetType().ToString());
}
protected override void FsmInit()
{
attackRate = 2;
lastAttackTime = 0;
GameObject player = GameObject.FindGameObjectWithTag("Player");
playerTransform = player.transform;
if (player == null)
{
Debug.LogError("没找到玩家");
}
_anim = GetComponent<AnimationManagerEnemy>();
CreateFSM();
}
private void CreateFSM()
{
wayPoints = GameObject.FindGameObjectsWithTag("wayPoint");
Transform[] trans = new Transform[wayPoints.Length];
int i = 0;
foreach (GameObject item in wayPoints)
{
trans[i] = item.transform;
i++;
}
PatrolState patrol = new PatrolState(trans);
patrol.AddState(Transition.SeePlayer, State.Chase);
patrol.AddState(Transition.Dead, State.Dead);
AddFSMState(patrol);
ChaseState chaseState = new ChaseState(trans);
chaseState.AddState(Transition.NearPlayer, State.Attack);
chaseState.AddState(Transition.LostPlayer, State.Patrol);
chaseState.AddState(Transition.Dead, State.Dead);
AddFSMState(chaseState);
AttackState attackState = new AttackState(trans);
attackState.AddState(Transition.SeePlayer, State.Chase);
attackState.AddState(Transition.LostPlayer, State.Patrol);
attackState.AddState(Transition.Dead, State.Dead);
AddFSMState(attackState);
DeadState deadState = new DeadState();
AddFSMState(deadState);
}
protected override void FsmUpdate()
{
lastAttackTime += Time.deltaTime;
}
protected override void FsmFixedUpdate()
{
curFSMState.Reason(playerTransform, transform);
curFSMState.Action(playerTransform, transform);
}
public void PlayAttackAnimtion()
{
if (lastAttackTime > attackRate)
{
//todo 播放攻击动画
lastAttackTime = 0;
}
else
{
//todo 播放站立动画
}
}
}
FSMManager
最新推荐文章于 2023-12-17 20:47:47 发布