Du bist nicht angemeldet. [Anmelden]
Optionen
Thema bewerten
Unity3D + UserApps = <3 - #2858202 - 31.07.2017, 10:33:57
nic95
Forumuser

Registriert: 01.07.2016
Beiträge: 2
… mostly!

Wer auf dem Entwickler-Meeting letzten Montag dem 24.07. war (wiederholt sich jeden Montag!) der hat vielleicht geahnt was da bald kommen könnte.

Wir haben in der letzten Woche bei unserem internen Hackathon unter anderem daran gearbeitet eine UserApp zu bauen die wir größtenteils mit Unity3D umsetzen. Da die App aber trotzdem, wie alle Apps mit HTML-UI, im jeweiligen Browser des Clients laufen muss muss sie natürlich in eine kleine Webseite eingebettet sein. Daraus folgt natürlich, dass die Schnittstellen zwischen “dem was Unity ausspuckt” und der Knuddels-API geschaffen werden müssen, denn beide kennen sich natürlich nicht.

Unsere App mit der wir das realisiert haben ist Untergrund Hermann.

Die App basiert auf der Unity3D Spieleengine. Neben Windows, Linux und Mac kann Unity auch einen WebGL/asm.js Player erzeugen, der es erlaubt, das entwickelte Spiel auf einer Website einzubetten.

WebGL ist eine relativ neue Technologie, die es erlaubt, native Grafikbeschleuniger über eine JavaScript-Variante von OpenGL anzusprechen. asm.js erlaubt es, für native Umgebungen entwickelten Code - wie zum Beispiel C oder C# - in einer JavaScript Umgebung auszuführen.

Der Browser muss dann lediglich WebGL unterstützen, was heutzutage bei praktisch jedem Browser der Fall ist. - Da unser Standalone App leider noch eine ältere Technologie einsetzt und demnach WebGL fehlt, laufen dort keine Unity Spiele.

Ein generisches Unity Spiel als UserApp zu veröffentlichen, ist also weder besonders komplex noch aufwändig… in der Theorie jedenfalls.
Leider hat das UserApp System ein paar gemeine Sonderheiten. Zum Beispiel überschreiben wir URL, was Unity intern zum nachladen von Spielinhalten nutzt. Glücklicherweise können wir unsere eigenen JavaScript Dateien schnell anpassen. Der Übeltäter überschreibt nun zwar immernoch URL, stellt in window._URL aber das ursprüngliche Objekt bereit. Damit kann in der von Unity generierten HTML Seite ein kleines Schnippsel eingebunden werden, das _URL wieder zurück in URL kopiert.
Es muss also die Vorlage der von Unity generierten index.html angepasst werden. Unity bietet dafür benutzerdefinierte Templates. Damit kann das folgende Schnippsel leicht eingebunden werden, welches alle von Unity benötigten Funktionen des URL Objekts wiederherstellt. Stellt sicher, dass das Schnippsel eingebunden wird, bevor “UnityLoader.instantiate” aufgerufen wird.

Code:
<script>
	URL.createObjectURL = _URL.createObjectURL;
	URL.revokeObjectURL = _URL.revokeObjectURL;
</script>


Damit kann nun ein generisches Unity Spiel als UserApp veröffentlicht werden.
Wir wollten allerdings noch einen Schritt weiter gehen und auch die Vorteile unserer UserApps API (wie z.b. Serverkommunikation) verwenden. Das bedeutet also, dass wir zum einen aus Unity’s C# Code heraus JavaScript im Browser aufrufen und zum anderen aus dem Browser Daten zurück in den C# Code schicken müssen.
Auch dafür bietet Unity zum Glück schon eine Lösung. Die Dokumentation verschweigt leider einige wichtige Limitationen, der Interaktions-API - zum Beispiel, dass man ausschliesslich einzelne Strings und Zahlen als Methodenparameter übergeben kann. Um euch vor viel Trail-and-Error Zeit zu bewahren, hier unsere ‘KnuddelsApi.jslib’, die die JavaScript Schnittstelle für den C# Code definiert.

