Godotのウオアアアアア

稀にGodotが関係ないのも含まれる

OwnerとParentってなんやねん?

Godotではツリー状の構造であるシーンのどこかに所属していないとゲームの画面上に表示されない。

ということでしばしば以下のような書き方をする。

var instance = _packedScene.Instantiate() as SomeNode;

Owner.AddChild(instance);

このOwner、実は保存されたシーンでのRootとなるノードが入る。

なので、動的に生成されたシーンなどはOwnerを持たない(nullになる)。

保存時の挙動に依存する処理なら別だが、単純に生成して画面に表示したいぜっていうときにはstatic変数なんかで保持したRootにAddChildするのが手っ取り早いのではなかろうか。

分割タイルの画像に対してシェーダかけるとなんかおかしくない?君

こーんな感じのシェーダを作った。特定角度部分だけ表示してあとは透明にするやつだ。

(当然この濃いピンク部分は読者諸君には透明色に見えているはずだ)

あーれ?

実は元画像はタイルのようになっており、このシェーダは元画像に対して処理を行うためかような見た目になる。

シェーダの適用画像の左上部分だけを抜き出すと実際こうなってしまうのはわかると思う。

・対処法

vec2 centered_uv = UV - vec2(0.5, 0.5);

vec2 centered_uv = fract(UV * divisions) - vec2(0.5, 0.5);


fract関数を使う。元画像の座標を引き伸ばしそれぞれの画像の格子内でのUV座標をとることで0-1で扱えるようになる。

画素に関係ないのに毎回させる計算はパラメータ入れるときに計算してあるといいよね

Copilotくんの回答より

シェーダの計算は非常に高速で行われ、多くの場合、毎フレームで何千ものピクセルを処理します。したがって、シェーダ内での計算はできるだけ最適化することが推奨されます。

オイラー角を直接シェーダに渡すと、シェーダ内でそれをラジアンに変換する必要があります。これは、毎フレームで何千ものピクセルに対して行われるため、パフォーマンスに影響を及ぼす可能性があります。

したがって、可能であれば、オイラー角をCPU側でラジアンに変換し、その結果をシェーダのユニフォーム変数として渡すことをお勧めします。これにより、シェーダの計算負荷を軽減し、パフォーマンスを向上させることができます。

ただし、この最適化が必要かどうかは、アプリケーションの具体的な要件とパフォーマンスによります。たとえば、シェーダの計算がアプリケーションのパフォーマンスに大きな影響を及ぼさない場合、またはオイラー角の方が扱いやすい場合は、オイラー角を直接使用することもあります。


へー、でもそうするとヒント関数が使いづらくなるな……

シェーダを持ってるクラスに代入用クラス作っちゃえ

Godot上でつくったリソースはユニークかどうかに気をつけよう

PointLight2Dを使えば世界に光をもたらすことができる。

円形に明るくさせるような光を作るとして、そのテクスチャを画像ツールで作るのは面倒。

ということでGodot上で下記のようにGradientを利用したテクスチャを作った。

これで編集もラクラク!

ム……?

同じテクスチャをひな形に作ろうと、同じテクスチャを読み込んだあとに別名保存したのに元々のテクスチャにも変更が入っておるな……?

実はこのGradientもGodot上のリソースであり、これもユニーク化しないといけない。

ユニーク化(再帰的)を選べばよいだけなのだが、この仕様は初見だとちょっとびっくりするかもね。