【发布时间】:2017-11-27 19:07:52
【问题描述】:
我一直在尝试在我的游戏中实现 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();
}
调用 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);
}
}
}
我见过的所有 signalR 示例都将这些服务器调用绑定到点击事件,我不想这样做。看起来这应该是可能的,但到目前为止我所尝试的都没有奏效。有什么我做错了吗?或者也许无法以这种方式委派 singalR 函数?
编辑 1***:所以它似乎与我发送到集线器方法的播放器对象有关。当我将播放器对象设为空时,通信似乎工作正常。但是当我发送实际的玩家对象时,断点永远不会被击中。
【问题讨论】:
标签: javascript c# asp.net signalr