日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/4/9 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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游戏中寻径算法的一些解决思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。