Войти
UnityФорумСеть

Unity vs CORS vs JS скрипты из интернета

#0
21:37, 10 авг 2017

Всем привет!
Есть в интернете некоторый недоступный мне 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' и не работает.

Вопрос: Кто виноват? Что делать?

#1
3:44, 11 авг 2017

Попробуй переопределить метод document.write, перед загрузкой скрипта

document.write = function(data) {
  $(data).appendTo('head');
}

#2
6:46, 11 авг 2017

vizgl Я заменил на document.write = function(data) {data.appendChild('head');} так как подключить jQuery нет возможности, теперь говорит:

Uncaught TypeError: data.appendChild is not a function
at HTMLDocument.document.write

А в чем суть, можно заменить метод? Может как-то сразу его содержимое в string его можно записать? Я просто не очень знаю что есть в JS.

#3
11:38, 11 авг 2017

А где собственно в коде 'write' на документе?
Записать в уже опарсенный документ, конечно не даст, но вы же вроде этого и не делаете, а работаете непосредственно с DOM...

#4
12:35, 11 авг 2017

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

#5
16:27, 11 авг 2017

vizgl о, заработало, спасибо!

                             document.write = function(data) {
                                                              console.dir(data);
                                                             }

Вот такой код бросает ответ от скрипта в консоль, а значит я уже могу перекинуть его в виде текста в Unity и делать с ним все что мне надо.

UnityФорумСеть

Тема в архиве.