回答:
あなたのRAMはあなたの限界ですです。
次のテストは、これらの仕様を持つシステムで実行されました。
これは、単一のタイル(32x32ピクセル)でタイルマップを埋めることでタイルマップを拡大するスクリプトです。このメソッドGrow()
は、現在のマップに別の列と別の行を追加します。このメソッドは、更新ごとに100回呼び出されます。
public class TileTest : MonoBehaviour {
public Tile tile;
private Tilemap tilemap;
public int currentSize;
void Start () {
tilemap = GetComponent<Tilemap>;
Grow();
}
void Update() {
for (var i = 0; i < 100; i++) {
Grow();
}
Debug.Log(currentSize);
}
private void Grow() {
for (int x = 0; x < currentSize; x++) {
tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
}
for (int y = 0; y < currentSize; y++) {
tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
}
tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
currentSize++;
}
}
数分後、コンピューターのメモリーが不足し、Unityがクラッシュしました。その時点では8400x8400(70ミリオン)のタイルであり、タスクマネージャーによるとUnity.exeは11 GBをわずかに超えるRAMを消費していました。
まあ、しかしまばらなマップはどうですか?
以下は、100タイル単位で増加するxおよびy座標に単一のタイルを配置する別のスクリプトです。
public class TileTest : MonoBehaviour {
public Tile tile;
private Tilemap tilemap;
public int currentSize;
void Start () {
tilemap = GetComponent<Tilemap>();
}
void Update() {
tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
currentSize+= 100;
}
}
実際、Unity.exeのメモリフットプリントはほとんど増加しなかったため、空のタイルセットセルにはRAMはほとんど必要ありません。ただし、タイルセットが成長するにつれてFPSは低下し続けました。30000x30000で60 Fps、60000x60000で30 Fps、90000x90000で15 Fpsに達しました。テストゲームの実行中にスクリプトを削除しても、FPSは低いままでした。したがって、この速度低下はタイルマップの変更によるものではありません。それは単にそれをレンダリングすることからでした。そのため、本当に巨大なオープンワールドゲームを作成する場合、実行時に作成および破棄する複数の小さなタイルマップを使用する必要があります。
結論: 大きくてもほとんど空のタイルマップは、RAMをあまり使用しませんが、ほとんどがカメラビューポートにない場合でも、レンダリングのボトルネックになります。
次に、特定のサイズのタイルマップを生成するこのスクリプトを試しました。
public class TileTest : MonoBehaviour {
public Tile tile;
public int xSize;
public int ySize;
void Start () {
Tilemap tilemap = GetComponent<Tilemap>();
for (int x = 0; x < xSize; x++) {
for (int y = 0; y < ySize; y++) {
tilemap.SetTile(new Vector3Int(x, y, 0), tile);
}
}
}
}
このスクリプトを使用して、8192x8192マップを生成しました。数分かかりましたが、スクリプトが完了すると、安定した95 Fpsで実行されました。
結論:少なくともゲーム用PCでは、数百万のタイルを含むマップが実現可能です。
Update
生成中に-methodのままにならないため、生成が完了するまでゲームとUnityエディターはフリーズします。マップの生成中にゲームをレスポンシブにしたい場合は、生成をコルーチンに移動します。コルーチンは一度に1つのチャンクを生成し、それらの間で処理を行います。