回答編集履歴
1
GetNeighboursの「自分自身」の判定条件を修正、コスト計算時の隣接ノード移動コストをユークリッド距離に変更
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
ご提示のコードを[Wikipediaの記事](https://ja.wikipedia.org/wiki/A*#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E6%B5%81%E3%82%8C)と見比べてみたのですが、ご質問者さんの隣接ノードのコスト計算やオープンリストへの追加ルールに疑問を感じ、`
|
1
|
+
ご提示のコードを[Wikipediaの記事](https://ja.wikipedia.org/wiki/A*#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E6%B5%81%E3%82%8C)と見比べてみたのですが、ご質問者さんの隣接ノードのコスト計算やオープンリストへの追加ルールに疑問を感じ、`Pathfinding`と`GetNeighbours`を下記のように改変してみました。これならどうでしょうか?
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -10,8 +10,6 @@
|
|
10
10
|
|
11
11
|
using System.Linq;
|
12
12
|
|
13
|
-
using System.Runtime.ConstrainedExecution;
|
14
|
-
|
15
13
|
using UnityEngine;
|
16
14
|
|
17
15
|
|
@@ -382,15 +380,19 @@
|
|
382
380
|
|
383
381
|
|
384
382
|
|
385
|
-
// neighbourのHコスト、Fコストを求め...
|
383
|
+
// neighbourのHコスト、Fコストを求め...
|
386
384
|
|
387
385
|
float neighbourH = GethCost(neighbour, goalNode);
|
388
386
|
|
389
|
-
float neighbourF = n.gCost +
|
387
|
+
float neighbourF = n.gCost + Vector2.Distance(n.pos, neighbour.pos) + neighbourH;
|
388
|
+
|
389
|
+
|
390
|
+
|
390
|
-
|
391
|
+
bool openListContainsNeighbour = openList.Contains(neighbour);
|
392
|
+
|
391
|
-
|
393
|
+
bool closeListContainsNeighbour = closeList.Contains(neighbour);
|
392
|
-
|
394
|
+
|
393
|
-
if ((!openList
|
395
|
+
if ((!openListContainsNeighbour && !closeListContainsNeighbour) || (neighbourF < neighbour.fCost))
|
394
396
|
|
395
397
|
{
|
396
398
|
|
@@ -408,9 +410,29 @@
|
|
408
410
|
|
409
411
|
neighbour.parent = n;
|
410
412
|
|
413
|
+
|
414
|
+
|
415
|
+
// クローズリストにあったノードなら、リストから削除することでクローズを取り消して...
|
416
|
+
|
417
|
+
if (closeListContainsNeighbour)
|
418
|
+
|
419
|
+
{
|
420
|
+
|
411
|
-
closeList.Remove(neighbour);
|
421
|
+
closeList.Remove(neighbour);
|
422
|
+
|
412
|
-
|
423
|
+
}
|
424
|
+
|
425
|
+
|
426
|
+
|
427
|
+
// オープンリストに未追加のノードなら、リストに追加して処理対象とする
|
428
|
+
|
429
|
+
if (!openListContainsNeighbour)
|
430
|
+
|
431
|
+
{
|
432
|
+
|
413
|
-
openList.Add(neighbour);
|
433
|
+
openList.Add(neighbour);
|
434
|
+
|
435
|
+
}
|
414
436
|
|
415
437
|
}
|
416
438
|
|
@@ -466,7 +488,7 @@
|
|
466
488
|
|
467
489
|
|
468
490
|
|
469
|
-
|
491
|
+
parentList.Reverse();
|
470
492
|
|
471
493
|
}
|
472
494
|
|
@@ -478,15 +500,19 @@
|
|
478
500
|
|
479
501
|
List<Node> neighbours = new List<Node>();
|
480
502
|
|
503
|
+
int nx = (int)node.pos.x;
|
504
|
+
|
505
|
+
int ny = (int)node.pos.y;
|
506
|
+
|
481
|
-
for (int i =
|
507
|
+
for (int i = nx - 1; i <= nx + 1; i++)
|
482
|
-
|
508
|
+
|
483
|
-
{
|
509
|
+
{
|
484
|
-
|
510
|
+
|
485
|
-
for (int j =
|
511
|
+
for (int j = ny - 1; j <= ny + 1; j++)
|
486
|
-
|
512
|
+
|
487
|
-
{
|
513
|
+
{
|
488
|
-
|
514
|
+
|
489
|
-
if (i ==
|
515
|
+
if (i == nx && j == ny)
|
490
516
|
|
491
517
|
{
|
492
518
|
|