Godot モデル動的構築 自分の事例6
前回の続き。
マテリアルを作成するPaintboxの説明です。
下図の右端の箱~!
Paintboxはマテリアルを作成するクラスです。
Paintboxは(今のところ)staticクラスで、状態を持ちません。Miniature関係クラスや、ゲーム本体のMiniature使用クラスから依頼されて、マテリアルをnewして返します。
役割
Godotは、blendファイルインポート時に、自動でマテリアルを作ります。Godotユーザーはこのマテリアルのパラメータを変えたり、マテリアル自体を別のものに置き換えることができます。インポート設定を変えたり、インポート時にスクリプトを走らせて、セットアップをある程度自動化することもできます。
でもねえ、これ、う~~~ん・・・。自分には管理が大変。特に制作終盤、とても大変になりそうです。
なのでもう、インポート時に作られたマテリアルは、使わないことにしました。事前に作ったマテリアルを紐づけたりもしない。なのでインポート設定は全部デフォルトでいい。
大なり小なりマテリアルはゲーム中に多少作ることになるんだから、だったらマテリアルは全部実行時(ロード時)作成でいいのでは、と考えたのです。(どうなることやら。)
Godotが自動で作ったマテリアルは、不透明のStandardMaterial3Dリソースで、アルベドテクスチャがblend内と同一のものがセットされている以外は、ほぼデフォルト値のはずです。
Workshopはロードを担当するシングルトンクラスです。blendをロードして、データを抽出し、保持します。このとき、メッシュにセットされている自動生成マテリアルを破棄し、これをゲーム用に作り直してセットしなおします。その作り手がPaintboxです。
アーキタイプ
マテリアル名の接尾辞で、マテリアルのひな型=アーキタイプを判定します。各アーキタイプは、(Godotではなく一般的な意味での)シェーダーの種類と一対一で対応しています。
このひな型に、アルベドテクスチャを引き継いだものが、Boughのメッシュにセットされるマテリアルになります。
また、PaintboxはWorkshop以外のクラスからの依頼で、新規マテリアルを作成したり、既存マテリアルのアーキタイプ(一般的な意味でのシェーダ)を変えたりします。これはどんなゲームでも必須なはずです。
(今のところ)組み込みのアーキタイプは6つあります。下の画像の通りです。
ひとまずこの6つがあれば、作り始めるには十分と判断しました。
ビルボードやテクスチャアニメーションはマテリアルのパラメータを変更することで実現できます。
6つのアーキタイプは、(今のところ)どれもStandardMaterial3Dです。
主なパラメータは次の通りです。
テクスチャアニメの例
下記は、テクスチャアニメーションを使った炎VFXクラスの例です。MeshInstance3Dにアタッチする、Miniature派生クラスです。
これ自体はビルボード用の板ポリblendモデルを使います。炎なのでPaintboxに依頼して加算シェーダにしてもらって、テクスチャも4x4のアニメ用炎テクスチャにして、ビルボードモードにします。
その上で、SpriteAnimStateというクラスでアニメーションの状態を管理します。このクラスに分割数やパターン切り替わりの間隔秒数を入れておけば、適切なUVスケールとUVオフセットを毎フレーム返してくれるので、それをマテリアルパラメータにセットします。
拡張案
組み込みの6つのアーキタイプだけで、いろんなジャンルのゲームを作れるわけではありません。今作ってるゲームでも、追加のアーキタイプが必要になるでしょう。StandardMaterial3Dだけでなく、ShaderMaterialも使いたいしね。
Miniatureシステムはポンポコゲームズ用のクローズドなものですが、一応汎用ライブラリ的な建前で作ってるので、Paintboxを特定タイトル向けに特化したくはありません。なので、アーキタイプとその作り方を、追加したりオーバライドする仕組みを、そのうち入れたいなあと思ってます。
上記の画像のようにModderをセットする仕組みにするならば、Paintboxはstaticクラスではなく、Workshop同様にシングルトンにする必要があります。参照を保持させるために。
Godotでモデルを気楽(?)に管理・構築する仕組みの紹介、長くなりましたが、ひとまずここまで。
読んでくださってありがとうございます~~!