ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

Blenderで瓦礫を作りUnityのTerrainで使用する

BlenderのCell Fractureアドオンで瓦礫のオブジェクトを作り、UnityのTreeとして利用する方法をの紹介です。

Blenderで瓦礫を作る

まずは瓦礫のもとになるCubeオブジェクトと床となるPlaneオブジェクトを用意します。カメラとライトはいらないので削除しておきましょう。Cubeオブジェクトはデフォルトのサイズでz=2の位置にしておきます。Planeオブジェクトもスケールを大きくしておきましょう。

f:id:prupru_prune:20220319211329p:plain
オブジェクトの準備

Cubeオブジェクトを瓦礫にするために Cell Fracture というアドオンを有効にしましょう。アドオンの設定はEdit->Prefarencesから行うことが出来ます。Edit->Prefarencesをクリックすると新しいウインドウが現れるので、Aoo-onsを選択して検索バーから「Cell Fracture」と検索しましょう。一覧に出てきたCell Fractureのチェックボックスにチェックを入れると設定完了です。

f:id:prupru_prune:20220319211906p:plain
Edit->Prefarencesの場所

f:id:prupru_prune:20220319211928p:plain
Cell Fracture アドオンにチェックを入れる

Cell Fractureアドオンを有効にするとオブジェクトモードでObject->Quick Effects->Cell Fractureを選択できるようになります。Cell Fractureをクリックすると設定用のウインドウが開くので、パラメーターをいい感じにいじった後にOKを押すと新たに破片となったオブジェクトが生成されています。すごい!

f:id:prupru_prune:20220319212216p:plain
Cell Fractureの場所

f:id:prupru_prune:20220319212721p:plain
Cell Fractureの設定画面. 適当でもいい感じになる

f:id:prupru_prune:20220319212755p:plain
Cubeオブジェクトが破片に分割されている

ここからは物理シミュレーションによって破片を床に落下させます。Original_cell(Originalは元のオブジェクト名)というオブジェクトのPhysics PropertiesのRigidbodyを有効にしましょう。

f:id:prupru_prune:20220319213313p:plain
Physics PropertiesのRigidbodyを有効に

その後残りの破片オブジェクト全てを選択(Shift+Click or Ctrl+Click)した状態でOriginal_cellをCtrl+Clickすることでもう一度Original_cellをアクティブにします。この状態でF3ボタンを押し検索バーに「Copy」と打つとObject->Rigid Body->Copy from Activeが見つかると思うのでそれをクリックします。するとなんとOriginal_cellのRigid Bodyの内容がほかの破片オブジェクトにも適用されます。

f:id:prupru_prune:20220319213929p:plain
Copy from ActiveでRigid Bodyの設定をコピー

あとはPlaneオブジェクトにもRigid Bodyを適用し、Settings->Dynamicsのチェックを無効にします。こうすることでPlaneオブジェクトは位置が固定されたコライダーとして機能します。

f:id:prupru_prune:20220319225059p:plain
PlaneオブジェクトのRigid BodyはDynamicsを無効にする

ここまで来たらスペースボタンを押してシミュレーションを実行しましょう。するとPlaneオブジェクトに衝突した破片が良い感じにばらけてくれます。より乱雑にしたければ破片をより高いところから落とすとよいでしょう。

f:id:prupru_prune:20220319214456p:plain
物理シミュレーション後の破片. オリジナルのCubeオブジェクトは非表示にしている

現時点では破片はそれぞれ独立したオブジェクトなので、お好みでオブジェクトを結合して一つのオブジェクトにしましょう。1つのオブジェクトとしてまとめたい破片を選択し、Ctrl+jを押すことで1オブジェクトとして結合することが出来ます。最後に、結合したオブジェクトを.fbx形式でエクスポートしましょう。必要なオブジェクト以外すべて削除したのち、File->Export->Fbx (.fbx)をクリックすれば完了です。

f:id:prupru_prune:20220319215146p:plain
Export->Fbx (.fbx)の場所

場合によってはImport-Export FBX Format アドオンを有効にする必要があるかもしれませんが、方法はCell Fracture アドオンと同じです。

f:id:prupru_prune:20220319215310p:plain
Import-Export FBX Formatアドオン

無事.fbx形式でエクスポートすることが出来ました。

f:id:prupru_prune:20220319215553p:plain
.fbxの確認

瓦礫をより細かくしたい場合はあらかじめCubeオブジェクトの頂点をSubdivideしておきましょう。

UnityのTerrain Treesで利用する

ここからはUnity上での操作になります。適当なプロジェクトを作成し、ヒエラルキーウインドウ上で右クリック->3D Object->TerrainでTerrainを新規に作成します。

InspectorからTerrainを見てみると5つの項目があります(Unity 2019.4f)が、これらの項目は左から順にCreate Neigbor Terrains, Paint Terrain, Paint Trees, Paint Details, Terrain Settingsとなっています。それぞれ、隣接するTerrainの作成、地形の高さ編集、3Dオブジェクトのペイント、表面のペイント、サイズや解像度などの設定に利用されます。

お好みですが、Terrain SettingsのMesh ResolutionからWidthとLengthを100程度にしてデフォルトよりも小さくしておきましょう。その方が操作がしやすくなります。

f:id:prupru_prune:20220319223116p:plain
Terrainで編集可能な項目

f:id:prupru_prune:20220319223209p:plain
Terrain Settingsからサイズを調整

さて、ここで先ほど作成した瓦礫の.fbxモデルをUnityにインポートしましょう。続いてヒエラルキーウインドウ上で右クリック->3D Object->TreeによりTreeオブジェクトを作成します。そうするとOptimizedTreeという名前のTreeオブジェクトが作成されるので、このオブジェクトのInspector->Mesh(Mesh Filter)のMeshにインポートしたモデルのメッシュをドラッグ&ドロップします。注意点ですが、ドラッグ&ドロップするのはモデル内のメッシュであって.fbxモデルそのものではありません。その後Inspector->TransformのScaleをお好みで調整した後、このオブジェクトをプロジェクトウインドウにドラッグ&ドロップしてプレハブ化しておきましょう。Scaleですが、私の場合100くらいがちょうどよかったです。

f:id:prupru_prune:20220319225646p:plain
TreeオブジェクトのMeshにインポートしたモデルのメッシュをD&D

再びTerrainのInspectorに戻りPaint Trees->Edit Trees->Add Treeを選択するとオブジェクトを選択する画面が出てくるので、先ほどのOptimized Treeのプレハブを選択します。

f:id:prupru_prune:20220319224346p:plain
Add Treeの場所

ブラシサイズや密度を適当に決めてTerrain上でクリックすると以下のように瓦礫をペイントすることが出来ます。

f:id:prupru_prune:20220319224830p:plain
ペイント成功

瓦礫というよりテトラポッドですね。ありがとうございました。

参考