Godot EngineをRustで使うメモ

# ここですね

[godot-rust](https://godot-rust.github.io/)

わたしはGodot EngineとRustの両方に同時に入門する

もはやこのページはGodot Engineの使いこなしの記事のほうが多いのだ。

# 日本語記事

[Godot + Rust + wasmによる3Dブラウザゲームの作り方またはRustはゲーム制作向き言語なのかの考察的な何か - Qiita](https://qiita.com/namn1125/items/9ef8f147317114545b51)
VS Code から、Dockerでビルドできるぽい。

 # Tutorial

Hello World。GUI操作とか
[Godot EngineからRustを呼ぶ](https://zenn.dev/kawaxumax/articles/e0dedf3f6d4219)

解説本(英語)
[Introduction - The godot-rust Book](https://godot-rust.github.io/book/)

# Examples

[godot-rust/examples at master · godot-rust/godot-rust · GitHub](https://github.com/godot-rust/godot-rust/tree/master/examples)

2D Gameで、理解する
[godot-rust/examples/dodge-the-creeps at master · godot-rust/godot-rust · GitHub](https://github.com/godot-rust/godot-rust/tree/master/examples/dodge-the-creeps)


# そのほか、というかRustと関係ないGodot Engine使いこなし集になった

## シーンを切り替える、というか、グローバル変数をつくる、だったか。
[Porting Godot Games To Rust (Part 1) | Paytonrules Ramblings](https://paytonrules.com/post/games-in-rust-with-godot-part-one/)

シーンを記憶主体と当初思った。グローバル変数にもって、シーンは常に新規作成と破棄という考え方やな。それが自然にも思える。

## KinematicBodyを間違って使った
例題がそうだったので使用した。問題発生。物理法則に従わない。まあ、従ったほうがいいか。すり抜け問題とか、KinematicBody同士ですり抜ける。というのもなんでだろ。そういうものか。衝突検知して、再度移動するからかな。RigidBodyにしておくべきだったか。RigidBodyだと親子関係が、勝手に親子、分かれる感じがする。RigidBodyに変更すると大改造になりそう。問題は別にもあって、内部ノードをrigidbodyにすると、どっかに飛んでしまって、他のノードと分離してしまう。それ自身をrigidbodyにすべきだろうか。内部をそれに従わせる。kinematicbodyは可能だろうか。できなかったら、、、まあ実験
1.移動 
[Using Rigid Bodies :: Godot Recipes](https://kidscancode.org/godot_recipes/physics/godot3_kyn_rigidbody1/)
move and slide使えんね。
2.選択時の上のマークどうする?[game physics - Godot: how to make RigidBody2D move its child when moving? - Stack Overflow](https://stackoverflow.com/questions/59257613/godot-how-to-make-rigidbody2d-move-its-child-when-moving) 無理かいな、とおもったら、Rigidbodyの子ノードのにKinematicBodyで選択時のマークを表示すればいいねん。
3.座標の選択修正必要そう。origin使っているが、、
4. Change Node Typeの影響

## Rigidbodyの衝突検知
CollisionShapeとか使わなくていい感じです。継承とかしてて、設定が漏れててバグった。
[Detect if rigidbody is touching/colliding with another object. - Godot Engine - Q&A](https://godotengine.org/qa/50866/detect-if-rigidbody-touching-colliding-with-another-object)

## スマホやタブレットのタッチが効かない
inputのプロジェクト設定をall deviceに変更する。最初はdevice 0になっている。これはハマりすぎるよ、きっつー。
https://godotengine.org/qa/48264/touchscreen-input-doesnt-work-on-android

## 継承
シーンも継承するらしい。それとユニーク化。良い記事

[Godot で作るプラットフォーマー Part 4:敵キャラクターを作ろう! | Peanuts Code](https://www.peanuts-code.com/ja/tutorials/gd0005_platformer/platformer_4/)

## Global data
グローバル変数的な
[Singletons (AutoLoad) — Godot Engine (stable) documentation in English](https://docs.godotengine.org/en/stable/tutorials/scripting/singletons_autoload.html)

## オブジェクトの クリックを検出

RayCastを使用しないでよい。input_eventで検出。
[【Godot Engine】2Dゲームチュートリアル(Part.3) - Qiita](https://qiita.com/2dgames_jp/items/d9c1bc35b00fdb2ba604)

##  nullとかOptional型とか

ない。
[How to return null in typed GDScript? : godot](https://www.reddit.com/r/godot/comments/biw2uy/how_to_return_null_in_typed_gdscript/)

# 静的型付け
[Static typing in GDScript — Godot Engine (stable) documentation in English](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/static_typing.html)

class_nameつけないと、型として使えない。よって、補完されないので、しようね。

## キャラクターの継承設計
[Godot で作るプラットフォーマー Part 4:敵キャラクターを作ろう! | Peanuts Code](https://www.peanuts-code.com/ja/tutorials/gd0005_platformer/platformer_4/)

継承しないようにする
[How to make instanced scenes unique? - Godot Engine - Q&A](https://godotengine.org/qa/59118/how-to-make-instanced-scenes-unique)
継承したノードが親を変更しないのもこれか?昔、ユニーク化みたいな名前だったかも

継承関係を変更する、これどうも、継承を削除するだけだから、望んだのと違う
[Can I change an inherited node ? - Godot Engine - Q&A](https://godotengine.org/qa/43935/can-i-change-an-inherited-node)

継承関係の変更はこっちだな。新しく作ったシーンにマージする。マージしたことない。
[How to change the inheritence of an existing scene - Godot Engine - Q&A](https://godotengine.org/qa/10745/how-to-change-the-inheritence-of-an-existing-scene)

継承して、export変数は同じにして、なおかつ、関数は変更するには、scriptをdetachしてから、scriptをres://形式でextendsする。ややこしいな。

 ## 使わないシーンをロードしない
[InstancePlaceholder — Godot Engine (stable) documentation in English](https://docs.godotengine.org/en/stable/classes/class_instanceplaceholder.html)
[How to disable/enable a node? - Godot Engine - Q&A](https://godotengine.org/qa/49696/how-to-disable-enable-a-node)

## 四角のドラッグでRTS風ユニット選択

うごきます。ソースもあり。
[How to make a 3D RTS in Godot 3.1 part 2 - Unit Selection and Teams - YouTube](https://www.youtube.com/watch?v=JFQXI3to0b4)

## 重力
[How make my character fall(Gravity) in Kinematic body 3d - Godot Engine - Q&A](https://godotengine.org/qa/80120/how-make-my-character-fall-gravity-in-kinematic-body-3d)

## enum

## nullぽ問題

ぬるぽ問題。チェックすればいいんか?Unityのときもあった。削除したオブジェクトにアクセスしてしまう。

[Is there a way to check for ( recently ) freed object ? - Godot Engine - Q&A](https://godotengine.org/qa/96661/is-there-a-way-to-check-for-recently-freed-object)

結局マルチスレッド問題なのか?排他制御不足なのかな。
Why does Godot use Servers and RIDs?
 ロジック、物理、レンダリングの並行化と、サーバー化の話がここ。2016年の話のようだ。それらの間の排他は気にしなくてもいいらしい。とするとロジックの中だ。物理のなかのコリジョンも、ロジックに持ち越されるなら、そこでの排他制御は必要そうだ。衝突の結果、free_queueなんかされるとすると、それは次のフレームに持ち越しだから問題ない。とすると、その周辺の配列からの削除あたりか。
Using SceneTree — Godot Engine (stable) documentation in English
これはよくわからない。理解する必要は感じる。ではシグナルはどう振る舞うのか。
Instancing with signals — Godot Engine (stable) documentation in English
シグナルは疎結合な呼び出しのようだ。相手がなかったら何も起きないとかで。とすれば、これは特に問題ないか。ロジック内での動作はメソッド呼び出しだからだ。衝突して消える、それは、よい。nullポになるのはなぜか、それはローカルか、自分のコードをみると、is_instance_validでメンバ変数について確認していらっしゃる。ということは、前のフレームで、dequeueして、なくなっているということで、これは排他が必要とかそういう問題でないという仮説ですね。なんだ。
シグナルはマルチスレッド化を発生させるわけでもなさそう。
 

## buttonボタンにアイコン
エディタじゃ、できんの?
[ImageTexture — Godot Engine (stable) documentation in English](https://docs.godotengine.org/en/stable/classes/class_imagetexture.html#class-imagetexture)

## bug
3.4.5です主に。やっぱハマる。バグとともにある。まあ、OSSのせいか、商用じゃないせいかハマるんですわ。しゃーない。

[What does this warning mean: Node was modified from inside an instance, but it has vanished. - Godot Engine - Q&A](https://godotengine.org/qa/32037/what-does-this-warning-mean-modified-inside-instance-vanished)

[Error: Loaded resource as image file, this will not work on export - Godot Engine - Q&A](https://godotengine.org/qa/43318/error-loaded-resource-as-image-file-this-will-not-work-export)

3.4.4のこれにはまる。
[Errors generating a plane with ArrayMesh ("array.size() != p\_vertex\_array\_len") - Godot Engine - Q&A](https://godotengine.org/qa/92892/errors-generating-plane-arraymesh-array-p_vertex_array_len)

## 現在の座標
originではだめ。
[how do i get and print global location of an object ( spesificly on "y" axis ) - Godot Engine - Q&A](https://godotengine.org/qa/129322/how-do-get-and-print-global-location-object-spesificly-axis)

## Blenderからインポートしてmeshをかえる、shaderを設定する
import設定で、meshを別ファイルにすること。
[How do I change the material on an imported FBX mesh to a ShaderMaterial? - Godot Engine - Q&A](https://godotengine.org/qa/126938/how-do-change-the-material-imported-fbx-mesh-shadermaterial)
[Godot 101: Intro to 3D, Part 2 · KCC Blog](https://kidscancode.org/blog/2019/03/godot_31_3d_part02/)


## 3Dゲームの基本
[【Godot Engine】3Dゲームの作り方 - Qiita](https://qiita.com/halboujp/items/37f9577ac94b5ede3aa7#step-6-spatial%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E3%82%A2%E3%83%83%E3%82%BF%E3%83%83%E3%83%81)
# ノードを削除しても削除されないてい不具合3.4.5の不具合か
継承先でプロパティ変更して、ノードを削除しても継承元で同名のノードを追加すると従来のノードが復帰してしまうそうだ。削除系って難しいよね、あと、継承もからまっている。

# Godot Engine
Rust関係ない。知りたいこと。

球とか立方体は作れる。3Dモデリングソフト使えんので。

[Godot 玉転がし 03 「3Dビューエディタのミカタ 1/2」 - 俺に解るように説明する "Godot Engine 3.x" 入門+](https://ore2wakaru2.hatenablog.com/entry/2018/02/25/180000)

# onready
nodeが生成されたあとに代入してくれる
[[Godot] onreadyキーワードはどういった場面で使うか? | WorkToolSmith](https://worktoolsmith.com/godot-onready-keyword/)

# Godot Engine 4

開発進捗
https://github.com/godotengine/godot/milestone/9

フォー!甘くない。完全に行かないのでけっっこうぬま
コメントがコメント出なくなったり。
intersect rayの引数が変わっていて、変換されない。まあこんなもん。
https://www.reddit.com/r/godot/comments/u0fboh/intersect_ray_too_many_arguments_godot_40

update関数はなくなっている。他の関数になっている。queue_redrawだっけか。
["Update" function has been removed in Godot4.0, how can we "update" when draw line? - Godot Engine - Q&A](https://godotengine.org/qa/139249/update-function-has-been-removed-godot4-update-when-draw-line)

add_forceが動かない。add central impulseかなにかに変更したり、custom integratorをオンに。
[add\_force? Why is this implemented this way? Am I missing something? - Godot Community Forums](https://godotforums.org/d/20617-add-force-why-is-this-implemented-this-way-am-i-missing-something/3)
進捗はここ?
https://github.com/godotengine/godot-proposals/issues/387

astar3dが上手く動かない
2d的に使ってて、y座標が上に浮いてたら、全然次のポイントの近傍に逝かなくて変な動きになるというバグで1時間ほど消費した。

残りTODO
家とか木がふっとぶ
UIがずれまくっている
チーム分けの色が消えている

godot 4 html出力はまだ
[Clarify why HTML5 export templates are missing in 4.0 alpha builds · Issue #59476 · godotengine/godot · GitHub](https://github.com/godotengine/godot/issues/59476)
ちょっとがっかり。
Beta2でやってみた。真っ暗。3dだからかもしれない。

とすると、godot3.x出やり続けるか、、iOS でもうまく動かんのだが、、higher order functionが魅力の4.まだか、、

## カメラ追跡 2D
Platformer Game Quick Start Guide for Godot 4 Beta - YouTube

# マルチプレイヤー

https://zenn.dev/submax/articles/godot4-multiplayer-spawner-synchronizer

生成を監視、
同期するプロパティを設定らしい。
すべてサーバー側で変更する感じらしい。それをクライアンとに反映かな。

Server <- Client UI Action
まるで、ServerにClient Userがいるように、I/Fを定義する感じだろうか。

偶然かEnemy AI書いてたら、そういうI/Fになったらいいな、無理かな。
と思ってこれgodot 4か、、挑戦せねばならんのか。専業やれよ。いや、らーめん大枷ぎ。
サーバーはコマンドラインオプションで区別か。コマンドラインかbatファイルで実行なのかな。。

Nodeクラスにmultiplayerプロパティが追加されている。
https://docs.godotengine.org/en/latest/classes/class_node.html

Spawnerはホストからクライアントに反映するのみか。それとも、、

Levelとは、、

上記の解説記事では、サーバーでクライアンとの接続で、プレイヤーを作成している。
RPCってやつで、サーバー側の関数を呼べるらしい。
キャラクターの移動自体はクライアントか、、わかりづらい。サーバー側ではやらないのか。操作はクライアント側だからか。サーバー側では、即、移動処理はリターンするように記載する。というか位置の設定。クライアントに設定されたもの。
というかネットワークアプリ書こうとしたら、3.5系から移行が必要なのか。
Converterが不完全なので面倒でここで力がない個人開発者は頓挫するかも。気長に。

やってみてる11/13
属性のsynchronizerは、クライアントからサーバーにrpc飛ばして、サーバーから他のクライアントに同期される方式らしい。
とするとspawnerもあれか、サーバーで削除する感じかい、これ。ネットワークゲームとローカルの共通化は可能なんだろうかな?

とすると、nodeの削除もサーバー?
というか、衝突検知もか。とするとローカルで実施の部分を無効化する感じか。わからん。

マルチプレイヤーのカメラ分離問題
current属性を新たなプレイヤーにとられる。readyだけでなく、毎回描画時にcurrentでなければ、自分のカメラをcurrentにするなどというエレガントでない解決策を発見した。

rpcでサーバーでinstansiateしてもnodeが作れれない問題。
なぜかサーバーだと@1とか、ユニークにならない問題。なんだろうな。
https://godotengine.org/qa/96718/network-instance-names

名前にinstance idを追加して設定したり。つらい

p.name = String(p.name) + str(p.get_instance_id()) #var_to_str( Time.get_unix_time_from_system() )
networked_nodes.add_child(p,true)
p.global_transform.origin = _sync_pos
場所の設定と、add childの順番が逆だと場所の設定がうまく行かない。つらい。betaであって、バグをめちゃくちゃ直したって、誇らしくリリースされるしな、、


# Godot 4.0beta 5
mac book air 2012で動作しない、つらい。

Rustも知らずに、Godot Engineに入門とかしんどいです。モチベーションにはなりますので。

Godot 4 - GDScript Features 関数型言語の機能の取り込みなど。
静的型付けGDScript — Godot Engine (4.x)の日本語のドキュメント
【Godot4.x】Arrayのよく使う関数まとめ | 2dgames.jp


 # 感想

Rustも知らずに、Godot Engineに入門とかしんどいです。モチベーションにはなりますので。

まずGodotの練習で、GD Scriptを書いていると、Rustが面倒に。なぜならWeb Assemblyの環境を作っていないから。VS Codeだっけ、Dockerの環境をつくればいいんだよね、まじで。それも勉強になるよな。
filterとかmaxByほしくなった時点で、GD Scriptがいやになったわけすよ。

ブラックホールに投げ込む気持ちで、ご支援ありがとうございました。