kamihi のブログ

作成したゲームの情報や作り方を掲載します

UnityでMinecraft風ゲームを作る その7「チャンクのメッシュを分割し、制限を無くしていく」

今回は「チャンクのメッシュを分割し、制限を無くしていく」です。

今現在、Unityのゲームオブジェクトの頂点数は65535という制限があります。

頂点の多い3Dデータをインポートすると制限を超えないよう分割されます。

作成中Minecraft風ゲームのチャンクの大きさは幅8、高さ32でした。この控えめの数値はゲームオブジェクトの頂点数の制限を超えないようするための配慮でした(SetVerticesで制限以上は無視されて作られてしまう)

今回は頂点数が60000くらいになったらメッシュを分割し、チャンクの大きさの制限を無くしていこうと思います(もちろんマシンスペックの制限はありますが・・・)


※2019.01.16 追記

mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;

上記をSetVertices前に記入することで制限を上げることができるので、ゲームオブジェクトを分ける必要がないことが判明しました。


ソースや設定方法は長くなるので、Googleドライブに保存しておきました。 そこからダウンロードしてみてください。

UnityでMinecraft風ゲームを作る - Google ドライブ


f:id:zekutasiki:20190104140300p:plain
実行結果

ぱっと見は変わりませんが、高さ制限が128になっていて、生成されるゲームオブジェクトChunkの配下にMeshが存在するのがわかります。 複雑な地形を生成するとMeshが増えていきます。


スクリプトの主な変更は以下の通りです

  • Chunk.cs 複数のメッシュを作成できるよう変更
  • ChunkManager.cs ゲームオブジェクトChunkの配下にMechオブジェクトを作成するよう修正
  • EnumData.cs 変更なし
  • PlayerControl.cs 変更なし
  • TargetControl.cs 変更なし

Chunk.cs

        //リストのリストに変更、複数のメッシュを作成することを可能にする
        List<List<Vector3>> verticeList = new List<List<Vector3>>();
        List<List<int>> faceList = new List<List<int>>();
        List<List<Vector2>> uvList = new List<List<Vector2>>();
        int faceCount;
        int listCount;

データの持ち方を修正しました。これに対応するよう修正が入ってます。

            //頂点数が限界値に近ずいた時、新たなメッシュを作成するために、初期化する
            if (60000 < faceCount)
            {
                faceCount = 0;
                listCount++;
                verticeList.Add(new List<Vector3>());
                faceList.Add(new List<int>());
                uvList.Add(new List<Vector2>());
            }

この辺りは、頂点数の制限が近づいた時の処理です

今回は以上です。

次回はブロック破壊アニメーションです。