1
私はA *で経路探索を行い、クラス "ノード"を作っています。カスタムクラスのList.Containsの代わり
ポイントは、私はノードのリストを持っており、ノードがすでにリストに入っているが、List.Containsが機能していないかどうかを知る必要があるということです。
Btw、私はノード内の変数にある世界の位置を比較する必要があり、私はその変数と比較するList.Containsをオーバーライドする方法がわかりません。
編集:オープンセットでは等しく、HashSetの
using System.Collections;
using UnityEngine;
using System.Collections.Generic;
public class Node {
public Node parentNode;
public int nodeX;
public int nodeY;
public Vector2 nodePosition;
public bool state;
public int gCost;
public int hCost;
public int fCost;
public Node(int x, int y){
nodeX = Mathf.RoundToInt(x);
nodeY = Mathf.RoundToInt(y);
nodePosition = new Vector2(nodeX, nodeY);
}
public void SetCost(Node end){
if(parentNode != null){
gCost =(int) parentNode.gCost + 10;
}
else{
gCost = 10;
}
hCost =(int) (Mathf.Abs(nodeX - end.nodeX) + Mathf.Abs(nodeY-end.nodeY));
fCost =(int) gCost + hCost;
}
public bool Equals (Node other){
if(other == null){return false;}
if(this.nodePosition == other.nodePosition){return true;}
else{return false;}
}
public override bool Equals(Object other){
if(other == null){return false;}
if(other is Node){
return this.Equals(other);
}
else{
return false;
}
}
public override int GetHashCode(){
return nodeX^nodeY;
}
問題は、私がそれらを作成する隣接ノードを探しているときです。そのため、同じ位置のノードがある場合に新しいノードを作成しない唯一の方法は、作成しようとしているノードに既にその位置のノードがあるかどうかを比較する方法を実際には分かりません。 しかし、プライオリティキューについては何も見なかったので、私はそれを確認します – Luxgile
その場合、おそらく 'HashSet'が必要です。等価と見なされない同等のノードで同じ問題が発生するので、 'Equals'と' IEquatable ' –
を正しく実装する方法を調べてください。しかし、私はどこでもEqualsとHashSetをオーバーライドする方法のまともな説明を参照することはできません。私はすでにそれを試して動作しませんが、私は何か悪いことをしているかどうかわからないので、質問を編集し、Nodeクラスコードを追加します。 – Luxgile