Code:
var KnuddelsApi = {
	Client_addEventListener: function (pType) {
		var type = Pointer_stringify(pType);
		console.log("Registered event handler for " + type);
		Client.addEventListener(type, function (payload) {
			console.log("(JS) Received server event " + JSON.stringify(payload));

			SendMessage("_Connector", "OnEvent", payload.data);
		});
	},

	Client_sendEvent: function (pData) {
		var jsonPayload = Pointer_stringify(pData);

		console.log("Sending event with payload " + jsonPayload);

		Client.sendEvent("onData", JSON.parse(jsonPayload));
	}
};

mergeInto(LibraryManager.library, KnuddelsApi);



Im C# Code können dann die Funktionen Client_addEventListener(string) und Client_sendEvent(string) importiert werden.
Da unser Demoprojekt nur die Event-API der UserApp nutzt, reichen uns diese beiden Funktionen. Möchte man auch noch Zugriff auf die HostFrame-API, usw., muss die jslib Datei natürlich angepasst werden.

Um Events vom Server zu empfangen, müssen Callbacks in Client.addEventListener registriert werden. Aus der oben genannten Parameterrestriktion ergibt sich allerdings ein Problem. Ein Callback ist weder ein String noch eine Zahl. Unser Workaround für dieses Problem sieht so aus:
Das Spiel hat ein eigenes Mapping von Eventtyp auf Callback. Der UserApp API wird in addEventListener dann ein generisches Callback übergeben, das mit ‘SendMessage’ immer eine Nachricht an das gleiche GameObject sendet. Als Parameter von SendMessage übergeben wir die empfangenen Daten als JSON-String. Da es für unsere Zwecke einfacher war, den Eventtyp direkt in den Inhalt des Events zu kodieren, registriert der C# Code nur einen einzigen Listener auf “onData”. Dieser parst dann die empfangenen JSON Daten und leitet die Daten an den entsprechenden C#-Eventhandler weiter. Damit kann das UserApp Backend also Events an den Client senden.
Für den umgekehrten Weg, gibt es Client_sendEvent. Diese Funktion erwartet als Parameter die als JSON kodierten Daten. Diese werden geparst und dann als JavaScript-Objekt an Client.sendEvent der UserApp API weitergegeben.

Damit sind praktisch alle technischen Grundlagen für Unity Spiele als UserApp erklärt.


Ich hab das ganze natürlich nicht alleine gemacht, sondern wir haben das ganze im Team umgesetzt. Credits gehen an:
  • juack (Entwicklung)
  • brems (Entwicklung)
  • Turmfalke (Entwicklung)
  • flatplate (Entwicklung)
  • digo84 (Entwicklung)
  • nic95 (Entwicklung)
  • TobyB (Kommunikation)


Falls ihr nun selbst Lust bekommen habt, das einmal auszuprobieren, traut euch! :)
Falls ihr Hilfe braucht oder Fragen habe, zögert nicht in diesem Thread zu schreiben.

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: nic95] - #2858324 - 01.08.2017, 00:17:59
SchnelleSchnalle
Forumuser

Registriert: 11.01.2016
Beiträge: 45
Huhu, Gratulation.
Ich nehme aber an das ihr es auch nicht hinbekommen habt es In der Java/Knuddels App zum laufen zu kriegen?
Oder kann die inzwischen webGL?

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: SchnelleSchnalle] - #2858331 - 01.08.2017, 02:26:48
Bizarrus
Nicht registriert


Diese Information kannst du oben entnehmen:
Zitat:
Da unser Standalone App leider noch eine ältere Technologie einsetzt und demnach WebGL fehlt, laufen dort keine Unity Spiele.

Das Zitierte gillt gleichzeitig für die Audio-API, die nicht unterstützt wird.

Ich denke mal, dass auch hier die Android-App funktionieren würde, habe aber Skepsis aufgrund der anfallenden Datenmengen. Das kann schon durchaus Problematisch bei mobiler Datennutzung geben; besonders, wenn man auf 3D setzt und X Models, Shaders & co verwendet werden. Gibt es da schon "Praxisbeispiele", gar Trafficbenchmarks?


