Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity vs CORS vs JS скрипты из интернета

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

Поделиться
Wing13Постоялецwww10 авг. 201721:37#0
Всем привет!
Есть в интернете некоторый недоступный мне 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' и не работает.

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

Правка: 11 авг. 2017 3:08

vizglПостоялецwww11 авг. 20173:44#1
Попробуй переопределить метод document.write, перед загрузкой скрипта

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

Правка: 11 авг. 2017 4:06

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

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

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

seamanПостоялецwww11 авг. 201711:38#3
А где собственно в коде 'write' на документе?
Записать в уже опарсенный документ, конечно не даст, но вы же вроде этого и не делаете, а работаете непосредственно с DOM...
vizglПостоялецwww11 авг. 201712:35#4
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);

Правка: 11 авг. 2017 12:47

Wing13Постоялецwww11 авг. 201716:27#5
vizgl о, заработало, спасибо!
                             document.write = function(data) {
                                                              console.dir(data);
                                                             }
Вот такой код бросает ответ от скрипта в консоль, а значит я уже могу перекинуть его в виде текста в Unity и делать с ним все что мне надо.

/ Форум / Программирование игр / Сеть

2001—2017 © GameDev.ru — Разработка игр