2017-02-20 4 views
1

Momentan arbeite ich mit Angular2 Version 2.1.2 mit einem Unity Visualizer, der mit Unity 5.5 erstellt wurde.Aufruf einer Angular2-Funktion von Unity WebGL

Was ich tun muss, ist von Unity zu Angular2 zu kommunizieren.
ich Code ähnlich mit unter

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

     Application.ExternalCall(callbackFn, result); 
    } 

Wo die obige Funktion in Angular2 wie unten

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

Das Problem genannt werden würde, ist, dass wenn ich versuche, jede angular2 Funktion innerhalb des „callbackFn“ es wird meine Funktion nicht finden.

Die Funktion I ist innerhalb eines Dienstes zu nennen bin versucht, die wie folgt aussieht:

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

muß ich grundsätzlich in der Lage sein, „Testfunction“ zu nennen Application.ExternalCall innerhalb des oben genannten Service von Unity mit() oder welche Funktion auch immer funktionieren würde.
Lassen Sie mich wissen, ob es noch weitere Erklärungen gibt, die ich machen kann.

Danke!

+1

'testFunction' befindet sich in einem Angular-Modul, so dass es ungefähr so ​​aussieht wie' Application.ExternalCall ("UnityService.testFunction", "Hello eckig"); '. –

+0

Haben Sie versucht, 'Application.ExternalCall' zu verwenden? Was hat damit funktioniert oder nicht? – rutter

+0

Ich habe versucht Application.ExternalCall ("testFunction", "Hallo") und das hat nicht funktioniert, aber ich werde versuchen, das Scoping, um zu sehen, ob das es behebt. Edit: Ich habe versucht zu "UnityService.testFunction" Scoping und das hat nicht funktioniert – NewDeveloper

Antwort

1

Ich habe die Frage tatsächlich für jeden gelöst, der sich für die Lösung interessiert.

dem Beispiel aus dieser Frage SO Folgende: Angular2 - how to call component function from outside the app

ich die Servicefunktion von „GetBillOfMaterial“ aktualisiert haben, wie unten zu sehen:

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

Die obige Lösung Sie ANY angular2 anrufen können Funktion von Modul/Dienst von Einheit, während die Methode "Application.ExternalCall()" weiterhin verwendet wird.

Verwandte Themen