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モジュールを使う必要がある。