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

jw5wzhpr  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(379)

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

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

我的Server.gd

#Adds player scene, name=id is used for taking control in player controller script
@rpc("any_peer", "call_local")
func addNewPlayer(id):
    var currentPlayer = PlayerScene.instantiate()
    currentPlayer.name = str(id)
    get_tree().root.add_child(currentPlayer)
    currentPlayer.global_position = $PlayerSpawn.global_position
    pass

#Adds all existing player scenes for player that joined later
@rpc("any_peer", "call_local")
func addExistingPlayers(idExcluded):
    for key in users:
        var user = users[key]
        if idExcluded == user.id:
            continue
        addNewPlayer(user.id)

#As for calling the RPC, the packets are polled in _process and parsed into string and called like so:
#Only sending this to the new player
addExistingPlayers.rpc_id(int(data.id), data.id)
addNewPlayer.rpc(data.id)

字符串
我的Client.gd

#I create websocket peer
var peer_socket = WebSocketMultiplayerPeer.new()
#and once client gets assigned ID from the server after connecting this is run
multiplayer.multiplayer_peer = peer_socket

#As for sending the packet to the server
var message = {
    "message": Utilities.PacketMessage.AVATAR_SPAWN,
    "id": id
}
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.简单地说,让我们说,你试图做服务器身份验证,你有网关服务器之间的客户端和身份验证

#Your Gateway.gd in client project can look like this
#This will only be called from client using testRPC_Client.rpc()
@rpc("any_peer")
func testRPC_Client():
    print("testRPC_Client")
    
#This will only be called from gateway using testRPC_Gate.rpc()
@rpc("any_peer")
func testRPC_Gate():
    #You can put ANYTHING HERE
    pass

#And your Gateway.gd in Gateway project will have to then contain these methods
#This will only be called from client using testRPC_Client.rpc()
@rpc("any_peer")
func testRPC_Client():
    #You can put ANYTHING HERE
    pass

#This will only be called from gateway using testRPC_Gate.rpc()
@rpc("any_peer")
func testRPC_Gate():
    print("testRPC_Gate")

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

相关问题