需求

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游戏中寻径算法的一些解决思路相关推荐

  1. unity3d 2D游戏中摄像机投影类型

    我们盘点一下unity3d 2D游戏中必备的几个元素. 摄像机:无论是3D游戏还是unity3d 2D游戏摄像机都是非常重要的属性,移动摄像机即可更改屏幕中显示的内容,游戏地图的坐标永远都不会发生改变 ...

  2. 【个人UNITY笔记】{基础} 2D游戏中使用Shader或Camera解决Sprite前后遮挡关系

    因为个人制作的奇葩游戏2D游戏是用Sprite当作角色和物体,然而Unity里不应该使用带透视的相机来渲染Sprite,因为会2个Sprite距离太近会出现闪烁,但是我就是想保留透视,同时使用Spri ...

  3. 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf

    作 者 :刘国柱著 出版发行 : 北京:电子工业出版社 , 2018.01 ISBN号 :978-7-121-33499-3 页 数 : 507 丛书名 : 游戏研发系列 原书定价 : 99.00 开 ...

  4. unity3d 2d游戏制作的模式

      经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...

  5. java2d游戏代码_Java 2d游戏中的“JUMP”

    我有这个代码,我想在java 2d游戏中启动一个跳转,事情是我的对象没有去任何地方,它只是停留在那里...我想我的对象跳,当我按下键和程序显示我的图像上下移动..我试图通过简单的repaint()方法 ...

  6. [Unity学习笔记]2D游戏中的触碰/OnMouseDown

    [Unity学习笔记]2D游戏中的触碰/OnMouseDown 这种情况多用于2D游戏的触屏 1.给2D游戏对象加上collider 2D,让其能够被检测到

  7. 计算机win7卡顿如何解决方法,win7电脑玩2D游戏经常发生卡顿六大解决方法

    最近有很多游戏玩家和小编说win7电脑玩2D游戏经常发生卡顿,游戏卡顿问题确实让玩家苦恼,因为导致2D游戏经常发生卡顿的原因有很多种,那么win7电脑玩2D游戏经常发生卡顿怎么办?不要着急,针对此问题 ...

  8. 楚留香pc端连接服务器未响应,楚留香游戏pc端闪退怎么办_楚留香游戏中pc端闪退解决办法汇总...

    楚留香手游的内存相对其他小型游戏来说比较大,所以游戏的过程中容易出现pc端闪退的情况,楚留香游戏pc端闪退怎么办?快啦小编给大家带来楚留香游戏中pc端闪退解决办法汇总. 楚留香游戏中pc端闪退解决办法 ...

  9. 2D游戏中的地图创造

    尽管3D技术成熟的今天,2D游戏以独特的画面风格和趣味性仍有一席之地,开发者们是用什么方法了构建游戏中复杂丰富的2D游戏地图的呢,我大致将其分为以下三方面: 整体绘制 代表游戏:Ori and the ...

最新文章

  1. SAP SD 常用表
  2. numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
  3. c#索引器介绍|C#索引器写法|c#索引器例子
  4. Count on a tree
  5. mysql中where和and的区别
  6. 图解Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
  7. 如何快速生成100万不重复的8位随机编号?
  8. 如何打开.azw3 .epub .mobi文件?
  9. bug解决 2021-09-25 Unity人物动画无法正常播放的问题
  10. 微软部分专卖店地址选定 今秋开张
  11. 微信支付指纹要上传到服务器,华为即将支持微信指纹支付,同意上传至腾讯服务器!...
  12. CDSP认证是什么?数据安全认证专家含金量大吗?
  13. 互联网+AI,云反射弧如何成为人工智能发展的下一个重点
  14. 管中窥豹之淘宝大数据平台
  15. Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN
  16. 蓝牙音响加拿大IC认证知多少
  17. a0图框标题栏尺寸_机械制图140标题栏-机械制图a0标题栏-机械制图图框标题栏标准...
  18. Windows和ubuntu下一些提升效率的工具知识点以及typora和Obsidian配置
  19. 第一章之OpenCV安装
  20. 1044:判断是否为两位数

热门文章

  1. 对整个矩阵元素进行计算:最大数、最小数、排序
  2. android fragment 退出程序,android – 应用程序在Fragment中单击后退按钮后关闭
  3. 指针学习笔记(更新中)
  4. Vscode配置C语言问题
  5. 详解python正则\b和\B的区别
  6. 手动设计简单的Token验证
  7. css3动画、2D与3D效果
  8. Spring MVC 使用拦截器 HiddenHttpMethodFilter配置Rest风格的URL
  9. [转]linux tar 解压命令总结
  10. B树、B-树、B+树、B*树(转)