Всем привет!
Есть в интернете некоторый недоступный мне js скрипт, результаты работы которого я хочу получить прямо внутри Unity.
Когда игра запускается в редакторе я делаю запрос GET
UnityWebRequest.Get(адрес где лежит скрипт);
И все работает, я получаю ответ от скрипта, который уже обрабатываю.
Но когда игра в WebGL и загружена в интернет выпадает ошибка CORS что cross domain запросы запрещены.
Гугл рассказал, что обойти COSR ограничения можно только через JSONP пользуясь JS скриптом примерно такого вида:
var script = document.createElement('script'); script.setAttribute('src', url); document.getElementsByTagName('head')[0].appendChild(script);
Такие запросы не попадают под политику CORS потому что как-то подключать скрипты надо.
На форуме Unity я прочел ответ разработчиков движка о том, что средствами движка обойти CORS нельзя, надо писать плагин.
Я пробовал написать js плагин как написано вон там:
https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html
Не силен в JS, получилось такое:
mergeInto(LibraryManager.library, { GetRotator: function (str) { var url = Pointer_stringify(str); function jsonpCallback(data){console.dir(data);}; var script = document.createElement('script'); script.src = url+"?callback=jsonpCallback"; document.getElementsByTagName('head')[0].appendChild(script); }, });
Во время работы приложения оно выдает ошибку Failed to execute 'write' on 'Document' и не работает.
Вопрос: Кто виноват? Что делать?
Попробуй переопределить метод document.write, перед загрузкой скрипта
document.write = function(data) {
$(data).appendTo('head');
}
vizgl Я заменил на document.write = function(data) {data.appendChild('head');} так как подключить jQuery нет возможности, теперь говорит:
Uncaught TypeError: data.appendChild is not a function
at HTMLDocument.document.write
А в чем суть, можно заменить метод? Может как-то сразу его содержимое в string его можно записать? Я просто не очень знаю что есть в JS.
А где собственно в коде 'write' на документе?
Записать в уже опарсенный документ, конечно не даст, но вы же вроде этого и не делаете, а работаете непосредственно с DOM...
seaman
write в загружаемом скрипте
Wing13
> А в чем суть, можно заменить метод? Может как-то сразу его содержимое в string
> его можно записать? Я просто не очень знаю что есть в JS.
Загружаемый скрипт пытается сделать write, но на этом этапе этого уже нельзя делать. Поэтому, просто подменяем метод write на свой, который позволяет добавлять элементы в уже сформированном dom
Что-то типа такого:
document.write = function(data) { var head = document.getElementsByTagName("head")[0]; head.innerHTML += data; }
P.S. еще надо смотреть куда скрипт делает write, если в head, то код подойдет, если в другой элемент, то заменить на document.getElementById(elementIdString);
vizgl о, заработало, спасибо!
document.write = function(data) { console.dir(data); }
Вот такой код бросает ответ от скрипта в консоль, а значит я уже могу перекинуть его в виде текста в Unity и делать с ним все что мне надо.
Тема в архиве.