見出し画像

Godot モデル動的構築 自分の事例6

前回の続き。

マテリアルを作成するPaintboxの説明です。
下図の右端の箱~!

一番右がPaintbox

Paintboxはマテリアルを作成するクラスです。


Paintboxは(今のところ)staticクラスで、状態を持ちません。Miniature関係クラスや、ゲーム本体のMiniature使用クラスから依頼されて、マテリアルをnewして返します。

Paintboxの位置づけ

役割

Godotは、blendファイルインポート時に、自動でマテリアルを作ります。Godotユーザーはこのマテリアルのパラメータを変えたり、マテリアル自体を別のものに置き換えることができます。インポート設定を変えたり、インポート時にスクリプトを走らせて、セットアップをある程度自動化することもできます。

インポート時にマテリアルを設定

でもねえ、これ、う~~~ん・・・。自分には管理が大変。特に制作終盤、とても大変になりそうです。
なのでもう、インポート時に作られたマテリアルは、使わないことにしました。事前に作ったマテリアルを紐づけたりもしない。なのでインポート設定は全部デフォルトでいい。
大なり小なりマテリアルはゲーム中に多少作ることになるんだから、だったらマテリアルは全部実行時(ロード時)作成でいいのでは、と考えたのです。(どうなることやら。)

Godotが自動で作ったマテリアルは、不透明のStandardMaterial3Dリソースで、アルベドテクスチャがblend内と同一のものがセットされている以外は、ほぼデフォルト値のはずです。
Workshopはロードを担当するシングルトンクラスです。blendをロードして、データを抽出し、保持します。このとき、メッシュにセットされている自動生成マテリアルを破棄し、これをゲーム用に作り直してセットしなおします。その作り手がPaintboxです。

インポート時に自動作成されたマテリアルを、ロード時に置き換え

アーキタイプ

マテリアル名の接尾辞で、マテリアルのひな型=アーキタイプを判定します。各アーキタイプは、(Godotではなく一般的な意味での)シェーダーの種類と一対一で対応しています。

blendのマテリアル名に接尾辞を付ける

このひな型に、アルベドテクスチャを引き継いだものが、Boughのメッシュにセットされるマテリアルになります。

また、PaintboxはWorkshop以外のクラスからの依頼で、新規マテリアルを作成したり、既存マテリアルのアーキタイプ(一般的な意味でのシェーダ)を変えたりします。これはどんなゲームでも必須なはずです。

(今のところ)組み込みのアーキタイプは6つあります。下の画像の通りです。

組み込みアーキタイプ

ひとまずこの6つがあれば、作り始めるには十分と判断しました。
ビルボードやテクスチャアニメーションはマテリアルのパラメータを変更することで実現できます。

6つのアーキタイプは、(今のところ)どれもStandardMaterial3Dです。
主なパラメータは次の通りです。

各アーキタイプのStandardMaterial3Dパラメータ

テクスチャアニメの例

下記は、テクスチャアニメーションを使った炎VFXクラスの例です。MeshInstance3Dにアタッチする、Miniature派生クラスです。
これ自体はビルボード用の板ポリblendモデルを使います。炎なのでPaintboxに依頼して加算シェーダにしてもらって、テクスチャも4x4のアニメ用炎テクスチャにして、ビルボードモードにします。

炎の例

その上で、SpriteAnimStateというクラスでアニメーションの状態を管理します。このクラスに分割数やパターン切り替わりの間隔秒数を入れておけば、適切なUVスケールとUVオフセットを毎フレーム返してくれるので、それをマテリアルパラメータにセットします。

拡張案

組み込みの6つのアーキタイプだけで、いろんなジャンルのゲームを作れるわけではありません。今作ってるゲームでも、追加のアーキタイプが必要になるでしょう。StandardMaterial3Dだけでなく、ShaderMaterialも使いたいしね。

Miniatureシステムはポンポコゲームズ用のクローズドなものですが、一応汎用ライブラリ的な建前で作ってるので、Paintboxを特定タイトル向けに特化したくはありません。なので、アーキタイプとその作り方を、追加したりオーバライドする仕組みを、そのうち入れたいなあと思ってます。

Paintboxを拡張する仕組み(予想図)

上記の画像のようにModderをセットする仕組みにするならば、Paintboxはstaticクラスではなく、Workshop同様にシングルトンにする必要があります。参照を保持させるために。


Godotでモデルを気楽(?)に管理・構築する仕組みの紹介、長くなりましたが、ひとまずここまで。
読んでくださってありがとうございます~~!


この記事が気に入ったらサポートをしてみませんか?