2026年2月26日木曜日

Godot Engineを使ってみようとしたらフリーズした

ちょっとした3Dを表示したりするのにゲームエンジンがよさそうかなと思って調べていた。有名どころではUnityとかUnrealEngineとかがある。

UnrealEngineはなんか多機能すぎてわけがわからない。Unityは会社で使おうとすると有料になりそう。会社でも使えそうなGodotを使ってみようとした。

フリーズする

何度起動してもフリーズする。なんかwindowsごと固まっている感じだけど、すでに動いているほかのアプリ(firefoxとか)は無事っぽい。タスクマネージャーも固まってプロセスを殺すこともできない。シャットダウンもできなくなるので電源ぶち切りするしかなくなる。

githubのissue見てみたけどv4.6からダメだとか(v.4.4.1まで戻してもNG)、エディタをsingle windowモードにしないとダメだとか(やっても変わらず)、何ともならない。

解決

使ってるPCではIntel  HD GraphicsとNVIDIA GeForceが認識されている。ふと思い立ってIntel HD Graphicsのドライバを無効にしてみたところ、フリーズしなくなった。どうやら2つのGPUがあったときにどっちを使うかみたいな感じで止まってしまっているのだと思う。おそらくwindows 11のせいだろう。linuxでやってたら問題なかったんじゃないだろうか。

その後いろいろやってみたところ、ドライバを無効にしなくてもGPUを固定しておけばよさそうだということが分かった。windowsの設定→システム→ディスプレイ→グラフィックでgodotのexeを指定してGPUを固定する。

どういう仕組みでどうGPUが使われているのかさっぱり分からないが、これで普通に使えるようになった。

試しに作ってみる 

とりあえずhttps://www.godot-tutorial.net/というサイトの3Dチュートリアルをやってみる。

書いてる通りそのままだと結構引っかかるところがあった。置いてある完成版と見比べながら修正していく。

引っかかったところ1:Meshの登録の仕方

Meshはいったん左下のファイルシステムのところにドラッグアンドドロップで入れて、そこからMeshInstance3Dにドラッグアンドドロップすると適用された。以前blenderで作ったモデルをfbxに変換して入れてみたりできそう。

引っかかったところ2:シグナル

player.gdの最初に以下が必要(emitするsignalを宣言する)

signal collected

Mainからsignalへのつなげ方も変わっているようだ。(ついでにサイトのコピペのままだと何も生成されなかったのでcreate_objectを呼ぶようにする。)

func _ready():
    $Player.collected.connect(_on_item_collected)
    create_object() 

引っかかったところ3:シグナルのつなげ方 

PlayerのArea3Dでほかの物体に当たった時のシグナルbody_enteredをCharacterBody3Dの関数に接続する。ただコードを書くだけじゃなくて以下のような操作が必要。

 

引っかかったところ4:すり抜ける 

見た目(MeshInstance3D)と当たり判定(CollisionShape3D)は別物になっていて、scaleで小さくしたときに当たり判定が小さくなりすぎると、地面をすり抜けて落ちて行ってしまう。適度な大きさを設定しておく必要がある。

 

とりあえず闇雲にチュートリアルをこなしてみた。blenderで作ったモデルも読み込めるようだったので、適当にミャクミャクと未来のたまごとサーキュラーを読んでみた。(以前作ったやつ

ただ、当たったら消えるだけなのでつまらない。どうやら物理演算されているっぽいので、なんかやってみたいんだけど、やり方がわからない。

とりあえず動いたので、今日はここまででヨシとする。 

 

0 件のコメント:

コメントを投稿