Передать обратный вызов из Unity в JavaScript и обратно в Unity

1

Я пытаюсь запустить Action которое отправляет данные в javascript в браузере, и когда он заканчивается, он выполняет обратный вызов, и когда завершение обратного вызова завершается, он запускает элемент в С#, который запускает исходный обратный вызов.

Вот порядок звонков: GameSmart.User.IsGuest(Action origCallback) → IsGuestUser(/*Executes the javascript*/) → GuestResponse(string json) → origCallback()

Как только я компилирую и запускаю игру, я получаю следующее сообщение в хром-консоли:

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));
  }
}

Вот классы ответа/ответа:

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, чтобы использовать _malloc и writeStringToMemory я попробовал это, и он выдает то же сообщение об ошибке.

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);
  });
},
  • 0
    Возможно, вам следует использовать _malloc и writeStringToMemory перед передачей строки параметра на стороне Javascript. Не совсем уверен, но вы должны попробовать это.
  • 0
    @Programmer Программист, который, похоже, не работает, я обновил вопрос тем, что попробовал.
Теги:
unity3d
unity-webgl

1 ответ

0

Для следующей души, которая сталкивается с этим:

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

следует изменить на

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню