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で作ったモデルも読み込めるようだったので、適当にミャクミャクと未来のたまごとサーキュラーを読んでみた。(以前作ったやつ

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

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

 

2026年2月11日水曜日

gitea入れた

ちょっとしたリポジトリを管理したいがgithubに入れるほどでもない。というかgithubはなんか遅くて普段使いには向かない気がする。

単に置いとくだけだと何を作ったのかすらわからなくなる。せっかくraspiを買ったのでgitサーバを入れようと思った。 

ローカルで動かすgithubみたいなものとしてgitlabがあるけど、自分しか使わないのにローカルで動かすには重すぎる。できるだけ軽そうなやつを探してgiteaとやらを入れてみた。

インストール 

raspi debianにパッケージはなさそうだったので手動で入れる。
参考URL: https://docs.gitea.com/installation/install-from-binary

書いてある通りにユーザを作る 

# On Ubuntu/Debian:
adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git

次にインストール先を作る
見たところインストール先は任意に決められそうだったので、設定やらなにやら全部一か所にまとめて入れることにした。 

cd /mnt/disk/gitea
mkdir -p etc var/lib/{custom,data,log} bin

インストール先のディレクトリ構成は以下のような感じにした。etcに設定ファイル、binに実行ファイルを入れる。varにリポジトリ等が入るはず。

gitea/
gitea/etc
gitea/var
gitea/var/lib
gitea/var/lib/log
gitea/var/lib/custom
gitea/var/lib/data
gitea/bin 

binにバイナリを置く

wget https://dl.gitea.com/gitea/1.25.4/gitea-1.25.4-linux-arm64
chmod a+x gitea-1.25.4-linux-arm64
mv gitea-1.25.4-linux-arm64 gitea/bin

systemdのサービスを置く。サンプルがあるので取ってきて編集。
参考URL: https://docs.gitea.com/installation/linux-service 

wget https://raw.githubusercontent.com/go-gitea/gitea/refs/heads/release/v1.25/contrib/systemd/gitea.service
mv gitea.service gitea/etc

gitea.serviceを編集。以下の行を変えたくらい

WorkingDirectory=/mnt/disk/gitea/var/lib/
ExecStart=/mnt/disk/gitea/bin/gitea web --config /mnt/disk/gitea/etc/app.ini
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/mnt/disk/gitea/var/lib

とりあえず全部gitユーザにする

chown -R git:git gitea/ 

systemdに置く

cp /mnt/disk/gitea/gitea.service /etc/systemd/system 

サービス有効&サービス起動

systemctl enable gitea
systemctl start gitea

動いた。(以下はいくつかリポジトリを登録した後)

 

まだ大して使ってないが、なかなか軽くてよさげな気がする。gitlabよりgithubに近い感じ。

これで適当に書き散らかしていたプログラムを集約できる。(すでに行方不明になっているものも多いが) 

sshアクセス

httpで毎回パスワード聞かれるのがうっとおしいのでsshでアクセスしたい。が、sshでcloneしようとするとgitユーザになってパスワードを聞かれる。ssh-keygenで作ったpubkeyは登録してあるが。。。

git clone git@192.168.11.50:ttfugapiyo/photofix.git
git@192.168.11.50's password:

検索したところgitユーザをssd_configで許可すればいいようだ。
参考URL: https://forum.gitea.com/t/gitea-requests-password-with-a-correct-ssh-key/7870

/etc/ssh/ssd_configを見ると、うちのraspiではAllowGroupsで_sshグループが許可されている。(いつ入ったのか不明。raspi osのデフォルトなのか、openmediavaultの設定なのか)
なのでgitユーザを_sshグループに入れればよさそう。

usermod -aG _ssh git

これでclone / push / pullできた。