Отправка сообщения из Unity WebGL на страницу vue, встраивающую его

У меня есть веб-страница vue с содержащимся в ней единством WebGL. Теперь я хотел бы иметь возможность отправлять сообщение (JSON и изображение) из Unity на страницу vue.

Я уже знаю, как сделать обратное (отправить строку из vue в единицу)

import Vue from 'vue'
import Vuex from 'vuex'
import { mapState, mapMutations, mapActions } from 'vuex'
import Unity3dViewer from '../3d-viewer/3d-viewer';

export default {
   methods: {
        PlaceItem: function(){

            alert("placed object" )
            var data = Unity3dViewer.data();
            data.gameInstance.SendMessage("BrowserCommunication", "PlaceLight", Vue.prototype.$productID);
        },
    }
}

Однако я не могу понять, как заставить работать обратное. Я просмотрел это. Но когда я пытаюсь поместить функцию в методы

 export default {
   methods: {
     mergeInto(LibraryManager.library, {

      Hello: function () {
        window.alert("Hello, world!");
       },
  }) 
}}

Он не компилируется (он ожидает a вместо a. В LibraryManager.library).

Я также нашел this, который обещает двустороннюю связь, но документирует только одностороннюю связь.

Кто-нибудь знает, как это сделать?


person Thijser    schedule 10.10.2018    source источник


Ответы (1)


Вы должны добавить точку с запятой в конце }). Вам также не нужен , в конце }, если у вас нет другой функции ниже той, которой у вас нет в данный момент, поэтому удалите эту запятую.

mergeInto(LibraryManager.library, {
  Hello: function(param) {
    alert(Pointer_stringify(str));
  }
});

Сторона C #:

[DllImport("__Internal")]
private static extern void Hello (string message);

См. в этом с информацией о плагине vue-unity.

Ниже приведен базовый пример плагина для отправки или возврата значений в и из плагина Javascript без какого-либо внешнего плагина:

Javascript:

var PluginName = {

    //Function without argument 
    GetMessage: function(){
        var level = "Hello World!";

        var buffer = _malloc(lengthBytesUTF8(level) + 1);
        writeStringToMemory(level, buffer);
        return buffer;
    },

    //Function with argument 
    SendMessage: function(param){
        alert(Pointer_stringify(str));
    }
};
mergeInto(LibraryManager.library, PluginName);

C #:

[DllImport("__Internal")]
private static extern string GetMessage();

[DllImport("__Internal")]
private static extern void SendMessage(string str);

void Start()
{
    string message = GetMessage();
    Debug.Log("Message: " + message);

    SendMessage("Hello World!");
}
person Programmer    schedule 10.10.2018
comment
Как мне поместить это в vue? - person Thijser; 10.10.2018
comment
В моем втором примере назовите файл PluginName.jslib` и поместите его в папку Assets/Plugins/WebGL. - person Programmer; 10.10.2018
comment
Конечно, я имею в виду, как заставить компонент vue прослушивать сообщения? - person Thijser; 10.10.2018
comment
Я смущен. Я думал, вы хотели отправить сообщение из Unity в javascript webgl? Это показывает вам, как это сделать - как вызвать функцию Javascript из Unity. Есть проблема? - person Programmer; 10.10.2018
comment
Я хочу отправить данные из unity в vue, я могу отправлять данные из vue в единицу и из unity в объект javascript, но я не могу получить данные в vue (ну, сейчас строка __VUE_DEVTOOLS_GLOBAL_HOOK__.store.state.unityObject=json; , похоже, работает при правильных условиях, но он далек от совершенства, так как требует vue devtools). - person Thijser; 11.10.2018
comment
Также, если кто-то захочет скопировать __VUE_DEVTOOLS_GLOBAL_HOOK__.store.state.unityObject=json, вам потребуются инструменты vue dev, установленные в браузере пользователя, иначе они не сработают. - person Thijser; 13.10.2018