Bearbeitet von Bizarrus (01.08.2017, 02:27:45)

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: nic95] - #2860738 - 15.08.2017, 15:48:36
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.605
Soweit ja ne schicke Idee und wirklich interessant welche möglichkeiten sich mit unity eröffnen würden. Allerdings muss ich sagen das es relativ wenig sinn macht eine userapp mit unity zu programmieren solang der großteil der user dann diese app nicht nutzen können wird. Und der aktuelle html chat ist praktisch tot und nicht zu gebrauchen.

Zitat:
Da unser Standalone App leider noch eine ältere Technologie einsetzt und demnach WebGL fehlt, laufen dort keine Unity Spiele.


Ist denn auf absehbare zeit damit zu rechnen das sich da was ändert und die standalone app dann auch webgl unterstützung bieten wird? Oder kann man sich gemütlich zurücklehnen und warten bis K3 fertig ist und dann hoffentlich webgl dort unterstützt wird?


Zitat:

Falls ihr nun selbst Lust bekommen habt, das einmal auszuprobieren, traut euch! :)

Done. Ne Testapp läuft soweit, auch wenn die noch nicht groß was tut.
Bleibt eben, wie erwähnt, nun zu warten wann die unterstützung bei der standalone app kommt.
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: Kev777] - #2889312 - 16.02.2018, 09:57:24
TobyB
​Knuddelsteam

Registriert: 21.11.2003
Beiträge: 6.841
Create VR on the Web using Unity3D

Wer will kann nun also mit WebVR in UserApps experimentieren, oder besser gesagt schauen ob das geht (ich habs nicht ausprobiert). Allerdings läuft das ganze vermutlich maximal im aktuellsten Firefox mit HTMLChat. Aber zum rumspielen sicher genug. :P
_________________________
There is no good without evil, but evil must not be allowed to flourish.
There is passion, yet peace; serenity, yet emotion; chaos, yet order.

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: TobyB] - #2889341 - 16.02.2018, 13:05:23
Bizarrus
Nicht registriert


Unity mag vielleicht ganz nett sein, aber ich denke, dass sich der Zeitaufwand nicht wirklich lohnen wird.

Im Applet fehlen halt die ganzen bindings, bzw. api und unter anderen Browser-Engines läuft es nur schleppend vorran. Wie schaut das mit der WebView von Android aus? IE nutzt zwar kaum jemand, aber auch hier wird es sicherlich Peobleme geben...

Die andere Frage wäre, wie aufgebläht das ganze als Build wäre - Je nach Resourcen möchte man ungerne XXX MB ziehen, wenn man die UI öffnet...


Bearbeitet von sweet-chica24 (17.02.2018, 10:07:43)
Bearbeitungsgrund: Valentins-Special, Smiley entfernt

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: ] - #2889342 - 16.02.2018, 13:31:43
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.605
Was mir fehlt ist schlicht und ergreifend ein ausschnitt aus der roadmap von knuddels wann sie denn in etwa geplant haben den jx browser in der standalone für alle einzusetzen. Und auch ob und wann K3 denn die entsprechenden techniken unterstützen wird.
Laut Entwickler AGB werden Entwickler vorab über geplante änderungen die die Userapps betreffen könnten u.s.w. informiert um eine gewisse Vorlaufzeit zu haben sich entsprechend einstellen zu können. Dazu wird in den AGB sogar verschwiegenheit vereinbart. Nur habe ich davon bisher nichts gemerkt das die appentwickler irgendwie da auch nur ansatzweise informiert werden. Viel mehr habe ich leider den Eindruck das knuddels bei der entwickung diverser dinge wie u.a. auch K3 die userapps völlig ausblendet.

Für mich ist es aktuell sinnfrei mich intensiver mit unity zu beschäftigen mit der aussicht zu einem völlig unbestimmten zeitpunkt vielleicht irgendwann mit unity für knuddels irgendwas entwickeln zu können.

