Help us understand the problem. What is going on with this article?

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

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 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

個人的に、ターミナルから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 Server.gd
# 別タブ
godot -s 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした