見出し画像

【Unity C#】キャンディークラッシュ風マッチ3パズルの作り方 #10 タイル削除①

それではこのレクチャーでは
隣接する同じ色のタイルを検索する関数
を作っていきます

今回はタイルを削除するために必要な関数を3つ作っていきます

同じカラーのタイルがあるチェックする関数

まず、MatchPuzzleSceneDirectorの一番下に
リストで指定された方向に同じカラーのタイルがあるチェックする関数
を追加します

// 指定された方向のマッチしたタイルを返す
List<Vector2Int> GetMatchTiles(Vector2Int index, List<Vector2Int> directions)
{
    // チェック済のマッチタイル
    List<Vector2Int> matchTiles = new List<Vector2Int>();

    // 開始位置を追加
    matchTiles.Add(index);

    // このカラーと同じカラーを探す
    int mainColor = GetFieldTile(index.x, index.y).ColorType;
    
    // 全方向分調べる
    foreach (var dir in directions)
    {
        // 開始位置
        Vector2Int checkIndex = index + dir;

        // まだ追加されていなければループ
        while (!matchTiles.Contains(checkIndex))
        {
            // タイルデータ取得
            TileController tile = GetFieldTile(checkIndex.x, checkIndex.y);

            // 配列オーバー or データなし
            if (!tile) break;
            // 違う色なら終了
            if (mainColor != tile.ColorType) break;

            // 同じ色なら追加
            matchTiles.Add(checkIndex);

            // 調べる位置を進める
            checkIndex += dir;
        }
    }

    return matchTiles;
}

解説

この関数は
指定されたインデックスと方向で、同じ色のタイルを検索する
関数です。
引数のindexが開始位置のインデックス座標で、directionsのリストが方向になります。

    // チェック済のマッチタイル
    List<Vector2Int> matchTiles = new List<Vector2Int>();

    // 開始位置を追加
    matchTiles.Add(index);

まずは関数から返す同じカラーのタイルのリストを初期化して
開始位置のタイルをそのリストに追加しています。

    // このカラーと同じカラーを探す
    int mainColor = GetFieldTile(index.x, index.y).ColorType;

ここで、開始位置のタイルの色をmainColorに代入しています。
この色と同じ色のタイルをmatchTilesに追加していきます。

    // 全方向
    foreach (var dir in directions)
    {

    }

リストで指定された各方向に向かって連続する同じ色のタイルを探します。
directionsには、例えば
Vector2.rightとVector2.leftのリストや
Vector2.upとVector2.downのリスト
といった方向のセットが渡される想定です。

        // 開始位置
        Vector2Int checkIndex = index + dir;

        // まだ追加されていなければループ
        while (!matchTiles.Contains(checkIndex))
        {
            // タイルデータ取得
            TileController tile = GetFieldTile(checkIndex.x, checkIndex.y);

            // 配列オーバー or データなし
            if (!tile) break;
            // 違う色なら終了
            if (mainColor != tile.ColorType) break;

            // 同じ色なら追加
            matchTiles.Add(checkIndex);

            // 調べる位置を進める
            checkIndex += dir;
        }

で、その中でdirで指定された1方向に向かってwhileでループを開始して
同じカラーを探します。

        // 開始位置
        Vector2Int checkIndex = index + dir;

開始位置であるindexは既にmatchTilesに追加済みなので
方向が指定されているdir分1つずらしてループを開始します。

        // まだ追加されていなければループ
        while (!matchTiles.Contains(checkIndex))

ループの終了条件は
既にリストに追加済み、またはタイルがないか、そのタイルが違う色の場合
になります。

            // 同じ色なら追加
            matchTiles.Add(checkIndex);

どれにも引っかからなかった場合、条件を満たした同じ色ということで
matchTilesリストに追加します。

            // 調べる位置を進める
            checkIndex += dir;

whileループの最後の行で、チェックするインデックスの位置をずらして
次のインデックスの場所でも同じ処理を繰り返していきます。

例えばVector2.rightがdirectionsのリストで指定されている場合は
現在のインデックス番号から1つ右のインデックス番号にずれます。

上記の処理をwhileで繰り返してループの終了条件になったら
また外側のforeachに戻って
リストで指定された別の方向も同じように処理します。

最後に、色がマッチしたタイルのリストを返しています。

リストに新しいアイテムのみを追加する関数

ここから先は

1,654字 / 1画像

この記事が参加している募集

ゲームの作り方

この記事が気に入ったらサポートをしてみませんか?