ターンベースのヘックスグリッドゲームを作っています。プレイヤーはユニットを選択し、ヘクス グリッド上を移動します。グリッド内の各タイルは特定の地形タイプ (例: 砂漠、丘、山など) であり、各ユニット タイプは、地形上を移動する際に異なる能力を持っています (例: 山を簡単に移動できるものもあれば、移動が難しいものもあれば、移動が難しいものもあります)。全くない)。
各ユニットには移動値があり、各タイルはその地形タイプとユニット タイプに基づいて一定量の移動を行います。たとえば、戦車は砂漠を移動するのに 1、沼地を移動するのに 4 のコストがかかり、山を越えて移動することはできません。飛行ユニットは、1 のコストですべての上を移動します。
私が抱えている問題は、ユニットが選択されたときに、ユニットがどこに移動できるかを示す周囲の領域を強調表示したいということです。その情報に基づいてタイルを作成します。
これを再帰関数で動作させたところ、計算に時間がかかりすぎることがわかりました。関数をスレッドに移動して、ゲームをブロックしないようにしましたが、スレッドが可動領域を計算するのに約 2 秒かかります。 100 万回以上の再帰があり、明らかに問題があります。
この問題を最適化する方法について、誰かが賢いアイデアを持っているかどうか疑問に思っています。
これが私が現在使用している再帰関数です(そのC#btw):
private void CalcMoveGridRecursive(int nCenterIndex, int nMoveRemaining)
{
//List of the 6 tiles adjacent to the center tile
int[] anAdjacentTiles = m_ThreadData.m_aHexData[nCenterIndex].m_anAdjacentTiles;
foreach(int tileIndex in anAdjacentTiles)
{
//make sure this adjacent tile exists
if(tileIndex == -1)
continue;
//How much would it cost the unit to move onto this adjacent tile
int nMoveCost = m_ThreadData.m_anTerrainMoveCost[(int)m_ThreadData.m_aHexData[tileIndex].m_eTileType];
if(nMoveCost != -1 && nMoveCost <= nMoveRemaining)
{
//Make sure the adjacent tile isnt already in our list.
if(!m_ThreadData.m_lPassableTiles.Contains(tileIndex))
m_ThreadData.m_lPassableTiles.Add(tileIndex);
//Now check the 6 tiles surrounding the adjacent tile we just checked (it becomes the new center).
CalcMoveGridRecursive(tileIndex, nMoveRemaining - nMoveCost);
}
}
}
再帰の終わりに、m_lPassableTiles には、ユニットが到達できる可能性のあるすべてのタイルのインデックスのリストが含まれており、それらは光ります。
これはすべて機能しますが、時間がかかりすぎます。これに対するより良いアプローチを知っている人はいますか?