最早的游戏的敌人ai只有简单的寻路功能,随着技术发展,现代游戏中逐渐融入AI元素,它们有着最常规,以及特定情景的判断能力与数据处理能力。判断,也称为分析。大量的分析,即逻辑。逻辑,即AI。
本文在unity中使用状态机,实现可以在巡逻和追击两个状态之间切换的简单敌人ai。
状态机
状态机的本质是行为树的逻辑实现。游戏AI的开发是从其行为模式和变化逻辑开始的。
下图就是一个简单的行为树:
AI在任一时刻必定处于巡逻、追击、搜索、逃离四种状态中的一种,当触发另一状态所需的条件时,从一个状态改变到另一状态。
我们可以将每一个状态封装成一个有执行方法、认知标识的类,通过编写一个Manager类,将需要的状态进行存放、管理和控制,在需要的时候进入预想的状态。
整个状态机的基本结构如下图所示:
在这个基础上还可以进行另一种改动:把状态转移函数的判决从Update函数中转移到执行函数的内部,使整个状态机的结构更加紧凑,但是这种方式不便于多种类敌人的适配,选择哪种方式还要看实际需求。
代码实现
public class EnemyCntroller : MonoBehaviour
{
GameObject player;
Transform thistf, playertf;
Rigidbody2D thisrb;
StateManager statemanager;
Vector3 point1, point2;//在point1和point2之间来回巡逻
public bool target;//true表示点2为目标,false表示点1
float moveSpeed;
// Start is called before the first frame update
void Start()
{
player = GameObject.FindGameObjectWithTag("Player");
thistf = this.GetComponent<Transform>();
thisrb = this.GetComponent<Rigidbody2D>();
playertf = player.GetComponent<Transform>();
statemanager = new StateManager();
statemanager.RegionState("Idle");
statemanager.RegionState("Chase");
statemanager.SetDefaultState("Idle");
point1 = new Vector3(5, 0, 0);