我一直在尝试做一个基于浏览器的游戏(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对等连接一起工作
1条答案
按热度按时间mbzjlibv1#
所以事实证明,我只是愚蠢的.你可以用WebSockets做rpc调用,但是,在godot 4中,您需要确保节点的路径相同,并且假设两个项目都具有所有@rpc方法。它们不需要在其中包含任何内容,只需声明和“pass”。因此,这不起作用的原因是因为服务器脚本中的@rpc函数试图调用@ rpc在其他服务器脚本,但他们不能,因为其他服务器脚本或客户端的一个没有创建一个对等体,所以没有id.简单地说,让我们说,你试图做服务器身份验证,你有网关服务器之间的客户端和身份验证
字符串
还要确保注解使用相同的参数,否则校验和将失败