Вызов функции Angular2 из Unity WebGL

В настоящее время я работаю с Angular2 версии 2.1.2 с визуализатором Unity, созданным с помощью Unity 5.5.

Что мне нужно сделать, так это общаться из Unity с Angular2.
Я использовал код, похожий на приведенный ниже

public void GetBillOfMaterials(string callbackFn)
    {
        var result = LightSystem.BillOfMaterials.Aggregate("", (current, material) => current + (material + Environment.NewLine));

        Application.ExternalCall(callbackFn, result);
    }

Где указанная выше функция будет вызываться в Angular2, как показано ниже

public GetBillOfMaterial() 
{
  SendMessage("Manager", "GetBillOfMaterials", "alert");
}

Проблема в том, что когда я пробую любую функцию angular2 внутри callbackFn, она не находит мою функцию.

Функция, которую я пытаюсь вызвать, находится внутри службы, которая выглядит так:

import { Injectable } from '@angular/core';
import { FinishService } from "./sysWideComps/finish/finish.service";
import { ColorService } from "./sysWideComps/colorTemp/color.service";
import { CircuitService } from "./filters/tabs/circuit/circuit-service";
import { StandoffService } from "./filters/tabs/standoff/standoff-tab.service";
@Injectable()
export class UnityService {
  private isFirstCall: boolean = true;
  constructor(private colorService: ColorService, private finishService:FinishService, private circuitService: CircuitService, private standoffService: StandoffService) { }

public ChangeFinish(finishType: string) {
  console.log(`This is the finish type ${finishType}`);
  this.sendMsgParam("ChangeFinish", finishType);
}

public ChangeColorTemp(colorTemp: number) {
  this.sendMsgParam("ChangeColorTemperature", colorTemp);
}
public ChangeCircuit(circuitType: string) {
  this.sendMsgParam("ChangeCircuit", circuitType);
}

public CreateModel(params: string) {
if (this.isFirstCall) {
  this.ChangeCircuit(this.circuitService.getCircuit());
  this.ChangeFinish(this.finishService.getFinish().FinishName.replace(" ", ""));
  this.ChangeStandoffLength(this.standoffService.getStandoffLength());
  //Dropdown goes here
  let tempCTemp = this.colorService.getColorTemp().Temperature.replace("k", "");
  let tempNum: number =+ tempCTemp;
  this.ChangeColorTemp(tempNum);
  this.isFirstCall = false;
}
  this.sendMsgParam("CreateModel", params);
}
public Delete() {
  this.sendMsg("Delete");
}

public ResetView() {
  this.sendMsg("ResetCamera");
}

public RotateObject() {
  this.sendMsg("RotateCurrentObject");
}

public Unselect() {
  this.sendMsg("Unselect");
}

ChangeStandoffLength(input: number) {
  this.sendMsgParam("ChangeSystemDropdownLength", input.toString());
}

public AddStandoff(params: string) {
  let data: string = params;
  this.sendMsgParam("AddStandoffs", data);
}

public GetBillOfMaterial() {
  SendMessage("Manager", "GetBillOfMaterials", "alert");
}

public testFunction(input: string) {
  alert(input);
}

sendMsgParam(functionName: string, params: any) {
  SendMessage("Manager", functionName, params);
}

sendMsg(functionName: string) {
  SendMessage("Manager", functionName);
}
}

В основном мне нужно иметь возможность вызывать "TestFunction" внутри вышеуказанной службы из Unity, используя Application.ExternalCall () или любую другую функцию, которая могла бы работать.
Дайте мне знать, если есть какие-либо дополнительные разъяснения, которые я могу сделать.

Спасибо!


person NewDeveloper    schedule 20.02.2017    source источник
comment
testFunction находится внутри модуля Angular, поэтому предположительно это будет что-то вроде Application.ExternalCall("UnityService.testFunction","Hello angular");.   -  person Luke Briggs    schedule 20.02.2017
comment
Вы пробовали использовать Application.ExternalCall? Что с этим работало или не работало?   -  person rutter    schedule 20.02.2017
comment
Я пробовал Application.ExternalCall (testFunction, привет), и это не сработало, но я попробую определить область видимости, чтобы увидеть, исправляет ли это это. Изменить: я пробовал перейти к UnityService.testFunction, и это не сработало   -  person NewDeveloper    schedule 20.02.2017
comment
В ответ на приведенный выше комментарий я получил ошибку javascript UnityService not defined. Должен быть способ сообщить единству, где находится функция и что им нужно найти.   -  person NewDeveloper    schedule 20.02.2017
comment
@NewDeveloper. Это зависит от того, какой у вас модуль angular - это всего лишь предположение, основанное на вашей строке экспорта. Может быть, попробуйте подумать об этом так: что вам нужно поместить в вашу JS-консоль только на веб-страницу, чтобы запустить testFunction? = ›Поместите это в ExternalCall.   -  person Luke Briggs    schedule 20.02.2017
comment
@LukeBriggs, похоже, это может быть решением того, о чем вы говорите, я просто не уверен, как это подключить? stackoverflow.com/questions/35296704/   -  person NewDeveloper    schedule 20.02.2017
comment
@NewDeveloper Ага; вам нужно предоставить testFunction глобально (чтобы вы могли вызывать его из любого места, например, через консоль JS или из Unity). Модули Angular являются частными по своей конструкции (недоступны глобально), поэтому во время настройки вашего модуля (в функции инициализации) вы должны поймать его как глобальную переменную. Из-за этого частного дизайна angular делает кучу предположений (которые нарушаются, вызывая его глобально), поэтому вы также должны вручную вызвать метод apply, чтобы убедиться, что любые изменения в вашем модуле angular актуальны.   -  person Luke Briggs    schedule 20.02.2017
comment
Я не большой поклонник angular, но, надеюсь, это поможет описать, что делают эти ответы, чтобы вы могли применить их по мере необходимости к своему модулю :)   -  person Luke Briggs    schedule 20.02.2017
comment
Большое спасибо за ваш совет. Я опубликовал решение, которое заработало благодаря вашей помощи! Это было огромным препятствием, которое нужно было преодолеть, ха-ха   -  person NewDeveloper    schedule 20.02.2017


Ответы (1)


Я действительно решил вопрос для всех, кто заинтересован в решении.

Следуя примеру из этого вопроса SO: Angular2 - как вызывать функцию компонента извне приложения

Я обновил служебную функцию GetBillOfMaterial, чтобы она выглядела следующим образом:

constructor(
 private colorService: ColorService
,private finishService:FinishService  
,private circuitService: CircuitService
,private standoffService: StandoffService
,private ngZone:NgZone) { }

public GetBillOfMaterial{
  if(!this.isConfigured) {
    this.isConfigured = true;
    window.my = window.my || {};
    window.my.namespace = window.my.namespace || {};
    window.my.namespace.publicFunc = this.PubFunc.bind(this);
  }
  SendMessage("Manager", "GetBillOfMaterials", "window.my.namespace.publicFunc");
}

public PubFunc(input: string) {
  this.ngZone.run(() => this.testFunction(input));
}

public testFunction(input: string) {
  alert(input);
}

Вышеупомянутое решение позволит вам вызвать ЛЮБУЮ функцию angular2 из модуля / службы из единства, все еще используя метод «Application.ExternalCall ()».

person NewDeveloper    schedule 20.02.2017