ゲームの経路探索アルゴリズムを作成していますが、将来のアプリケーションで使用できるように汎用性を維持しようとしています。
X、Y、および「PassableType」を保持する Node クラスがあります。
NodeGrid クラスは、接続方法のグラフ情報を含むノードの配列を格納し、FindAStarPath() 関数を持ちます。この関数は、パラメータとして StartNode、EndNode、および「PassableTypes」の params を取ります。
私の問題は、「PassableType」が持つべき型を決定することです。
理想的には、一般的な列挙型 (つまり、各ゲームが定義する制限付きリスト) を使用できるようにすることです。ノードは、そのリストの単一の要素を保持し、パスの種類を示します (現在のゲームでは、パス、草、壁などを使用できます)。
したがって、エンティティがパスしようとすると、「パス可能」として処理するタイプのパスファインディング関数が提供されます。だから男は使える
FindAStarPath(CurrentNode, DestinationNode, "Path", "Floor", "Door");
しかし、車はただ使うかもしれません
FindAStarPath(StartNode, EndNode, "Road");
私の問題は、NodeGrid にジェネリック列挙型または同等のロジックを取得させる方法がわからないことです。
現時点では文字列を取得していますが、これは、
使用するたびに MyEnum.Road.ToString() を記述する必要があることを意味します。
理想的には、次のようなことをしたいと思います
NodeGrid<MyEnum> CurrentNodeGrid = new NodeGrid<MyEnum>()
次に、パスファインディング関数と同様に、ノードは passableType に MyEnum を使用します。これにより、各ゲームがパス用に異なるタイル タイプのセットを持つことができます。
しかし、NodeGrid を次のように定義することはできません。
public class NodeGrid<T> where T:enum
明確にするために、この列挙型を使用するパスファインディング関数の唯一の部分はこれです (ノード内に含まれています):
public bool IsPassable(string[] passableTypes)
{
for (var i = 0; i < passableTypes.Count(); i++)
{
if (this.PassableType == passableTypes[i]) return true;
}
return false;
}
ありがとうハイストロム