Я пытаюсь запустить 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);
});
},
Для следующей души, которая сталкивается с этим:
Runtime.dynCall('vZ', obj, buffer);
следует изменить на
Runtime.dynCall('vi', obj, [buffer]);
_malloc
иwriteStringToMemory
перед передачей строки параметра на стороне Javascript. Не совсем уверен, но вы должны попробовать это.