19
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ターミナルでGodotを使おう。

Last updated at Posted at 2020-02-19

GUIアプリケーションというものは、Headlessモードを搭載しているモノが多くあります。

例えば、Google Chrome の Headlessモード。
ちょっとした自動化、CI/CD、テスト、デバッグなんかを実行するのに便利だし、
グラフィック処理がない分高速です。
ディスプレイのないサーバーでも動作させることができます。

OSSなゲームエンジン Godot もいくつかの操作をコマンドライン上で実行することができます。
特に、オンライン用のサーバーサイドを書くときに結構便利そうなので、使い方をメモっておきます。

コマンドラインチュートリアル — Godot Engine latest ドキュメント

↑に色々書いてあります!

Godot をコマンドとして実行できるようにする

※macOS + zsh です。別環境の人は適宜読み替えてください。

Macの/ApplicationsフォルダにGodotをインストールした人は、
Godot.app を 右クリックして、「コンテンツを表示」とやるとこんな感じになってるはず。
スクリーンショット 2020-02-19 21.57.46.png

/Applications/Godot.app/Contents/MacOS/Godot
これがGodotの実行ファイルパスです。
Finderからダブルクリックしてやると、Godotエディタが起動します。

これをターミナルのコマンドとして実行できるように、.zshrcaliasを定義してやります。

.zshrc
# Godot bin
alias godot="/Applications/Godot.app/Contents/MacOS/Godot"

これで準備OKです!

-e ターミナルからGodot Editorを起動する。

-e = --editor

ターミナルからGodotを始めたい人も結構いるはず。
Godotのプロジェクトファイル(project.godot)があるディレクトリで、
godot -eを実行すると、そのディレクトリ内のプロジェクトを開きます。

ただし、macの場合は、openコマンドで開いた方が、バックグラウンド実行されて
ターミナルを占領されないのでそっちのがいいかもしれない。

cd path/to/project
godot -e

# macならこっちのがいいかも
open project.godot 

-s GDScriptを実行

-s = --script

godot -s --headless file.gd

上のコマンドを実行すると、
以下の2つのどちらかのClassを継承した.gdファイルを、Headlessで実行できます。

  • MainLoop
  • SceneTree

MainLoopSceneTree のスーパークラスなのですが、
全てのメソッドが仮想メソッドで、実処理が実装されていなくて使いづらいので、
Headlessで使う場合はSceneTreeの方がおすすめだと思います。

Hello Worldを書くとこんな感じです。

hello.gd
extends SceneTree

func _init():
	print("Hello, world!")
	quit()

スクリプトを実行する。

> godot -s hello.gd
# Hello, world!

ちょっとした計算機にするとか、pythonっぽい使い方ができそうです。

ちなみに、本番環境でスクリプトモード実行するのはやめときましょう。
ヘッドレスサーバー向けにバイナリをビルドできるので、そっちの方が高速です。

そのときは、--exportフラグを付けます

# プロジェクトフォルダ内で実行する
# godot --export <target> <out_path>
godot --export "Linux/X11" /var/builds/project

-d シーンをデバッグ実行する

-d = --debug

Godotエディタの右上についてるボタンと同じ挙動です。
スクリーンショット 2020-02-19 22.32.32.png
メインシーンを実行したり、個別シーンを実行したりできます。

godot -d
# .tscnファイルを指定して実行
godot -d SubScene.tscn
# headless モードで実行
godot -d --headless SubScene.tscn

個人的に、ターミナルからGodotを使う一番の動機となります。

Godot Editorからのデバッグ実行では1つのシーンしか同時に起動できません
これは、マルチプレイゲームのServer/Clientシーンを同時に起動して
デバッグしたい場合に不便です。

しかし、ターミナルのタブを複数開いてCLIから実行すれば、
同時に複数のシーンを実行することができます。

おまけ : UDPサーバーデモ

Godot 3 Tutorial– Networking

godot -s のスクリプト実行で、簡単なUDPサーバー/クライアントを
実行してみます。

Server.gd
extends SceneTree

func _init():
	var done = false
	
	# host=127.0.0.1, port=4242 でUDP通信を待受
	var socket = PacketPeerUDP.new()
	if(socket.listen(4242, "127.0.0.1") != OK):
		print("server error")
		done = true
	else:
		print("listening on port 4242 on localhost")
		
	# utf8 で "quit" パケットが来たら終了
	while (!done):
		if(socket.get_available_packet_count() > 0):
			var data = socket.get_packet().get_string_from_utf8()
			if (data == "quit"):
				done = true
			else:
				print("recieve data is {%s}" %data)
	
	socket.close()
	print("Exit App")
	self.quit()
Client.gd
extends SceneTree

func _init():
	# Serverに接続して、"Hello"を送る
	var socket = PacketPeerUDP.new()
	socket.set_dest_address("127.0.0.1", 4242)
	socket.put_packet("Hello".to_utf8())
	
	quit()

スクリプト実行

godot -s --headless Server.gd
# 別タブ
godot -s --headless Client.gd

# recieve data is {Hello}

ちなみに、UDPのテストはMac/Linuxであればnc(netcat)コマンドでも簡単にできます。

# nc {host} {port}
# -u : UDPモード
nc -u 127.0.0.1 4242
Hello^D
quit^D

# -l : Listen = サーバーモード
nc -lu 127.0.0.1 4242

Macの場合、
Ctrl + D = EOF

19
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?