一、前言
最近在学习寻路算法,我找了一圈插件,发现PolyNav
这个插件短小精悍,简单几个类就搞定了,所以学习学习顺便分享出来。
二、简介
PolyNav插件是一款用于2D游戏中的寻路算法实现工具,主要功能是帮助游戏开发者在2D环境中实现角色或物体的路径规划和导航。该插件可以通过Unity平台使用,并且需要从官网Asset Store付费下载。
官方下载地址
使用文档
三、搭建场景
首先创建一个2D新项目,项目名字随意,不要中文名就行。我创建的Unity版本是2021.3.14f1的,后面我会把版本链接分享出来。
将我们的Polynav包导进来,有3种方式:
-
直接在
manifest.json
文件中添加以下内容{"com.paradoxnotion.polynav2d": "https://github.com/AlianBlank/com.paradoxnotion.polynav2d.git"}
-
在Unity 的
Packages Manager
中使用Git URL
的方式添加库,地址为:https://github.com/AlianBlank/com.paradoxnotion.polynav2d.git -
直接下载仓库放置到Unity 项目的
Packages
目录下。会自动加载识别
现在我们就可以开始愉快的玩耍了~
咱们先创建一个背景,我用一张灰色底图来充当背景
创建一个空物体,命名为PolyNav,然后添加上PolyNavMap脚本,它会自动添加一个Polygon Collider 2D组件。
我们先将Shape Type改成Box类型,Polygon Collider 2D也会相应的变成Box Collider 2D。
注:如果是多边形的障碍物可以用Polygon类型,可以自己调节碰撞体积。
调整一下Box Collider的大小,让它尽量保持跟屏幕大小一致,这个大小区域就是可以导航的区域
。
现在咱们来创建几个障碍物,我先创建一个Square(2D Object -> Sprites -> Square),调整好大小,然后再添加上PolyNavObstacle脚本,表明这个对象是一个障碍物,它会默认添加Collider组件,我们把Shape Type类型改成Box。结果一看发现,咦!我创建的Square怎么看不见呢,只看到碰撞体?别急,咱们修改下层级就能看到了。
然后再复制几个,摆好阵势,再将这些Square放进一个空对象上,方便管理~
好了,现在来创建我们的主角,也就是Agent。
新建一个Circle(2D Object -> Sprites -> Circle),调整层级为1,添加上PolyNavAgent脚本,将我们之前创建的PolyNav对象赋值到Agent的Map上。
好了,咱们的场景就搭建完成了,现在开始写我们的代码~
四、编写控制逻辑
新建一个空物体,命名为GameController,添加一个脚本GameController.cs。代码如下:
using PolyNav;
using UnityEngine;
public class GameController : MonoBehaviour
{
[SerializeField]
private PolyNavAgent _agent;
[SerializeField]
private Camera _camera;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 touchDownPos = Input.mousePosition;
Vector2 worldPos = _camera.ScreenToWorldPoint(touchDownPos);
RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero);
if (hit.collider != null)
{
_agent.SetDestination(hit.point);
}
}
}
}
给我们的_agent和_camera赋上值之后就可以了。
运行游戏看看!点击屏幕,发现咱们的主角不会动,原因是hit.collider检测到是null,所以我们给Bg添加上Box Collider 2D就可以了。
完整效果如下:
五、项目源码
这个demo其实特别简单,不过我这里还是放出源码地址给大家看看~
github地址:https://github.com/Lucky-xb/UnityPolyNav.git
unity2021.3.14f1版本地址:https://unity.com/releases/editor/whats-new/2021.3.14
注:也可以通过UnityHub下载,在浏览器里打开这个链接就会跳转到UnityHub下载:unityhub://2021.3.14f1/eee1884e7226
六、小结
用过这个插件之后发现还是有些问题的,比方说寻路的路线不够准确
从A–>B,正常的寻路来说应该是A–>D–>B,但是这个寻路有可能会出现A–>C–>B的情况。小悠技术有限,暂时还没找到解决方法,看看各位大神能不能搞定了。