Godot 音シュー07「今です。色をチェンジして下さい。」
3.0.3にしたけど、1コしかないexeを入れ替えるだけ。ホント簡単、イイネGodot。で、今回は、キューブがエリアに入ったらエリアの色を変えたい。キューブがイイ感じの所に来た時、「キーを押すのは今です!」ってのをエリアの色を変えて示したいワケだ。簡単に言うと、シグナル出してアルベド(Albedo)のカラーを変えればいいんだろ。いけそうじゃね。
SpatialMaterialを入れる
いわゆる色はMaterialで設定する。(どっかで書いたかな?) その中にあるAlbedoという項目だ。だが、「MeshInstance」ノードはデフォだとMaterialの項目自体、付いてない。
- なので、なんでもいいからMeshを入れる。
- するとMaterialの項目が追加される。だが、これ、項目が追加されただけで中身は空っぽ。
- "<null>"の部分をクリックして、
- [New SpatialMaterial]を選択して中身を入れよう。3Dの立体物に付けるマテリアルなんだから、なんとなく"Spatial"の方でいいかなって分かるよね。("Shader"の方はなんだろな?)
- で、入れたらこの丸い立体風のブツをクリックしてみる。
- すると、入れたSpatialMaterialの編集が、インスペクターパネルで出来るようになる。
- ほれ、Albedoがある。後はスクリプトで、こいつが持ってる数値を変えてやればイイって事だよ。
そうなんだけど、インスペクターパネルっていつもはノードの編集項目(プロパティ)が見えてるとこなのに、ノードじゃないマテリアルなんかの項目がここにあるのはちょっと違和感あるなー。ノードじゃない情報はタブ変えて表示して欲しい。
あと、戻りたい時は、
- この[戻る]ボタンで1コ前の表示内容に戻れる。
- または、この[履歴]ボタンでリストが出て来るから、それで好きなところに戻ればイイ。
あ、でもあれか。よく見ると、左、タイトルの所アイコン2つ並んでるし、選択してる「MeshInstance」ノードの中のSpatialMaterial項目だってのは分かるようになってるのか! なるほど。スクショ撮ってみて初めて気が付いたぜ。よくよく見てみるもんだな。
シグナル
さて、シグナルを出して、スクリプトで色を変えよう。4つあるエリア全部にやるのはめんどいので、左の1つだけで練習だ。(「シグナル出して-->何かする」はココサンショウ魚。エアホッケーの7、GDScriptの9)
- スクリプト(シグナルを受信するモノ)を貼る場所はココ。
- シグナルを出す場所はココ。
- 出すシグナルはコレ。シグナル色々あるけど、判定する相手は「StaticBoby」なので、"body_entered()"でイイと思う。
スクリプト
短い!
L3
- コメントに書いた通りなんだが。マテリアルもまた、ノードみたいに変数にゲットしておくと、変数で操作できるようになる系のモノらしい。便利は便利だけど、なんでかな?
L6
get_surface_material()
関数でマテリアルの情報をゲットできる。(MeshInstance
クラスで定義されている。)- カッコの中に入れる数字は恐らく、SpatialMaterialを追加した時に左にあった数字だと思う。だから多分、メッシュやマテリアルをちゃんと入れてないとエラーになるんだと思う。
- ちゃんとゲット出来たら、"spaMat"には
Material
型で入って来る。
L11
- これでAlbedoを変えるんだけど、なんか変な感じ。
- というのは、色(Albedo)は
SpatialMaterial
クラスの"albedo_color"っていう変数が握っている。(APIのSpatialMaterial
クラス参照) 今回この"spaMat"にはMaterial
型で入ってきているハズだから、"albedo_color"変数は操れないハズなんだよなー。でも、このままで色を変えられるのはナンデだろ? 謎。 俺、何か勘違いしてる系? まいっか。 - 色は
Color()
で指定できる。指定の仕方も色々あるようだが、HTML風に使ってみた。"ff0000"は赤。(APIのColor
クラスを参照)
テスト
これで[シーン再生]して、左のエリアにキューブが入るとエリア(の持ってるメッシュインスタンスのスペーシャルマテリアルのアルベド)が赤になるんだけど、1回入ったら、ずっと赤のままだな。しまったしまった。キューブが出て行ったに時にまた色を戻さないといけない。
ま、でも一応「Area」ノードはグイグイ動かしても、ちゃんと「うんたらボディー」に反応することは分かったから、ヨシとしよう。色を戻すのはまた今度。
コード
extends MeshInstance var spaMat #MeshInstanceが持ってるSpaialMaterialの情報を操作する用 func _ready(): spaMat = get_surface_material(0) #"0"番目に入ってるヤツの情報ゲット #キューブ入ったよ func _on_Area_l_body_entered(body): #色変えるぜ spaMat.albedo_color = Color("#ff0000")