ペイントが完了したら、タイルマップの境界を手動で圧縮する必要があります。 こるか選択する必要がありますTilemapの階層表示、プレスを設定(ギア) ボタンをTilemap部品を選んで”圧縮Tilemapとなります。
も、ゲームボードを使用!● 私たちは、パート3でそれに戻って取得します。
パート2。 レベルデータ
同じシーンと同じゲームボードを再利用したいので、レベルデータはどこかに保管する必要があります。 そのための簡単な解決策は、各レベルをどのように構築するかを記述する単純なjsonファイルです。私たちが達成しようとしていることを理解することが重要です。
私は力学についていくつかの言葉を言わなければならない理由です。
ゲームでは、最初から最後までパスと一緒に移動しているオブジェクトがあります(ほとんどズマのように)、プレイヤーの目標はそれらのすべてを破壊す このチュートリアルでは、各レベルで一意になるこのパスを作成します。
さて、プロジェクトに戻ります。
スクリプトから実行時に外部データにアクセスするには、複数の方法があります。 ここでは、リソースフォルダを使用します
のは、新しいフォルダを作成してみましょう—ファイル—とサブフォルダのリソース。 これがデータを保持したい場所なので、新しいファイルレベルを作成します。jsonをそこに配置します。
チュートリアルの目的のために、各レベルを記述するためのフィールドは二つだけです。
- number—レベルを識別するためのint
- path—プログラムで作成 最初の値が開始点で、最後の値が終了点である値の配列。
これは私が使用するファイルです。 これらの値について心配しないでくださいpath、後でそれに来るでしょう。
{
"levels":
},
{
"number": 2,
"path":
},
{
"number": 3,
"path":
}
]
}
別のフォルダ—Scripts—を作成してみましょう。
コード内のファイルからデータにアクセスしたいので、そのためのモデルクラスが必要です。 最初のスクリプトLevelsData
を作成します。 Unityによってインスタンス化されることを意図していないため、MonoBehaviour
Start
Update
array
int
int array
注釈を入れることを忘れないでください。P>
public class LevelsData
{
public LevelData levels;
public class LevelData
{
public int number;
public int path;
}
}
いいですね、今、私たちは、ファイルとモデルを持っています。 次のステップは、1つを別のものに変換することです。 別のスクリプトGameZone
GameZone
オブジェクトにアタッチしましょう。 このスクリプトは、後でゲームボード全体を設定するために使用されます。P>
単一責任の原則に従ってくださいさらに別のスクリプトを作成しましょう—LevelsDataLoader
GameZone
オブジェクトにも添付します。このクラスは、データをロードし、キーがレベル番号であり、データがレベルデータ自体である辞書として返します。
public class LevelsDataLoader : MonoBehaviour
{
private const string LevelsPath = "Levels";
public Dictionary<int, LevelsData.LevelData> ReadLevelsData()
{
var jsonFile = Resources.Load(LevelsPath, typeof(TextAsset)) as TextAsset;
if (jsonFile == null)
{
throw new ApplicationException("Levels file is not accessible");
}
var loadedData = JsonUtility.FromJson<LevelsData>(jsonFile.text);
return loadedData.levels.ToDictionary(level => level.number, level => level);
}
}
これで、GameZone
スクリプトのデータにアクセスできるはずです。
public class GameZone : MonoBehaviour
{
private Dictionary<int, LevelsData.LevelData> _levelsData;
private LevelsDataLoader _dataLoader;private void Awake()
{
_dataLoader = GetComponent<LevelsDataLoader>();
}private void Start()
{
_levelsData = _dataLoader.ReadLevelsData();Debug.Log(_levelsData.Count + " levels have been stored in the dictionary!");
}
}
Unityに戻って、再生ボタンを押してコンソールを確認してください-「3つのレベルが辞書に保存されています!”
パート3。 ボードとデータを接続する
おめでとう、あなたはこのチュートリアルの最後と最も興味深い部分に達しました。 実際にボードとデータをどのように接続しますか? それを見つけるために読んでください!
まず、チュートリアルの最初の部分で作成されたhorizontal
start_stop
タイルをTilesフォルダの下のResourcesフォルダに配置しましょう。 次に、新しいスクリプトを追加します—TilesResourcesLoader
—実行時にそのフォルダからタイルをロードする静的ヘルパークラス。
public static class TilesResourcesLoader
{
private const string PathHorizontal = "horizontal";
private const string StartStop = "start_stop"; public static Tile GetPathHorizontalTile()
{
return GetTileByName(PathHorizontal);
} public static Tile GetStartStopTile()
{
return GetTileByName(StartStop);
} private static Tile GetTileByName(string name)
{
return (Tile) Resources.Load(name, typeof(Tile));
}
}
最後のステップとして、シーンの起動時にこれらのタイルをボードに配置する必要があります。 GameZone
GameZone
に追加し、startの値を1に変更しましょう。 私は最初にあなたに最終的なスクリプトを表示します:
public class GameZone : MonoBehaviour
{
public int Level; private const int FieldLineSize = 11;
private const int FieldTotalTiles = FieldLineSize * FieldLineSize;
private Dictionary<int, LevelsData.LevelData> _levelsData; private void Start()
{
_levelsData = GetComponent<LevelsDataLoader>().ReadLevelsData();
SetupTiles();
} private void SetupTiles()
{
var baseLevel = GetComponentsInChildren<Tilemap>(); var localTilesPositions = new List<Vector3Int>(FieldTotalTiles);
foreach (var pos in baseLevel.cellBounds.allPositionsWithin)
{
Vector3Int localPlace = new Vector3Int(pos.x, pos.y, pos.z);
localTilesPositions.Add(localPlace);
} SetupPath(localTilesPositions, baseLevel);
} private void SetupPath(List<Vector3Int> localTilesPositions, Tilemap baseLevel)
{
var path = _levelsData.path;
var pathHorizontalTile = TilesResourcesLoader.GetPathHorizontalTile();
var first = path.First();
var last = path.Last();
foreach (var localPosition in localTilesPositions.GetRange(first, Math.Abs(first - last)))
{
baseLevel.SetTile(localPosition, pathHorizontalTile);
} var startStopTile = TilesResourcesLoader.GetStartStopTile();
baseLevel.SetTile(localTilesPositions, startStopTile);
baseLevel.SetTile(localTilesPositions, startStopTile);
}
}
うわー、それは多くのアクションです! 私はそれを介してあなたを歩いてみましょう。
SetupTiles
メソッドでは、タイルの位置を知る必要があるため、最初にtilemap自体を取得する必要があります。 これを達成するために、最初のタイルから始まるタイルのすべての位置を返すtilemap.cellBounds.allPositionsWithin
メソッドを使用しています。
各番号は、localTilesPositions
リスト内のインデックスを表す次の図を参照してください。div>
あなたは私たちがパスで使用する値を覚えていますか
Levels.json
? あなたがすでに推測しているかもしれないように、これらの値は配列内のタイルのインデックスです。 あなたが今する必要があるのは、あなたがレベルを構築するのを助けるためにチートシート画像を持っていることです。 それは私が開発中に使用してきたものです:div>
この例では、パスに水平線を設定しています。SetupPath
メソッドを参照してください。 重要な部分は次のループです。
foreach (var localPosition in localTilesPositions.GetRange(first, Math.Abs(first - last)))
{
baseLevel.SetTile(localPosition, pathHorizontalTile);
}
ここでは、localTilesPositions
この場合、目的のタイル水平を設定するものを見つけます。
注意してください!
GetRange
start_stop
タイルが使用されます。div>
最終結果
最終結果
最終結果
figcaption>
今、GameZone
スクリプトのレベル番号フィールドを1から2または3に変更しようとすると、パスが指定されたレベルに対して適切にロードされていることがわかります。
その後