はじめに
擬似インスタンシングでの、Voxelの作成を簡単にするかつ、コード自体、すごくシンプルなので、このコードを元に、使用者自身が、改変し、独自の仕様に仕上がるような便利プログラムを作成しました。
だいぶ古い技術ですので、Asset Storeや、qiita、ブログなどで、同じような物あると思いますが、以下のような、状況に対して、作成を試みました。
・geometory shader/instancing/compute shaderが、使えない環境での開発、
Macや、古い実機で、これらをサポートしていない、端末
・Unityのバージョンアップにより、コードを自分で、メンテナンスできないことを回避
・コードベースで、ゴリゴリやりたい人
・Visual Art作品作りたい人
開発環境
Unity5.3以上
5.4/5.5/5.6とかで、テストしていないので、Meshの更新あたりのプログラムに変更があれば、修正必要です。どこかで、5.5などで、確認して、問題あれば、修正して、PUSHしておきます。
ソースコード
https://github.com/yasuohasegawa/SimpleVoxel
ちょっと訳ありで、コメントとか、英語です。ご容赦ください。
おまけで、Planeのシーンに、パーティクル的なやつをやりたい人向けの、サンプルありです。
Unity純正の、Particleシステムあるので、車輪の再発明みたいですが、コードベースで、ゴリゴリ、やりたい人向けです。
使い方
- 空のGameObjectをシーンに追加
- MeshRendererと、MeshFilterを追加
- Resourcesに頂点カラーを設定できる、ColorMatと、テクスチャを設定できる、CubeMatがあるので、どちらか、設定したいものを設定もしくは、自前で、対応する。
- Voxel.csを追加
- ブロックを制御させるためのスクリプトを追加 ここは、Voxelシーンで使っている、VoxelTest.csもしくは、Terrainシーンで使っている、TerrainSample.csを参考にしてください。
ブロックへのテクスチャの設定について
サンプルは、512x512のテクスチャに、4x4で、ブロックの面のテクスチャを設定できるようになっています。数を増やしたい場合は、NxNで、好きな数/好きなサイズでテクスチャを作成後、Voxel.csの、m_texUnit変数の、0.24の箇所を変更してください。この、0.24は、uv座標の、分割数になります。
「m_texUnit = 1/設定したいブロックのテクスチャの数n」で、割り出します。
その後の、UVテクスチャの、割り当ては、2Dベクトルで、左上から、new Vector2(0,0)、その隣、new Vector2(1,0)などで、指定したいテクスチャを割り当てます。
今回作成したVoxel.csクラスでは、マインクラフトのような、テクスチャの設定、top面と、そのほかの面を指定できるのと、すべて同じテクスチャで設定できる、メソッドを用意してあります。
iphone5での動作検証結果
カメラ外(クリッピングされているところ)で表示されるcube含めた場合(Meshの更新なし):
cubeの数: 10万
FPS: 約30
メモリ: 約230MB
※カメラ外のcubeは、クリッピングされるので、FPSは出ますが、メモリが、ちょっと厳しい。
実際は、一度に生成させる場合は、端末によりますが、数は、半分以下に減らす必要はありかと。
カメラに表示が収まっているcubeかつ、動かして、頂点情報を更新させた場合:
cubeの数: 2500
FPS: 約30
メモリ: 約8MB
Terrain sceneの実行結果の見た目
その他
コライダーは、つけてません、必要あれば、使用者自身で、対応いただければとです。
移動/回転/拡大の箇所は、個々に、制御できますが、頂点シェーダーで、それぞれ、動かすように、するのも、良いかもです。
単純に、Mesh一つで、いくつもの、Cubeを作成しているだけなので、よく見かける、Voxelの作り方とは、違います、ご容赦ください。