扱いやすい3Dモデルを作るために (Blender, Unity)

**農工大アドカレ1日目!!** 

学園祭に向けてサークルで制作したゲームで、5体の3Dキャラとそのモーションを作って動かしていたので、これらの経験から得た知見をまとめました。

読者の対象は「多少 Blender に触れたことのある技術系の人」となります。特に、Blender で作ったモデルを Unity (や WebGL)で扱うことを想定しています。

▼ どんなゲームを作ったか興味のある人はぜひリポジトリもご覽ください

https://github.com/tuatmcc/SchoolFestival2024_Unity

## (1) blendファイル・fbxファイルの管理について

### フォルダ分け

最終的にUnityに持っていったときに下のようになる想定をして、モデルごとにフォルダを用意します。

```
モデル名/
├── textures/
│ ├── テクスチャ1
│ └── ...
├── Materials/
│ ├── マテリアル1
│ └── ...
└── モデル.fbx
```

blendファイル単体ではなく、フォルダで管理しておくことで、Unityでモデル同士のマテリアルが混ざることを防げます。

### バックアップ

伝家の宝刀「**Git**」を使いましょう。

Blender は不可逆な操作が非常に多いですから、一日の終わりや、作業の区切りごとにコミットを打って戻れるようにしておくと安心です。メリットは以下の通りです。

* blendファイルの複製などの古典的なバックアップがいらない
* 簡単にロールバックできる
* GitHub に上げればオンラインバックアップになる

GitHub に上げる都合で1ファイルが 100MiB を超えると困るほか、マージ等はできませんが、Git操作が分かるのであれば使わない理由はないと思います。

## (2) Blender内でのデータの整理について

Unity班やWeb班に優しいモデルをエクスポートしたいですよね。

### 命名

オブジェクト・メッシュ・マテリアル・テクスチャ・アクション等には適切な名前をつけてあげましょう。Material.001,  Material.002 なんてマテリアルを渡されたら辛くなってしまいますので…。

今回、5種類のキャラのgltfをWeb班に渡したのですが、キャラ間で命名が異なっていたり、Typoをしたりしていて申し訳ないです。

![1000004047.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/d7d6d12b-e309-d637-be1c-4ce7e4cccee5.jpeg)
▲WEB班の苦労が見える(すみません)

### 原点の位置

基本的にはオブジェクトの内側にそのオブジェクトの原点あると良いと思います。立体の中心か、床に置くものであれば底面の中心にすることが多い気がします。

また、プログラム側で回転処理をするものは回転中心が原点になっていると優しいです。例えば、ドアオブジェクトは蝶番の位置に(Blenderの)Z軸が来るようにします。他にも、キャラクターのアクセサリの原点はキャラクタの原点(足元)に合わせるようにしました。

### スケールを1にする

私の方ではこの点は問題にならなかったのですが、背景オブジェクト配置の際に話題になっていたので触れておきます。

https://baku-blog.com/blender30-scale/

### 余計なリソースの削除

使っていないマテリアルやテクスチャ等は消しましょう。File → Clean Up → Purge Unused Data から削除できます。

Unpack Resources をした際に余分なテクスチャファイルが出来たり、モデルをインポートし直したときに末尾に _1 や .001 とついた別マテリアルが生成されてしまったりします。

また、まとめられるマテリアルやメッシュは一つになっている方が良いです。処理速度にも影響しますし、単純に見通しもよくなります。

## (3) Blender で出力したfbxの移動について

**`cp` コマンドを使用します。**
(もちろん私がターミナルに住み着いているが故の結論でもありますが…)

Unity に fbx を持ち込んだ際、`.meta` が生成され、fbx に対する設定はすべてこの meta ファイルに記録されます。しかし、fbx を新しいものに更新しようとしたときにこの meta ファイルが厄介物となります。

https://note.com/4ozef/n/n2bb0bb7b992d

考え方は上の記事と同じで、Unity の GUI 操作を介さずファイルを上書きすれば解決します。ここで、cp コマンドを使うことで既存の fbx ファイルを上書きする形でコピーでき、fbx の設定項目を維持したままモデルの移動・更新ができます。テクスチャは -r オプションでディレクトリごとコピーしてしまって大丈夫です。

# (4) Unity でのモデルの追加設定について

単にfbxファイルをUnityに持ってくるだけでモデルが想定通り使えるということはまずありません。Unityで再現したい部分を改めて設定する必要があります。

### Humanoid化・スプリングボーン

Unity には Humanoid という人型の共通フォーマットがあり、Humanoid として扱うことで、他の人型モデルのアニメーションを流用することができます。

https://note.com/nanash_/n/n54f08d88ad94

また、今回のキャラクターの髪や服、しっぽなどの揺れ物も設定する必要があります。今回は [UniVRM](https://github.com/vrm-c/UniVRM) の VRM Spring Bone を使用しました。

### シェーダー

Blender と Unity でシェーダーの互換性はありません。最終的な見た目はUnity側で設定する必要があります。Unity にも Blender の Shader Node と似た Shader Graph というものがあり、ノード形式でシェーダーを作ることもできます。今回は自分でシェーダーを組むことはせず、 Blender では [TRIToon](https://booth.pm/ja/items/4435317), Unity では [lilToon](https://lilxyzw.github.io/lilToon/) を使用しました。(WebGL側はWeb班がいいかんじにやってくれました)

### Prefab化

最後に、これらの設定が終わったモデルをPrefab化しておきます。このようにしておくことで、エンジニアさん達がこの Prefab を継承した Prefab Variant を作り、使用することができるようになります。

# (5) モデルデータの受け渡しについて

できるだけ使いやすい形でデータを渡してあげたいですよね。また、Unity では Blender のシェーダーが剥がれてしまいますので、思い通りの見た目に設定を済ませてから渡したいこともあると思います。

### 1. fbxを送りつける

お手軽ですが……。相手がただモデルデータだけ欲しいときや、こちらが Unity で見た目を確認するのを面倒臭がったときにありがちです。
![164dd615-1eb6-4514-a111-0fdd2de77663-1_all_1454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/48e155cf-55a1-2b15-569c-0fb273347613.png)

(酷い....)

### 2. Unityプロジェクトに直接コミットする

これがベストじゃないでしょうか。モデルの設定も済ませた上で GitHub でプルリクを立てましょう。

もし fbx を置くだけで設定はしないつもりでも、一旦 Unity プロジェクトを起動し、.meta を自動生成させてコミットに含めた方が混乱を避けられます。

### 3. unitypackage にする

これは特に、別のUnityプロジェクトから丸ごと移植してきたいときに便利です。関連するアイテムや `.meta` を自動で同梱してくれるため壊れにくく、`.unitypackage` を別プロジェクトでインポートしたり、人に送ったりして使うことができます。

https://creator.cluster.mu/2020/11/11/export-unitypackage/

# まとめ

以上、よりよいモデルを作るための Tips でした。
最後に私が作成したモデルとアニメーションの入ったゲームのワンカットを見ていってくれると嬉しいです。可愛いので。

<iframe width="560" height="315" src="https://www.youtube.com/embed/F4FRI7H__14?si=MhRhDMwYpt9AZwsa" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

農工大アドカレ、明日の枠が埋まっていなくて先行きが不安だ...