日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D 2D游戏中寻径算法的一些解决思路

發(fā)布時(shí)間:2025/4/9 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D 2D游戏中寻径算法的一些解决思路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求

unity3d的3d開發(fā)環(huán)境中,原生自帶了Navigation的組件,可以很便捷快速的實(shí)現(xiàn)尋路功能。但是在原生的2d中并沒有相同的功能。

現(xiàn)在國(guó)內(nèi)很多手機(jī)游戲都有自動(dòng)尋路的功能,或者游戲中存在一些例如機(jī)器人、npc等,都需要自動(dòng)尋路的功能。

我需要實(shí)現(xiàn)的功能類似于當(dāng)年FC游戲中淘金者的運(yùn)動(dòng)方式。游戲中有淘金者、敵人,可移動(dòng),不可移動(dòng)區(qū)域,只能沿著直線的向前向后或者向上向下。

?

思路

unity3d中也有一些2d尋路的插件。例如A Pathfinding Project Pro和NavMesh 2D。

兩個(gè)插件都是收費(fèi)插件,可以滿足不同需求,但是我用過之后發(fā)現(xiàn)并不是我想要的效果,而且修改別人的代碼的還是挺難受的。所以決定自己寫一遍A*算法。

A*算法已經(jīng)有很多大牛的博客中,都有非常不錯(cuò)的介紹。我看的是這篇,給大家推薦下:傳送

這篇文章的代碼在于拐點(diǎn)的處理上是有一定問題的,我在下面的代碼中有進(jìn)行修改。

解決方案

?先上結(jié)果,實(shí)現(xiàn)后的路徑是這樣的。請(qǐng)忽略那只亂入恐龍,他其實(shí)只是來打醬油的~~

核心代碼如下:

1 public Point FindPath (Point start, Point end, bool IsIgnoreCorner) 2 { 3 OpenList.Add (start); 4 while (OpenList.Count != 0) { 5 //找出F值最小的點(diǎn) 6 var tempStart = OpenList.MinPoint (); 7 OpenList.RemoveAt (0); 8 CloseList.Add (tempStart); 9 //找出它相鄰的點(diǎn) 10 var surroundPoints = SurrroundPoints (tempStart, IsIgnoreCorner); 11 foreach (Point point in surroundPoints) { 12 if (OpenList.Exists (point)) 13 //計(jì)算G值, 如果比原來的大, 就什么都不做, 否則設(shè)置它的父節(jié)點(diǎn)為當(dāng)前點(diǎn),并更新G和F 14 FoundPoint (tempStart, point); 15 else 16 //如果它們不在開始列表里, 就加入, 并設(shè)置父節(jié)點(diǎn),并計(jì)算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 //如果是斜方向移動(dòng), 判斷是否 "拌腳" 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 }

總結(jié)

?算法還是要多自己寫一些,總是拿來主義不利于自己的成長(zhǎng),在大學(xué)里學(xué)過了,基本都還給老師了,項(xiàng)目里的東西,要用也要明明白白的用,防止為以后的開發(fā)留下隱患,到時(shí)候從頭再找就需要話費(fèi)給多的時(shí)間了。

項(xiàng)目源代碼中包含了spine的例子,所以有點(diǎn)大,有興趣的朋友可以下載去玩一玩。

點(diǎn)擊下載源代碼

轉(zhuǎn)載于:https://www.cnblogs.com/nightcat/p/unity3d_005.html

總結(jié)

以上是生活随笔為你收集整理的Unity3D 2D游戏中寻径算法的一些解决思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。