我想在我的 Unity javascript 代码中使用来自 Yahoo Games Network 的 Player.IO。PlayerIO 提供了仅用 C# 编写的统一示例项目,所以我在让回调工作时遇到问题。
PlayerIO.Connect
Unity 的 Player.IO 文档中的描述(可在此处获得):
public void Connect (string gameId, string connectionId, string userId, string auth,
string partnerId, String[] playerInsightSegments,
Callback<Client> successCallback, Callback<PlayerIOError> errorCallback)
那么如何让这些回调起作用呢?
问题的以下部分显示了我已经尝试过但没有奏效的方法。
首先,我尝试过这种方式(正如我从 javascript 中知道的那样):
function success(client : Client) {
//function content
}
PlayerIOClient.PlayerIO.Connect(pioGameId, pioConnectionId, pioUserId, pioAuth, pioPartnerId, success, failed);
.
那是不对的,我知道我应该使用代表。从 Unity3D 官方教程(可在此处获得)中,在 JS 中正确使用委托应该是这样的(使用Function
类型):
var successDelegate : Function;
function success(client : Client) {
//function content
}
function Start () {
successDelegate = success;
PlayerIOClient.PlayerIO.Connect(pioGameId, pioConnectionId, pioUserId, pioAuth, pioPartnerId, success, failed);
}
这导致以下错误:
InvalidCastException:无法从源类型转换为目标类型。Main+$Start$2+$.MoveNext()
.
之后,我在 Player.IO 论坛(可在此处获得)上找到了一个名为Utilizing Player.IO in Unity Javascript的主题。该主题的作者建议在 JS 中创建委托的方法:直接进入 .Net 类型并将它们声明为System.Delegate
.
var pioConnectSuccessCallback : System.Delegate;
function success(client : Client) {
//function content
}
function Start () {
pioConnectSuccessCallback = System.Delegate.CreateDelegate(typeof(PlayerIOClient.Callback.<PlayerIOClient.Client>), this, "success");
PlayerIOClient.PlayerIO.Connect(pioGameId, pioConnectionId, pioUserId, pioAuth, pioPartnerId, pioConnectSuccessCallback, pioConnectErrorCallback);
}
不幸的是,这对我也不起作用,尽管论坛上的人将它作为一个可行的解决方案(但它可能已经过时)。
我得到的错误:
资产/Main.js(51,35):BCE0023:参数列表“(字符串,字符串,字符串,字符串,字符串,System.Delegate,System.Delegate)”没有适当版本的“PlayerIOClient.PlayerIO.Connect”是成立。
所以看起来 Connect 方法不喜欢System.Delegate
作为参数或者那些没有很好地初始化。