Godot ネットっワーク

HTTPリクエスト

 1 extends Node
 2 
 3 func _ready() -> void:
 4     var hr: HTTPRequest = get_node("HTTPRequest")
 5     hr.request_completed.connect(_on_request_completed)
 6     hr.request("https://moli-green.xyz")
 7     
 8 
 9 func _on_request_completed(result: int, response_code: int,
10     headers: PackedStringArray, body: PackedByteArray):
11     var text = body.get_string_from_utf8()
12     print("%s" % [text])

ペインを使って接続するならこんな感じ。

1 # node.gd
2 extends Node
3 
4 func _ready() -> void:
5     $HTTPRequest.request('https://moli-green.xyz')
 1 # http_request.gd
 2 extends HTTPRequest
 3 
 4 func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
 5     match result:
 6         HTTPRequest.Result.RESULT_SUCCESS:
 7             for i in headers:
 8                 print(i)
 9             print("%s" % body.get_string_from_utf8())
10         _:
11             pass

OS

サーバーとして起動されているのか、クライアントとして起動されているのか調べるのに必要になる。

専用サーバーとしてエクスポート

Godotでは基本的に、サーバーとクライアントを同じプロジェクトとして作成する。

ただ、サーバーの場合は専用サーバーとしてエクスポートする。この場合グラフィックライブラリが含まれないようになる。また不要なリソースは手動で含めないようにできる。

プロジェクト -> エクスポート -> リソース から設定する。

また、RaspberryPiにエクスポートするのでプラットフォームLinux、アーキテクチャarm64を選択する。

以下、簡単なサンプル。

1 extends Node
2 
3 func _ready() -> void:
4     print("linux: %s" % OS.has_feature("linux"))
5     print("dedicated_server: %s" % OS.has_feature("dedicated_server"))

OS.has_feature("dedicated_server")でサーバーとして起動されているかどうか調べることができるので、これでクライアントと、サーバーで処理を切り分ける。

High-level muitiplayer

一度WebSocketでテストしてみようと思ったが、クラスがなくなっていたので、テストできなかった。

いきなりこれをやるしかないが、それはまだ時期尚早だろう。シグナル関係にもっと慣れてからでないと難しい。

MultiplayerAPI

ENetMultiplayerPeer

とりあえず動いたコード。

 1 extends Node
 2 
 3 const PORT = 7000
 4 
 5 func _ready() -> void:
 6     var peer = ENetMultiplayerPeer.new()
 7     
 8     var x = get_tree().get_multiplayer()
 9     
10     var y = x.is_server()
11     
12     return
13     
14     #if self.multiplayer.is_server():
15         #peer.create_server(PORT)
16         #print("server")
17     #else:
18         #peer.create_client("pi.local", PORT)
19         #print("client")
20 
21     #peer.create_server(PORT)
22     #print("server")
23 
24     #peer.create_client("pi.local", PORT)
25     #print("client")
26 
27     self.multiplayer.multiplayer_peer = peer
28         
29 func _process(delta: float) -> void:
30     if Input.is_action_just_pressed("ui_accept"):
31         print("test")
32         print(multiplayer.get_unique_id())
33         hello.rpc()
34 
35 @rpc("any_peer", "call_remote", "unreliable", 0)
36 func hello():
37     print(multiplayer.get_unique_id())
38     print("hello")

サーバーモードで起動するか、クライアントモードで起動するか切り分ける方法が必要だ。いくつか方法は考えられるが、コマンドラインオプションを使うのが簡単だろう。そのためにはOSモジュールを使う必要がある。

公式マニュアルの解説には不足している情報がある