2017-05-01 3 views
0

Ich habe ein Netzwerk Unity Projekt HLAPI mit, von dem ich aufbauen müssen:Ungelöste Namespace UnityEngine.VR.WSA

  • A Hololens Client (Plattform = WSA)
  • Ein Windows-Desktop-Client (Plattform = PC Standalone)
  • ein Windows-Desktop-Server (Plattform = PC Standalone)

ich habe drei spezielle Szenen, eine für jede dieser Rollen und eine Basis-Szene, die nur eine von ihnen zur Laufzeit lädt je nach eine Rolle die Einstellung.

Hier ist das Problem von dort. Ich habe Skripte, einschließlich der HoloToolkit von Microsoft, referenziert in der Hololens-Client-Szene mit Klassen in Namespaces UnityEngine.VR.WSA und UnityEngine.VR.WSA.Ipnut. Das passt gut für die WSA-Plattform. Wenn es jedoch an der Zeit ist, den Desktop-Client und den Desktop-Server zu erstellen, können all diese Skripts nicht kompiliert werden, als wären diese Namespaces nicht vorhanden. Hier

ein Beispiel:

Assets/HoloToolkit/Input/Scripts/GestureManager.cs(139,17): error CS0246: The type or namespace name `GestureRecognizer' could not be found. Are you missing an assembly reference? 

GestureRecognizer ist in UnityEngine.VR.WSA.Input. Ich hätte gedacht, dass das Backend schlau genug wäre, NotSupported Exceptions zur Laufzeit auszulösen, wenn irgendeine Klasse in diesen Namespaces unter der Standalone-PC-Plattform aufgerufen würde (und ich schlau genug bin, nichts davon zu nennen, wenn role = desktop client oder Desktop-Server), aber es kompiliert einfach nicht, also bin ich wirklich fest. Kennt jemand eine Lösung dafür, ohne alles mit UNITY_WSA oder UNITY_STANDALONE Preprozessor-Flags neu zu schreiben, um überall sogar importierte Drittanbieter-Assets einzufügen?

Ich war auf Unity 5.4 Beta für Hololens und das war überhaupt kein Problem. Dann bin ich auf 5,6 gewandert und das wurde eins.

Antwort

1

Sie sollten dies bereits berücksichtigt haben, bevor Sie Ihre App erstellen. Einige APIs sind zwischen Windows-Standalone und Windows Store Build nicht verfügbar. Es ist sogar am schlimmsten, wenn Hololens beteiligt ist.

Ihr Beispiel dafür, warum eine Präprozessorlösung nicht akzeptabel ist, ist nicht gut. Präprozessordirektive ist der Weg, dies zu lösen. Sie müssen es nicht um den Ort wickeln, an dem class deklariert ist. Wickeln Sie es einfach um die Orte, an denen Sie den Namensraum importiert haben. Zum Beispiel

#if UNITY_WSA 
    using UnityEngine.VR.WSA; 
#endif 

Auch machen dies für Sie einfach, Sie sollten nicht Zugriff auf die API von dem UnityEngine.VR.WSA Namespace direkt aus anderen Klassen.

Erstellen Sie eine Wrapperklasse, die alle Eingaben aus dem Namespace UnityEngine.VR.WSA umschließt und dann #if UNITY_WSA innerhalb dieser Klasse verwendet. Auf diese Weise müssen Sie nur #if UNITY_WSA in einer Klasse anstelle aller Klassen verwenden, die auf eine API aus dem Namespace UnityEngine.VR.WSA verweisen.

Es ist einfacher zu verwalten. Um auf die Eingaben aus dem Namespace UnityEngine.VR.WSA zuzugreifen, verwenden Sie diesen Wrapper. Denken Sie daran, nur die benötigten APIs einzubinden.

+0

Vielen Dank für Ihre Antwort.Ich verstehe Ihren Vorschlag, alles unter einer einzigen Wrapper-Klasse zu sammeln, aber ich sollte es nicht mit dem HoloToolkit tun, wenn Sie mit Hololens oder etwas noch nicht hinzugefügtem vertraut sind. Ich habe diese Möglichkeit vermieden, aber vielleicht sollte das Projekt selbst in viele Teilprojekte aufgeteilt werden. Eine Plattform pro Teilprojekt und diese Frage wäre erledigt. In der Tat habe ich es bereits mit Unity HLAPI versucht; Assets aus verschiedenen Projekten sind schwer zu handhaben. Die HLAPI scheint mir für ein einzelnes Projekt bestimmt zu sein. Aber vielleicht mit Unity LLAPI ... – RCYR

+0

Sie können eine Plattform pro Teilprojekt machen, die noch schlimmer ist, weil Sie Ihren Code aussehen müssen. Wenn Sie einen Fehler in einem Projekt beheben, müssen Sie einen anderen Fehler in einem anderen Projekt beheben. Wie lange wird es dauern, bevor es nicht mehr handhabbar ist? Wenn Sie keinen Wrapper verwenden möchten, ist das in Ordnung. Verwenden Sie einfach "#if UNITY_WSA", wie oben in Funktionen, Import und Variablendeklaration erwähnt. Das sollte funktionieren. – Programmer