Garakuta開発メモ

忘れっぽい自分に向けた開発メモ

Unity L-System 2Dについて

以前作成したL-Systemを使用した2D樹木作成についての記録です。(Blogの記入練習を兼ねて)

  • Unityプロジェクトのソースコード一式はGitHubに格納しています。
  • L-System(Lindenmayer system)については、どこかに詳しい情報が記載されていると思いますので、そちらを参照願います。

概要

2D Platformゲーム等でプロシージャルなステージ生成に使うことを目的として、樹木mesh生成を行う処理を作成しました。 設定された生成ルール定義ファイルを元に、MeshRendererまたはSkinnedMeshRendererに生成したmeshを登録します。

  • 乱数生成にはXorShiftを利用(XORandomクラス)
  • L-Systemルール定義ファイルはPlantConfigクラスをScriptableObject登録して使用
  • Spriteをmeshのuv情報として使用します。

f:id:garakuta-works:20171224110326g:plain

使い方

詳細はUnityプロジェクトファイルのSampleシーンを参照

  • GameObjectにPlantクラスをアタッチします。
  • Assets > Create > Custom > Create Plant Config でルール定義ファイルを作成、L-SystemルールやSprite参照を登録します。
  • 登録したルール定義ファイルはPlantクラスInspectorのRef Configにセットします。
  • MeshFilter/MeshRendererまたはSkinnedMeshRendererをアタッチして、PlantクラスInspectorのRef Mesh FilterかRef Mesh Rendererへ参照をセットします。 (Sampleでは子GameObjectにセットしていますが、Plantと同じGameObjectへのアタッチでも構いません)
  • MeshFilter、SkinnedMeshRendererにはマテリアルをセットします。
  • 実行時のStartイベントや、Inspectorの「Create L-System Plant」を実行することで、樹木meshが生成されます。
  • PlantのRandom Seedが0の場合は実行毎にランダム生成されますが、0以外の場合はシード値として使用し同じ生成がなされます。

L-Systemルール

キーワード 動作
F Forward 枝を伸ばす
G Generate Fと同じ、生成時のキーワード置き換えに利用
+ Left 左に回転する
- Right 右に回転する
[ Push 分岐作成
] Pop 分岐終了

meshにはボーン参照情報も含んでいるため、将来的には時間とともに樹木が成長していくような要素も組み込みたいところです。

github.com