如何在Godot 4.1中使用WebSocket调用RPC|浏览器多人游戏(WebSocket + webRTC)(尝试调用RPC,但对等ID未知)

jw5wzhpr  于 2024-01-09  发布在  Go
关注(0)|答案(1)|浏览(479)

我一直在尝试做一个基于浏览器的游戏(html5出口),这将有主大厅,玩家可以走动和聊天,与迷你游戏,将是独奏或合作.我已经设法设置服务器以下的教程,并开始调整它(https://youtu.be/ulfGNtiItnc?si=fvJbxVO1NcsSaaSk)发送数据包对于聊天消息很有效,但是当我尝试生成一个玩家头像时,rpc只在服务器上调用。Godot的所有示例的层次结构都是相同的
控制

  • 客户端
    • PlayerSpawn
  • 服务器
    • PlayerSpawn

我的Server.gd

  1. #Adds player scene, name=id is used for taking control in player controller script
  2. @rpc("any_peer", "call_local")
  3. func addNewPlayer(id):
  4. var currentPlayer = PlayerScene.instantiate()
  5. currentPlayer.name = str(id)
  6. get_tree().root.add_child(currentPlayer)
  7. currentPlayer.global_position = $PlayerSpawn.global_position
  8. pass
  9. #Adds all existing player scenes for player that joined later
  10. @rpc("any_peer", "call_local")
  11. func addExistingPlayers(idExcluded):
  12. for key in users:
  13. var user = users[key]
  14. if idExcluded == user.id:
  15. continue
  16. addNewPlayer(user.id)
  17. #As for calling the RPC, the packets are polled in _process and parsed into string and called like so:
  18. #Only sending this to the new player
  19. addExistingPlayers.rpc_id(int(data.id), data.id)
  20. addNewPlayer.rpc(data.id)

字符串
我的Client.gd

  1. #I create websocket peer
  2. var peer_socket = WebSocketMultiplayerPeer.new()
  3. #and once client gets assigned ID from the server after connecting this is run
  4. multiplayer.multiplayer_peer = peer_socket
  5. #As for sending the packet to the server
  6. var message = {
  7. "message": Utilities.PacketMessage.AVATAR_SPAWN,
  8. "id": id
  9. }
  10. peer_socket.put_packet(JSON.stringify(message).to_utf8_buffer())


尽管成功连接,服务器不知道任何客户端,即使它发送给他们的唯一ID
编辑:第一名:在重读文档时,“对于成功的远程调用,发送和接收节点需要具有相同的NodePath,这意味着他们必须有相同的名称”. sooo这是否意味着我需要有2个项目.一个服务器的东西和客户端的东西,并在服务器之一(因为我想服务器的权威)我将产卵的球员和客户端的脚本将被命名为相同的,但@rpc函数将是空白的?或者因为它对我来说仍然没有意义,考虑到我当前的项目具有这两个脚本,但Server.gd似乎只在godot 2nd的HOST示例上工作:我尝试制作2个项目,一个用于服务器,一个用于客户端.. RPC仍然无法与WebSocket对等连接一起工作

mbzjlibv

mbzjlibv1#

所以事实证明,我只是愚蠢的.你可以用WebSockets做rpc调用,但是,在godot 4中,您需要确保节点的路径相同,并且假设两个项目都具有所有@rpc方法。它们不需要在其中包含任何内容,只需声明和“pass”。因此,这不起作用的原因是因为服务器脚本中的@rpc函数试图调用@ rpc在其他服务器脚本,但他们不能,因为其他服务器脚本或客户端的一个没有创建一个对等体,所以没有id.简单地说,让我们说,你试图做服务器身份验证,你有网关服务器之间的客户端和身份验证

  1. #Your Gateway.gd in client project can look like this
  2. #This will only be called from client using testRPC_Client.rpc()
  3. @rpc("any_peer")
  4. func testRPC_Client():
  5. print("testRPC_Client")
  6. #This will only be called from gateway using testRPC_Gate.rpc()
  7. @rpc("any_peer")
  8. func testRPC_Gate():
  9. #You can put ANYTHING HERE
  10. pass
  11. #And your Gateway.gd in Gateway project will have to then contain these methods
  12. #This will only be called from client using testRPC_Client.rpc()
  13. @rpc("any_peer")
  14. func testRPC_Client():
  15. #You can put ANYTHING HERE
  16. pass
  17. #This will only be called from gateway using testRPC_Gate.rpc()
  18. @rpc("any_peer")
  19. func testRPC_Gate():
  20. print("testRPC_Gate")

字符串
还要确保注解使用相同的参数,否则校验和将失败

展开查看全部

相关问题