Unity3D 2D游戏中寻径算法的一些解决思路
需求
unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能。但是在原生的2d中并没有相同的功能。
现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一些例如机器人、npc等,都需要自动寻路的功能。
我需要实现的功能类似于当年FC游戏中淘金者的运动方式。游戏中有淘金者、敌人,可移动,不可移动区域,只能沿着直线的向前向后或者向上向下。
思路
unity3d中也有一些2d寻路的插件。例如A Pathfinding Project Pro和NavMesh 2D。
两个插件都是收费插件,可以满足不同需求,但是我用过之后发现并不是我想要的效果,而且修改别人的代码的还是挺难受的。所以决定自己写一遍A*算法。
A*算法已经有很多大牛的博客中,都有非常不错的介绍。我看的是这篇,给大家推荐下:传送
这篇文章的代码在于拐点的处理上是有一定问题的,我在下面的代码中有进行修改。
解决方案
先上结果,实现后的路径是这样的。请忽略那只乱入恐龙,他其实只是来打酱油的~~
核心代码如下:
1 public Point FindPath (Point start, Point end, bool IsIgnoreCorner) 2 { 3 OpenList.Add (start); 4 while (OpenList.Count != 0) { 5 //找出F值最小的点 6 var tempStart = OpenList.MinPoint (); 7 OpenList.RemoveAt (0); 8 CloseList.Add (tempStart); 9 //找出它相邻的点 10 var surroundPoints = SurrroundPoints (tempStart, IsIgnoreCorner); 11 foreach (Point point in surroundPoints) { 12 if (OpenList.Exists (point)) 13 //计算G值, 如果比原来的大, 就什么都不做, 否则设置它的父节点为当前点,并更新G和F 14 FoundPoint (tempStart, point); 15 else 16 //如果它们不在开始列表里, 就加入, 并设置父节点,并计算GHF 17 NotFoundPoint (tempStart, end, point); 18 } 19 if (OpenList.Get (end) != null) 20 return OpenList.Get (end); 21 } 22 return OpenList.Get (end); 23 }
原文中有些小问题的CanReach方向,我修改的如下:
1 public bool CanReach (Point start, int x, int y, bool IsIgnoreCorner) 2 { 3 if (!CanReach (x, y) || CloseList.Exists (x, y)) 4 return false; 5 else { 6 if (Math.Abs (x - start.X) + Math.Abs (y - start.Y) == 1) 7 return true; 8 //如果是斜方向移动, 判断是否 "拌脚" 9 else { 10 if (IsIgnoreCorner) { 11 if (CanReach (Math.Abs (x - 1), y) && CanReach (x, Math.Abs (y - 1))) 12 return true; 13 else 14 return false; 15 } else 16 return false; 17 } 18 } 19 }
总结
算法还是要多自己写一些,总是拿来主义不利于自己的成长,在大学里学过了,基本都还给老师了,项目里的东西,要用也要明明白白的用,防止为以后的开发留下隐患,到时候从头再找就需要话费给多的时间了。
项目源代码中包含了spine的例子,所以有点大,有兴趣的朋友可以下载去玩一玩。
点击下载源代码
转载于:https://www.cnblogs.com/nightcat/p/unity3d_005.html
Unity3D 2D游戏中寻径算法的一些解决思路相关推荐
- unity3d 2D游戏中摄像机投影类型
我们盘点一下unity3d 2D游戏中必备的几个元素. 摄像机:无论是3D游戏还是unity3d 2D游戏摄像机都是非常重要的属性,移动摄像机即可更改屏幕中显示的内容,游戏地图的坐标永远都不会发生改变 ...
- 【个人UNITY笔记】{基础} 2D游戏中使用Shader或Camera解决Sprite前后遮挡关系
因为个人制作的奇葩游戏2D游戏是用Sprite当作角色和物体,然而Unity里不应该使用带透视的相机来渲染Sprite,因为会2个Sprite距离太近会出现闪烁,但是我就是想保留透视,同时使用Spri ...
- 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf
作 者 :刘国柱著 出版发行 : 北京:电子工业出版社 , 2018.01 ISBN号 :978-7-121-33499-3 页 数 : 507 丛书名 : 游戏研发系列 原书定价 : 99.00 开 ...
- unity3d 2d游戏制作的模式
经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...
- java2d游戏代码_Java 2d游戏中的“JUMP”
我有这个代码,我想在java 2d游戏中启动一个跳转,事情是我的对象没有去任何地方,它只是停留在那里...我想我的对象跳,当我按下键和程序显示我的图像上下移动..我试图通过简单的repaint()方法 ...
- [Unity学习笔记]2D游戏中的触碰/OnMouseDown
[Unity学习笔记]2D游戏中的触碰/OnMouseDown 这种情况多用于2D游戏的触屏 1.给2D游戏对象加上collider 2D,让其能够被检测到
- 计算机win7卡顿如何解决方法,win7电脑玩2D游戏经常发生卡顿六大解决方法
最近有很多游戏玩家和小编说win7电脑玩2D游戏经常发生卡顿,游戏卡顿问题确实让玩家苦恼,因为导致2D游戏经常发生卡顿的原因有很多种,那么win7电脑玩2D游戏经常发生卡顿怎么办?不要着急,针对此问题 ...
- 楚留香pc端连接服务器未响应,楚留香游戏pc端闪退怎么办_楚留香游戏中pc端闪退解决办法汇总...
楚留香手游的内存相对其他小型游戏来说比较大,所以游戏的过程中容易出现pc端闪退的情况,楚留香游戏pc端闪退怎么办?快啦小编给大家带来楚留香游戏中pc端闪退解决办法汇总. 楚留香游戏中pc端闪退解决办法 ...
- 2D游戏中的地图创造
尽管3D技术成熟的今天,2D游戏以独特的画面风格和趣味性仍有一席之地,开发者们是用什么方法了构建游戏中复杂丰富的2D游戏地图的呢,我大致将其分为以下三方面: 整体绘制 代表游戏:Ori and the ...
最新文章
- SAP SD 常用表
- numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
- c#索引器介绍|C#索引器写法|c#索引器例子
- Count on a tree
- mysql中where和and的区别
- 图解Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
- 如何快速生成100万不重复的8位随机编号?
- 如何打开.azw3 .epub .mobi文件?
- bug解决 2021-09-25 Unity人物动画无法正常播放的问题
- 微软部分专卖店地址选定 今秋开张
- 微信支付指纹要上传到服务器,华为即将支持微信指纹支付,同意上传至腾讯服务器!...
- CDSP认证是什么?数据安全认证专家含金量大吗?
- 互联网+AI,云反射弧如何成为人工智能发展的下一个重点
- 管中窥豹之淘宝大数据平台
- Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN
- 蓝牙音响加拿大IC认证知多少
- a0图框标题栏尺寸_机械制图140标题栏-机械制图a0标题栏-机械制图图框标题栏标准...
- Windows和ubuntu下一些提升效率的工具知识点以及typora和Obsidian配置
- 第一章之OpenCV安装
- 1044:判断是否为两位数