将回调从Unity传递回JavaScript并返回Unity

问题描述 投票:1回答:1

我正在尝试运行一个Action,它将数据发送到浏览器上的javascript,当浏览器完成时,它运行一个回调,当回调完成时,它运行C#中运行原始回调的项目。

以下是电话订单:GameSmart.User.IsGuest(Action origCallback) -> IsGuestUser(/*Executes the javascript*/) -> GuestResponse(string json) -> origCallback()

编译并运行游戏后,我在chrome控制台中收到以下消息:

MarshalDirectiveException:无法编组类型'GameSmart.Response`1 <GameSmart.IsGuestResponse>'。

我不确定这是说什么,甚至意味着什么。有什么我做错了吗?

这是GameSmart.User类:

public class User : API {
  [DllImport("__Internal")]
  public static extern void IsGuestUser(Response<IsGuestResponse> response);

  [MonoPInvokeCallback(typeof(Action))]
  public static void GuestResponse(Response<IsGuestResponse> r, string data) {
    r.callback(JsonUtility.FromJson<IsGuestResponse>(data));
  }

  public static void IsGuest(Action<IsGuestResponse> callback) {
    IsGuestUser(new Response<IsGuestResponse>(callback));
  }
}

以下是Response / Respond类:

public class Respond { }

public class Response<T> : Respond {
  public Action<T> callback;

  public Response(Action<T> cb) {
    callback = cb;
  }

  public void Action(Action act, params object[] args) {
    act();
  }

}

JavaScript部分如下所示:

var GameSmartJs = {
  $GameSmartJs: {},

  IsGuestUser: function (obj) {
    gamesmart.user.isGuest(function (result) {
      this.runCallback('GuestResponse', obj, result);
    });
  },

  runCallback: function (callbackName, callback, result) {
    GameSmartJs[callbackName] = callback;
    Runtime.dynCall('vZ', callback, Pointer_stringify(result));
  }

};

autoAddDeps(GameSmartJs, '$GameSmartJs');
mergeInto(LibraryManager.library, GameSmartJs);

编辑

根据@Programmer建议,使用_mallocwriteStringToMemory我试过这个,它会产生相同的错误信息。

IsGuestUser: function (obj) {
  gamesmart.user.isGuest(function (result) {
    GameSmartUser.GuestResponse = obj;
    var buffer = _malloc(lengthBytesUTF8(result) + 1);
    writeStringToMemory(result, buffer);
    Runtime.dynCall('vZ', obj, buffer);
  });
},
javascript c# unity3d unity-webgl
1个回答
0
投票

对于遇到这个问题的下一个灵魂:

Runtime.dynCall('vZ', obj, buffer);

应改为

Runtime.dynCall('vi', obj, [buffer]);

© www.soinside.com 2019 - 2024. All rights reserved.