農工大アドカレ1日目!!
学園祭に向けてサークルで制作したゲームで、5体の3Dキャラとそのモーションを作って動かしていたので、これらの経験から得た知見をまとめました。
読者の対象は「多少 Blender に触れたことのある技術系の人」となります。特に、Blender で作ったモデルを Unity (や WebGL)で扱うことを想定しています。
▼ どんなゲームを作ったか興味のある人はぜひリポジトリもご覽ください
(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をしたりしていて申し訳ないです。
原点の位置
基本的にはオブジェクトの内側にそのオブジェクトの原点あると良いと思います。立体の中心か、床に置くものであれば底面の中心にすることが多い気がします。
また、プログラム側で回転処理をするものは回転中心が原点になっていると優しいです。例えば、ドアオブジェクトは蝶番の位置に(Blenderの)Z軸が来るようにします。他にも、キャラクターのアクセサリの原点はキャラクタの原点(足元)に合わせるようにしました。
スケールを1にする
私の方ではこの点は問題にならなかったのですが、背景オブジェクト配置の際に話題になっていたので触れておきます。
余計なリソースの削除
使っていないマテリアルやテクスチャ等は消しましょう。File → Clean Up → Purge Unused Data から削除できます。
Unpack Resources をした際に余分なテクスチャファイルが出来たり、モデルをインポートし直したときに末尾に _1 や .001 とついた別マテリアルが生成されてしまったりします。
また、まとめられるマテリアルやメッシュは一つになっている方が良いです。処理速度にも影響しますし、単純に見通しもよくなります。
(3) Blender で出力したfbxの移動について
cp
コマンドを使用します。
(もちろん私がターミナルに住み着いているが故の結論でもありますが…)
Unity に fbx を持ち込んだ際、.meta
が生成され、fbx に対する設定はすべてこの meta ファイルに記録されます。しかし、fbx を新しいものに更新しようとしたときにこの meta ファイルが厄介物となります。
考え方は上の記事と同じで、Unity の GUI 操作を介さずファイルを上書きすれば解決します。ここで、cp コマンドを使うことで既存の fbx ファイルを上書きする形でコピーでき、fbx の設定項目を維持したままモデルの移動・更新ができます。テクスチャは -r オプションでディレクトリごとコピーしてしまって大丈夫です。
(4) Unity でのモデルの追加設定について
単にfbxファイルをUnityに持ってくるだけでモデルが想定通り使えるということはまずありません。Unityで再現したい部分を改めて設定する必要があります。
Humanoid化・スプリングボーン
Unity には Humanoid という人型の共通フォーマットがあり、Humanoid として扱うことで、他の人型モデルのアニメーションを流用することができます。
また、今回のキャラクターの髪や服、しっぽなどの揺れ物も設定する必要があります。今回は UniVRM の VRM Spring Bone を使用しました。
シェーダー
Blender と Unity でシェーダーの互換性はありません。最終的な見た目はUnity側で設定する必要があります。Unity にも Blender の Shader Node と似た Shader Graph というものがあり、ノード形式でシェーダーを作ることもできます。今回は自分でシェーダーを組むことはせず、 Blender では TRIToon, Unity では lilToon を使用しました。(WebGL側はWeb班がいいかんじにやってくれました)
Prefab化
最後に、これらの設定が終わったモデルをPrefab化しておきます。このようにしておくことで、エンジニアさん達がこの Prefab を継承した Prefab Variant を作り、使用することができるようになります。
(5) モデルデータの受け渡しについて
できるだけ使いやすい形でデータを渡してあげたいですよね。また、Unity では Blender のシェーダーが剥がれてしまいますので、思い通りの見た目に設定を済ませてから渡したいこともあると思います。
1. fbxを送りつける
お手軽ですが……。相手がただモデルデータだけ欲しいときや、こちらが Unity で見た目を確認するのを面倒臭がったときにありがちです。
(酷い....)
2. Unityプロジェクトに直接コミットする
これがベストじゃないでしょうか。モデルの設定も済ませた上で GitHub でプルリクを立てましょう。
もし fbx を置くだけで設定はしないつもりでも、一旦 Unity プロジェクトを起動し、.meta を自動生成させてコミットに含めた方が混乱を避けられます。
3. unitypackage にする
これは特に、別のUnityプロジェクトから丸ごと移植してきたいときに便利です。関連するアイテムや .meta
を自動で同梱してくれるため壊れにくく、.unitypackage
を別プロジェクトでインポートしたり、人に送ったりして使うことができます。
まとめ
以上、よりよいモデルを作るための Tips でした。
最後に私が作成したモデルとアニメーションの入ったゲームのワンカットを見ていってくれると嬉しいです。可愛いので。
農工大アドカレ、明日の枠が埋まっていなくて先行きが不安だ...