見出し画像

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

前回の続き

5つのクラスのうちの1つ、Miniatureの説明です。見た目を提供するクラスです。下図、一番下の箱~!

Miniatureの位置づけ

Boughを組み合わせる

MiniatureはWorkshopから取得したBoughを組み合わせて、見た目を提供します。
繰り返しになりますが、Boughは親子付けされたMeshInstance3DとNode3Dから成る、ノードの塊です。名前通り大枝(bough)です。

Miniatureは子としてBoughを1つまたは複数持つことができます。
下図の左が1つのBough、右が2つのBoughを持つ例です。緑色のワクがBoughです。

子としてBoughを持つ

もしくはMiniatureはBoughそのもの(Boughのルートノード)にアタッチすることもできます。
下図の左は、単体のノードから成るBoughにアタッチした例。右は3つのノードから成るBoughにアタッチした例です。

Boughにアタッチ

このアタッチする使い方は、ノード数を減らす意図があります。
オブジェクト自体がちょっとした小物(椅子とか)なので2ノードは大げさすぎるとか、大量に発生するオブジェクト(落ち葉とか)なので負荷を減らしたいとか。そういうときに使います。

Boughの取得

BoughはMiniatureの作成時に、Workshopシングルトンから取得されます。後からBoughを追加するときにも取得されます。

Boughの取得にはファイルパスとBoughの名前が必要です。Miniatureの使用クラスや、継承クラスはこれらを知ってる前提です。

1:
HandAxe(Miniature継承クラス)
パスとBough名をリテラルとして保持している。
const _FILEPATH: StringName = "res:/Item/Weapon.blend/"
const _BOUGH_ID: StringName = "HandAxe"2:
Landscape(見た目オブジェを地形に配置するNode3D派生クラス)
定義データを取得して、ファイルパステーブルから適切なパスとBoughを取得
var def: ModelDef = table_ref.get_plant_model_def(_current_plant_type)
var filepath: StringName = def.get_filepath()
var bough_id: StringName = def.get_bough_id()"res:/Plant/Grass.blend/""GrassSnowCovered"など)

マテリアルの管理

Miniatureは、MeshInstance3Dのマテリアルを管理します。これが重要な役割です。

  • シェーダの変更

  • マテリアルの差し替え

  • テクスチャの変更
    - 指定テクスチャ
    - テクスチャバリエーションから指定
    - 指定パスからロードできるテクスチャ

  • 色の変更

  • UVのスケール・オフセット変更

  • ビルモードモードのオン・オフ

マテリアルやそのパラメータの変更は、通常は個別のインスタンスごとに実施したいので、Overide Materialの機能を使います。初回アクセス時にメッシュに割当たってるマテリアルのコピーを作って、MeshInstance3DのOveride Materialにしておきます。そして以降はOveride Materialのパラメータを変更します。
ややこしいですが、デフォルトマテリアルを参考に作成したゲーム用マテリアルを、再度コピーする形になります。

インスタンスごとにマテリアルを持つ場合

OverrideはMiniature個別にオフにすることも可能です。パフォーマンスなどを考慮して、あえて同一メッシュに同じマテリアルを使いたいときは、フラグを設定してオフに設定しておきます。何百も配置している草が全部枯草になるとか。
この場合はMeshのSurface Materialを直接、置き換え or 変更します。

同メッシュでマテリアルを共有

マテリアルやマテリアルパラメータの変更時は、ノードパスとSurface Indexを指定します。ノードパスが""のときはすべてのノード、Surfaceが負のときはすべてのSurfaceが変更対象です。

# 目("Eyes")の瞳マテリアル(1)を、組み込みの加算シェーダーにする
set_mat_builtin_archtye("./Eyes", 1, Paintbox.BuiltinArchtype.ADD)

# アーマー("Armor")のすべてのマテリアル(-1)のテクスチャを変更
set_tex("./Armor", -1, new_texture)

# すべてのノード("")のメインカラー(0)を、特定バリエーションテクスチャに変更
set_tex_from_pool("", 0, "res://Monster.blend", "Slime_Blue")

# 単一ノードからからなるMiniatureを、ビルボードにする
set_billboard_mode(".", 0, BaseMaterial3D.BILLBOARD_ENABLED)

# すべてのノード("")のすべてのマテリアル(-1)の色を変える
set_albedo_color("", -1, Color(0.5, 0.7, 0.8, 1.0))

ShaderMaterialを使う場合は、さらに変数名を指定します。

つづく


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