哈喽~我是yumir。
写过俯视角射击和“元气骑士”地图生成之后,不做个敌人AI总觉得差点什么,所以又研究了一下Unity的2D寻路。
传送门:
这次我用的是A*Pathfinding的免费版。
获取方法:
在官网(A* Pathfinding Project (https://arongranberg.com/astar/))点击Download选项,在跳转到的页面上选择下载”Free“版本,将下载下来的文件导入到unity中,就可以开始我们的大事业了。
虽然也可以脚本控制,但是建议先简单搭建一个场景熟悉下插件,而且能不写代码就完成功能我觉得香得很~
在搭建好的场景中新建一个空物体,点击”AddComponent“搜索”Pathfinder“添加该组件。添加组件之后面板显示如下,点击图中框选按钮添加Grid Graph(Graphs>Grid Graph)。
由于我做的是2D寻路,所以将”2D“和”Use 2D Physic“勾选,使用2D模式,再在第三个红框的位置选择一个Layer,这个Layer表示”不能行走“的范围,也就是障碍物,做这一步的同时需要将场景中的障碍物的Layer都设置为对应的Layer。
”Width“和”Depth“分别表示网格的长高,单位是”nodes“也就是有几个格子。下面的”Node size“ 表示格子的大小也可以理解为网格的精度,这些都根据需求调整。点击下方的Scan按钮,就会扫描生成寻路网格,红色方框的部分代表不可行走,蓝色部分则反之。
那么动态生成的地图应该怎么烘焙网格呢,设置一张对应大小的网格然后在地图生成结束的时候调用插件提供的方法即可:
GetComponent().Scan();
首先我们需要一个迷人的反派角色,我把玩家的贴图叠了一层红色画了个红眼睛用来充当,效果还不错。
新建一个空物体作为反派角色的父物体,在该物体上添加”AI Path“组件,而后系统会自动添加另一个组件”Seeker“,这是因为AI Path需要利用Seeker来寻路,放着别动就行,除非你打算自定义一个AI Path。
再添加一个”AI Destination Setter“组件,该组件负责更新目标位置。
AI Path主要修改以下内容:Orientation、Enable Rotation、Gravity。
再将玩家角色拖拽到AI Destination Setter的Target上,点击运行就可以看到寻路的效果。
三、简单AI实现
迷人的反派角色当然不能只是跟屁虫,这里给他写一个简单的状态机,分别又待机、追逐、攻击三个状态:
enum EnemyState
{
Idle,
Tracking,
Attack
}
在Update中根据当前的状态类型分别调用对应的方法:
switch (enemyState)
{
case EnemyState.Idle:
Idle();
break;
case EnemyState.Tracking:
Tracking();
break;
case EnemyState.Attack:
Attack();
break;
default:
break;
}
AI Path没有提供停止寻路的接口,但是没关系,将速度设置为零就可以让他停下了。在各自的状态方法中改变当前的速度、状态类型、和动画:
AIPath.maxSpeed = speed;
enemyState = EnemyState.Tracking;
enemyModel.GetComponent().SetBool("walk", true);
加上和玩家相互攻击的逻辑就是一个小游戏啦。
链接:https://pan.baidu.com/s/1khG-XNnPQIoXBmIj5VejEQ
提取码:kkm8
往期精选
Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着
Shader学习应该如何切入?
写出一手烂代码的19条准则
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
作者:Yumir
来源:https://zhuanlan.zhihu.com/p/117299096
More:【微信公众号】 u3dnotes