我一直在尝试将SignalR实现到我的游戏中,以实时处理更新播放器位置,并将其广播给所有已连接的客户端。
但是,调用服务器集线器方法的客户端函数永远不会到达服务器,除非我在$ .connection.hub.start()。done()之后直接调用它。让我给你一个例子...
这是正确调用服务器集线器方法updatePlayerPosition,但我不想在.done上直接调用此方法:
$.connection.hub.start().done(function () {
$.connection.playerHub.server.updatePlayerPosition(playerObj)
});
但是,如果我在主要的GameEngine对象上创建一个变量,然后稍后将其调用,即每次玩家移动时,都不会发生任何事情。
$.connection.hub.start().done(function () {
gameEngine.updatePlayerPosition = function () {
$.connection.playerHub.server.updatePlayerPosition(playerObj)
//playerObj is a global variable
}
});
if (player.isMoving) {
gameEngine.updatePlayerPosition();
}
call gameengine.updateplayerposition()确实达到了正确的函数,并贯穿所有Signalr.js,但是服务器上的断点未达到。
这是集线器代码(我尚未添加用于更新集线器上的播放器的功能,我只想先进行通信)
)using Microsoft.AspNet.SignalR;
using RPGGameCS.Models.Player;
namespace RPGGameCS
{
public class PlayerHub : Hub
{
public void UpdatePlayerPosition(IPlayer player)
{
Clients.All.updatePlayerPosition(player);
}
}
}
我所看到的所有信号示例的所有示例将这些服务器调用绑定到点击事件,我不想做。看来这应该是可能的,但是到目前为止,我尝试过的任何事情都没有起作用。我做错了吗?或者,也许不可能以这种方式委派Singalr函数?
编辑1 ***:因此,它似乎与我发送到集线器方法的播放器对象有关。当我使播放器对象无效时,通信似乎正常。但是,当我发送实际播放器对象时,断裂点永远不会被击中。
方法签名必须匹配。
在您的集线器中,您有一个参数iPlayer,在客户端上,您没有设置此参数。gameEngine.updatePlayerPosition();
与public void UpdatePlayerPosition(IPlayer player)
如果您致电gameengine.updateplayerPosition();SignalR通过名称和参数在连接的集线器上搜索一种方法。在这种情况下,我认为您应该在日志中找到它。
启用测试日志:
$.connection.hub.logging = true;
$.connection.hub.start();
(https://learn.microsoft.com/en-us/aspnet/signalr/signalr/overview/testing-and-debugging/enabling-signalr-tracing)