b站学习视频链接 代码进度截止至该链接的p3
一、Common
1.FSMStateID
namespace AI.FSM
{
public enum FSMStateID
{
None,
Default,
Dead,
Idle,
Pursuit,
Attacking,
Patrolling
}
}
2.FSMTriggerID
namespace AI.FSM
{
public enum FSMTriggerID
{
NoHealth,
SawTarget,
ReachTarget,
KilledTarget,
WithoutAttackRange,
LoseTarget,
CompletePatrol
}
}
二、States
1.DeadState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AI.FSM
{
public class DeadState : FSMState
{
public override void Init()
{
StateID = FSMStateID.Dead;
}
public override void EnterState(FSMBase fsm)
{
base.EnterState(fsm);
fsm.enabled = false;
}
}
}
2.IdleState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AI.FSM {
public class IdleState : FSMState
{
public override void Init()
{
StateID = FSMStateID.Idle;
}
public override void EnterState(FSMBase fsm)
{
base.EnterState(fsm);
}
public override void ExitState(FSMBase fsm)
{
base.ExitState(fsm);
}
}
}
三、Triggers
1.NoHealthTrigger
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AI.FSM
{
public class NoHealthTrigger : FSMTrigger
{
public override bool HandleTrigger(FSMBase fsm)
{
return fsm.chStatus.HP <= 0;
}
public override void Init()
{
TriggerID = FSMTriggerID.NoHealth;
}
}
}
四、CharacterAnimationParameter
namespace ARPGDemo.Character
{
[System.Serializable]
public class CharacterAnimationParameter
{
public string run = "run";
public string death = "death";
public string idle = "idle";
}
}
五、CharacterStatus
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ARPGDemo.Character
{
public class CharacterStatus : MonoBehaviour
{
[Tooltip("动画参数")]
public CharacterAnimationParameter chParams;
[Tooltip("血量")]
public float HP;
[Tooltip("最大血量")]
public float maxHP;
[Tooltip("法力")]
public float SP;
[Tooltip("最大法力")]
public float maxSP;
[Tooltip("基础攻击力")]
public float baseATK;
[Tooltip("防御力")]
public float defence;
[Tooltip("攻击间隔")]
public float attackInterval;
[Tooltip("攻击距离")]
public float attackDistance;
public void Damage(float val)
{
val -= defence;
if (val <= 0) return;
HP -= val;
if (HP <= 0) Death();
}
public void Death()
{
GetComponent<Animator>().SetBool(chParams.death,true);
print("游戏结束");
}
}
}
六、FSMBase
using System.Collections;
using ARPGDemo.Character;
using System.Collections.Generic;
using UnityEngine;
namespace AI.FSM
{
public class FSMBase : MonoBehaviour
{
#region Unity生命周期
private void Start()
{
InitComponent();
ConfigFSM();
InitDefaultState();
}
public void Update()
{
currentState.Reason(this);
currentState.ActionState(this);
}
#endregion
#region 状态机自身成员
private List<FSMState> states;
[Tooltip("默认状态编号")]
public FSMStateID defaultStateID;
private FSMState defaultState;
public FSMState currentState;
private void InitDefaultState() {
defaultState = states.Find(s => s.StateID == defaultStateID);
currentState = defaultState;
currentState.EnterState(this);
}
private void ConfigFSM() {
states = new List<FSMState>();
IdleState idle = new IdleState();
idle.AddMap(FSMTriggerID.NoHealth,FSMStateID.Dead);
states.Add(idle);
DeadState dead = new DeadState();
states.Add(dead);
}
public void ChangeActiveState(FSMStateID stateID) {
currentState.ExitState(this);
currentState = stateID == FSMStateID.Default ? currentState = defaultState: states.Find(s => s.StateID == stateID);
currentState.EnterState(this);
}
#endregion
#region 为状态与条件提供的成员
[HideInInspector]
public Animator anim;
[HideInInspector]
public CharacterStatus chStatus;
public void InitComponent()
{
anim = GetComponentInChildren<Animator>();
chStatus = GetComponent<CharacterStatus>();
}
#endregion
}
}
七、FSMState
using System;
using System.Collections.Generic;
namespace AI.FSM
{
public abstract class FSMState
{
public FSMStateID StateID { get; set; }
private Dictionary<FSMTriggerID, FSMStateID> map;
private List<FSMTrigger> Triggers;
public FSMState() {
map = new Dictionary<FSMTriggerID, FSMStateID>();
Triggers = new List<FSMTrigger>();
Init();
}
public void Reason(FSMBase fsm)
{
for(int i = 0; i < Triggers.Count; i++)
{
if (Triggers[i].HandleTrigger(fsm))
{
FSMStateID stateID = map[Triggers[i].TriggerID];
fsm.ChangeActiveState(stateID);
return;
}
}
}
public abstract void Init();
public void AddMap(FSMTriggerID triggerID,FSMStateID stateID) {
map.Add(triggerID, stateID);
CreateTrigger(triggerID);
}
private void CreateTrigger(FSMTriggerID triggerID) {
Type type = Type.GetType("AI.FSM." + triggerID + "Trigger");
FSMTrigger trigger = Activator.CreateInstance(type) as FSMTrigger;
Triggers.Add(trigger);
}
public virtual void EnterState(FSMBase fsm) { }
public virtual void ActionState(FSMBase fsm) { }
public virtual void ExitState(FSMBase fsm) { }
}
}
八、FSMTrigger
using AI.FSM;
public abstract class FSMTrigger
{
public FSMTriggerID TriggerID { get; set; }
public FSMTrigger() {
Init();
}
public abstract void Init();
public abstract bool HandleTrigger(FSMBase fsm);
}
代码下载链接
|