栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity开发2D游戏实现寻路算法——【PolyNav - 2D Pathfinding】插件的使用

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity开发2D游戏实现寻路算法——【PolyNav - 2D Pathfinding】插件的使用

Navmesh2d插件的简单使用说明
      • 2d游戏如何实现寻路算法
      • NavMesh2d插件的简单使用方法
        • 创建2d导航网格
        • 添加寻路组件
      • 简单实现寻路功能的脚本
        • 鼠标点击寻路
        • 自动路径寻路
      • Demo寻路效果
        • 效果gif:
        • demo插件下载
      • 组件属性说明

2d游戏如何实现寻路算法

我们都知道使用Unity开发3D游戏的时候,可以使用原生自带的Navigation组件实现自动寻路导航功能。但是这在开发2d游戏的时候是不支持的,那当我们在开发2的游戏时也有自动寻路功能的需求怎么办?两条路:

  • 使用寻路插件
    常用的2d寻路插件有:A Pathfinding Project Pro和PolyNav - 2D Pathfinding。但这都是官方收费插件,需要使用正版请到官网Asset Store付费下载,当然也可以从网上淘一淘也能找到这个插件包。本文着重介绍PolyNav - 2D Pathfinding寻路插件的使用,能满足一般的2d游戏寻路需求了,文末附插件下载链接哦!

  • 手搓寻路算法
    如果使用插件达不到你想要的寻路效果怎么办?或许你有能力可以魔改人家插件代码,以达到你需求;或许你可以参照网上大牛博客写的A*算法,再加以研究,自己手搓一份寻路算法代码咯。

NavMesh2d插件的简单使用方法 创建2d导航网格
  • step1
    新建空物体,自己修改物体命名,然后添加【PolyNav2D】组件和2d碰撞器【Polygon Collider2D】。或者依次点击GameObject / Create Other / PolyNav2D完成添加。

  • step2

    点击如上图中【1】处编辑导航区域,手动设置多边形可导航区域大小。
    勾选【2】处属性,改变时重新烘焙导航数据更新
    点击【3】处【Add New Polygon Obstacle】添加障碍区域,点击【Select】可选中编辑禁止区域大小,障碍物可动态添加,点击【Remove】可移除障碍。
    【Radius】:设置半径,表示寻路代理从区域边缘处获取的偏移量。

添加寻路组件


step1:为需要寻路的物体添加寻路必要的组件【PolyNavAgent】,设置好参数。
step2:编写自定义的寻路脚本,鼠标点击寻路或者自动路径寻路等等。

简单实现寻路功能的脚本

注:该脚本需挂载到寻路物体身上,且物体需挂载有【PolyNavAgent】组件。

鼠标点击寻路
/// 
/// 鼠标点击移动脚本
/// 
[RequireComponent(typeof(PolyNavAgent))]
public class MouseClickToMove : MonoBehaviour{
	
	private PolyNavAgent _agent;//寻路对象
	public PolyNavAgent Agent{
		get
		{
			if (!_agent)
				_agent = GetComponent();//获取物体上的PolyNavAgent组件
			return _agent;			
		}
	}

	void Update() {
        //鼠标点击某个点,物体寻路到该目标点
		if (Input.GetMouseButton(0))
			Agent.SetDestination( Camera.main.ScreenToWorldPoint(Input.mousePosition));//将鼠标点击位置坐标转换为世界坐标,寻路物体将寻路到改点位置
	}
}
自动路径寻路
/// 
/// 在一些点之间随机移动
/// 
[RequireComponent(typeof(PolyNavAgent))]
public class MoveBetween : MonoBehaviour{

	public List WPoints = new List();//存储随机移动的点

	private PolyNavAgent _agent;
	public PolyNavAgent agent{
		get
		{
			if (!_agent)
				_agent = GetComponent();
			return _agent;			
		}
	}

	void OnEnable(){
		agent.OnDestinationReached += MoveRandom;//物体到达目的地之后触发回调函数MoveRandom
        agent.OnDestinationInvalid += MoveRandom;//物体变为无效之后触发回调函数MoveRandom
    }

	void OnDisable(){
		agent.OnDestinationReached -= MoveRandom;//物体禁用后移除回调函数
		agent.OnDestinationInvalid -= MoveRandom;
	}


	IEnumerator Start(){
		yield return new WaitForSeconds(1);
		if (WPoints.Count > 0)
			MoveRandom();
	}
    /// 
    /// 随机移动方法
    /// 
	void MoveRandom(){
		agent.SetDestination(WPoints[Random.Range(0, WPoints.Count)]);//随机获取一个点,并寻路到该点位置
	}
}
    //停止寻路导航的函数 
    Agent.stop();
Demo寻路效果 效果gif:

demo插件下载

PolyNav2D寻路插件

组件属性说明
  • 【PolyNavAgent】

属性说明
Max Speed移动的最大速度
Mass代理的质量,质量越大,惯性越大
Stopping Distance代理物体到达目标点的距离
Slowing Distance设置代理从目标开始减速的距离
Deceleration Rate代理在达到目标时减速的速率。
Rotate Transform是否旋转
Rotate Speed勾选旋转时的旋转速度
Avoid Radius是代理与其他代理的回避半径。如果你不需要回避,把它留在0。
Look Ahead Distance是当代理看到障碍物或其他代理具有回避半径时,代理向前看的距离。您可以将此值设置为0,以禁用障碍和代理向前查看并提高性能。
Repath如果启用,地图改变上将重新评估路径。为了性能,一般禁用掉
Restrict如果启用,将强制代理位置在有效区域内。 为了性能,一般禁用掉
Closer Point On Invalid如果请求的目标无效,将使代理转到更接近可能的位置。
Debug Path如果选中,将绘制路径。可以在scene视图里观看
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901013.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号