Mit VR brauchen wir hier gar nicht erst anfangen. Jede wette dass man die User in Knuddels die ein VR setting daheim haben an einer hand abzählen kann.
Ganz davon ab das VR Zeug in knuddels nur sinn macht wenn knuddels selbst VR an diversen stellen berücksichtigen würde. Wenn der user ggf. in einer VR app in knuddels ist dann will er sicherlich dennoch nicht völlig abgeschnitten vom restlichen chat sein. Das würde bedeuten das Knuddels m, p und was weiß ich was alles irgendwie schicki in die VR situation des users einblenden müßte oder zumindest über die userapi ermöglichen müsste das die api auf sowas für den user reagieren könnte (thema rechtemanagment für userapps) und dem user das dann entsprechend aufbereitet zukommen lassen könnte.
Davon sind wir gefühlte Jahrzehnte entfernt würde ich mal sagen.
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: Kev777] - #2889350 - 16.02.2018, 15:03:22
TobyB
​Knuddelsteam

Registriert: 21.11.2003
Beiträge: 6.841
Leute, ich hab nicht ohne Grund Worte wie "experimentieren" und "rumspielen" benutzt ...

Das war auch zur Eröffnung des Threads schon unter anderem als solches gedacht. Allerdings ist es für die Zukunft durchaus möglich, dass es brauchbare Unity3D (User)Apps bei Knuddels geben kann. Wir haben das Thema jxBrowser weiterhin auf dem Plan. Allerdings muss so was auch gescheit integriert werden und robust funktionieren. Das wollen wir am Ende des Tages alle, denn nur dann kann es eine verlässliche Platform sein. :)
_________________________
There is no good without evil, but evil must not be allowed to flourish.
There is passion, yet peace; serenity, yet emotion; chaos, yet order.

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: TobyB] - #2898798 - 25.04.2018, 09:34:33
martin070476

Registriert: 05.08.2013
Beiträge: 574
Unity3d-Projekte sollten jetzt durch die Einführung des neuen JX-Browsers in der PC-App jetzt auch für einen Großteil der Nutzer verfügbar sein. :-)

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: martin070476] - #2898841 - 25.04.2018, 15:29:37
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.605
Da hab ich aktuell irgendwie noch ein problem in der standalone ein entsprechendes projekt zum laufen zu bekommen. Nach dem splashscreen von unity passiert in der standalone einfach nix weiter, im html chat läuft sie.

Die referenzapp vom knuddelsteam ist leider nicht mehr vorhanden ebenso wie der entsprechende mychannel, um mal zu schauen ob es denn grundsätzlich funktioniert in der standalone.

Jemand ne idee wie man am besten mögliche fehler der userapp in der standalone erkennen kann? Laden die fehler mit in der log datei der standalone oder wo spuckt der chromium ggf. fehler aus?
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: Kev777] - #2898858 - 25.04.2018, 16:26:03
TobyB
​Knuddelsteam

Registriert: 21.11.2003
Beiträge: 6.841
Du kannst mit der PC-App auf dem Dev-Server den Focus auf deine HTML-UI setzen und dann CTRL+SHIFT+I drücken um (analog zu den Browsern) die DevTools des jxBrowsers zu öffnen. Damit kannst du dann bestimmt mehr herausfinden. Das sind die Chrome-DevTools (von Chrome 49) und entsprechend mächtig und hochwertig.
_________________________
There is no good without evil, but evil must not be allowed to flourish.
There is passion, yet peace; serenity, yet emotion; chaos, yet order.

[zum Seitenanfang]  
Re: Unity3D + UserApps = <3 [Re: TobyB] - #2898866 - 25.04.2018, 16:46:04
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.605
Antwort auf: TobyB
Du kannst mit der PC-App auf dem Dev-Server den Focus auf deine HTML-UI setzen und dann CTRL+SHIFT+I drücken um (analog zu den Browsern) die DevTools des jxBrowsers zu öffnen. Damit kannst du dann bestimmt mehr herausfinden. Das sind die Chrome-DevTools (von Chrome 49) und entsprechend mächtig und hochwertig.

uhi, wunderbärchen :E)
Dankö
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  


Moderator(en):  Misterious