敌人AI有什么用:

AI是由预先设置好的程序来模拟出智能行为,玩家逐步了解,并且学习AI行为的过程也是游戏的乐趣之一。
游戏也可以根据AI的复杂程度来进行难度的划分。
那么如何去写一个AI呢?
最经典的就是if else大法,但是这种写法会导致代码可读性降低。还有有限状态机(FSM)和行为树。
今天我们就来简单的聊聊通过接口和字典来实现FSM的写法。

什么是有限状态机?

有限状态机(Finite State Machine, FSM),
又称有限状态自动机,简称状态机,是指在有限个状态之间按照一定规律转换。

代码

1
2
3
4
5
6
7
8
9

//我们首先来写一个接口的函数,我们讲通过这个函数来实现进入状态,状态中,和退出状态。
public interface IState
{
void OnEnter();
void OnUpdate();
void OnExit();
}

然后是状态机的本体代码,在这里我们将通过字典来储存状态,并且通过对应该的关键字来查找和切换状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//声明所有需要用到的状态
public enum StateType
{
//这里为了方便笔记我就使用一个idle状态来进行演示
Idele
}
public class FSM : MonoBehaviour
{
private IState currentState;
private Dictionary<StateType, IState> _states = new Dictionary<StateType, IState>();
private void Start()
{
//在字典中添加状态
_states.Add(StateType.Idele,new IdleState(this));
}
//状态切换的流程
public void TransitionState(StateType type)
{
//切换状态的时候首先要执行前一个状态的退出状态
if (currentState != null)
{
currentState.OnExit();
}
//然后将状态切换,通过字典和状态的关键字来找到这个状态
currentState = _states[type];
//切换以后执行当前状态的进入函数
currentState.OnEnter();
}
}

然后我们来写idle状态的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class IdleState : IState
{
private FSM manager;
public IdleState(FSM manager)
{
this.manager = manager;
}
public void OnEnter()
{
}
public void OnUpdate()
{
}
public void OnExit()
{
}
}