Levels von einem Server laden

  • Ich fange gleich mal mit einem Bild an:

    So, und nun mal schauen, wer hier noch weiter liest ^^


    A) Als erstes stellt sich mir die Frage, ob es grundsätzlich möglich ist, Levels auszulagern, um diese nachher während der Laufzeit der Applikation von einem (Web-)Server zu laden. Und damit ich das hier kurz erwähnt habe: nein, es geht hier nicht um das "Level Streaming Volume".


    B) Es wäre wünschenswert, dass alle weiteren Levels mit Ausnahme des Login-Levels (siehe Grafik) ausgelagert wären.


    Die Idee dahinter ist natürlich, möglichst alles auslagern zu können, um immer aktuelle Inhalte zu liefern.


    Hat da jemand Erfahrung damit und könnte dabei helfen? Server wäre vorhanden.

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

    • Offizieller Beitrag

    Finde dein Gedanken Gang etwas umständlich aber korrigiere mich wenn ich falsch liege:


    1.Du kannst ein Level auf einem Server starten. Wird das Spiel gestartet, wird die Version des levels mit der Version auf dem Server abgeglichen. Gibt es eine neue Version = Download wenn nicht das gehts weiter.

    2. Zur Laufzeit das Level Upzudaten ist gefährlich. Du kannst ja nicht dem Spieler den Boden unter den fuss wegziehen oder ihn zur Laufzeit einmauern.


    Was du tun könntest:


    Nachdem zb eine Runde vorbei ist, prüfst du ob es eine neue Version gibt. Wenn, wird das Level beendet und das neue Level geladen und alle Joinen im neuen geladenen Level.

    Eventuell wäre es sogar besser das Spiel neu zu starten.

    Aber ein Hinweis das es eine neue Level Version gibt, wäre definitv und ohne Probleme möglich.

  • Danke für Deine ausführliche Antwort. Ich glaube, mein Problem liegt schon weit bevor ich überhaupt jemanden zumauern könnte ? Der Gedanke gefällt mir allerdings ?


    1.Du kannst ein Level auf einem Server starten. Wird das Spiel gestartet, wird die Version des levels mit der Version auf dem Server abgeglichen. Gibt es eine neue Version = Download wenn nicht das gehts weiter.

    Das heisst dann wohl, dass ich mit meiner Idee/meinem Wunsch nicht allzu falsch liege und dass sowas möglich ist. Die Frage ist jetzt: wie? Sprich: wie kann ich ein Level auslagern auf einen Server?


    Mein bisheriger Kenntnisstand ist, dass ich zwar einen Server haben kann, der mir Spielstände oder Positionsdaten bei einem MultiplayerGame speichert. Ob und wie ich ein komplettes Level-File auf einen Server auslagern kann, weiss ich noch nicht… Genau da bräuchte ich Hilfe…

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

  • Ich bin neugierig.


    du beschreibst hier ziemlich genau einen Launcher, den du zb bei Steam oder Epic Store zur Verfügung hast, mit dem Unterschied, dass du es zur Laufzeit vom Spiel haben willst.


    Hier die Frage: Warum?

    Je nach Anwendungsfall bietet sich eine andere Lösung an.

  • Danke, Veelos, für Deine Antwort und umso mehr für Deine Fragen. Ich hab das Problem, dass die Applikation in einer Arbeitsumgebung geladen werden muss, in der ein Download nicht allzu gross sein darf (sprich nicht mehrere GB, sondern lieber ein paar MB auf einmal). Dazu kommt, dass ich nicht erwarten kann, dass oft Updates gemacht werden.


    Das heisst, ich darf auf keinen Fall auf eine komplette Applikation setzen, sondern muss Inhalte (Levels) je nach Bedarf liefern können. Es sei hier noch erwähnt, dass es sich nicht um ein Spiel handeln wird. Jede Person, die die Applikation nutzt, benötigt individuell andere Inhalte.


    Ein weiterer Punkt ist, dass sich sehr vieles in UIs abspielen wird und nicht in der 3D-Umgebung. Diese Applikationshälfte soll in die Game-Client-Applikation eingebettet werden. Die Daten werden aus einer DB gezogen. Ich gehe davon aus, dass dieser Teil datentechnisch eher "leicht" sein wird.


    Ich könnte jetzt abschweifen und das gesamte Projekt erklären, es geht mir aber erstmal um einen Prototypen, der diese Level-Lade-Funktionalität aufweist.


    Die Frage ist echt, hat das jemand schon mal gemacht oder geht das gar nicht?

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

  • Mir ist bisher nichts bekannt wie man komplette Levels zur Laufzeit austauschen könnte. (Vielleicht kann dir jemand anders hier helfen)

    Allerdings brauchst du das unter Umständen auch gar nicht.

    Wenn du kein Individuelles Terrain pro Level hast sondern nur Actors / Meshes etc könntest du alle Transforms und ActorKlassen in deiner Datenbank speichern. Wird ein Level geladen ziehst du dir die Daten aus der DB vom Server und Spawnst dann alles auf der Clientseite ins Level.

    Selbiges gilt für UI.

    Wenn allerdings neue Objekte (komplett neue) bei deinem "nicht Spiel" hinzu kommen wirst du um ein Update wohl ned herum kommen. (man könnte wohl einen Modellloader bauen der das auch regelt)


    Je nach grösse des Levels sollte das auch vom Download her besser klappen als wenn du komplette Level Datein überträgst.

    • Offizieller Beitrag

    Sprich: wie kann ich ein Level auslagern auf einen Server?

    Nochmal du lagerst ein Level nicht auf einem Server aus, sondern holst wenn dann das Level vom Server. (Umgekehrt)


    Fürs Verständnis: Alle anderen Mitspieler müssen das (neue) level ja auch bekommen. Also müssen alle Clints das Level runterladen und nicht ein Clint hochladen.

    Das heisst, ich darf auf keinen Fall auf eine komplette Applikation setzen, sondern muss Inhalte (Levels) je nach Bedarf liefern können. Es sei hier noch erwähnt, dass es sich nicht um ein Spiel handeln wird. Jede Person, die die Applikation nutzt, benötigt individuell andere Inhalte.

    In dem Fall solltest du mal ganz genau beschreiben was du vor hast. Mit halbwissen ist es natürlich schwer dir Tipps zu geben.

  • Ich spreche aus der Sicht des Entwicklers: dieser speichert das Level in meiner bescheidenen Vorstellung auf den Server. Die Clients laden das Level bei Bedarf vom Server herunter. Die Frage ist nun 2x: wie stelle ich das an.


    Ich beschreibe nochmals den Prototypen:


    Aus Client-Sicht: Ich habe eine Applikation, die nur das nötigste enthält, sprich ein UI. Loggt man sich ein, so kann man über Buttons diverse Levels vom Server laden. Die Links zu den Levels sollen dynamisch aus einer DB kommen, genauso wie die Buttons dynamisch erstellt werden.


    Aus Entwickler-Sicht: Wünschenswert wäre, dass ich einzelne Levels auf den Server exportieren könnte, eine URL dazu in der DB hinterlege, und diese URL nachher im UI in Form eines Buttons anzeigen könnte.


    Ich weiss einfach nicht, ob ich komplett auf dem Holzweg bin…

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

  • Immer noch die selbe Frage:

    Wie sehen deine Levels aus, was ist alles drin, haben Levels einen gemeinsamen Nenner (zb Skybox).

    Davon abhängig entscheidet sich dein Vorgehen.


    Also wie genau sehen deine Levels aus?

    Eine komplette Level datei einfach hoch zu laden und wieder runter zu ziehen wird wohl nicht funktionieren.

  • Kommt Pixel Streaming infrage?

    Kein clientseitiger Download nötig und volle Qualität.


    Mehr dazu in der offiziellen UE4 Doc.


    Wenn Du an Deinem Vorhaben festhalten möchtest, sollte das kein Problem sein.

    Die Level müssten nur cooked vorliegen und anschließend vom Client wieder heruntergeladen werden.

    Einige Punkte müssten aber vermutlich beim packagen beachtet werden.


    Grüße

  • Wie sehen deine Levels aus, was ist alles drin, haben Levels einen gemeinsamen Nenner (zb Skybox).

    Davon abhängig entscheidet sich dein Vorgehen.

    Veelos: Nein, ausser gemeinsamen Datenschnittstellen, die aber nicht Level-übergreiffend "kommunizieren" sollen. Eigentlich nur DB zu Level und umgekehrt.


    Meine Levels bestehen aus jeweils komplett neuen Räumen oder Outdoor-Szenarien. Nicht grad openWorld, aber teilweise werden sie ziemlich gross werden.


    Bob: Danke, davon wusste ich noch nichts. Klingt spannend. Nach Durchsicht aller Doc-Seiten zum Thema Pixel Streaming kommt es aber nicht in Frage, weil:


    • Hardware-Anforderungen serverseitig sind hoch (sprich teuer)
    • läuft nur auf Windows-Servers
    • am meisten irritiert mich aber diese Zeile: "Get up and running streaming an Unreal Engine application from one computer to other computers and mobile devices on the same network."
    • und dann noch diese: By default, all connected devices share control over the Unreal Engine application, forwarding all keyboard, mouse, and touchscreen inputs.
    • und schlussendlich diese: Or, you may prefer to have each connecting client stream content from a separate instance of the Unreal Engine, or through a separate player page that offers different controls.

    Kommt also wirklich nicht in Frage…


    Wer die Seiten selbst mal anschauen will:

    https://docs.unrealengine.com/…PixelStreaming/index.html


    Ach... es kann doch nicht sein, dass ich hier eine ziemlich banale Vorstellung hab, die noch keiner so umgesetzt hat.

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

  • Ich bin nicht sicher ob:

    Ich möchte einen Leveleditor über den ich Levels zur Laufzeit hoch und runter laden kann wirklich unter "banal" fällt;)


    Sicher das "Unreal" die richtige Anwendung für diesen UseCase ist? Da du ja eigentlich alles austauschst bis auf etwas Client Logik, könntest du ja zum Beispiel auf eine Weblösung mit WebGl setzen. Hier wärs ziemlich einfach eigene Modelle und Levels hoch zu laden & Echtzeit upzudaten.


    Wenn wir schon bei Web sind:

    Unreal verfügt über einen HTML5 Compiler (hab ich mal versucht, sieht gar ned soo schlecht aus). Eigentlich müsste es darüber möglich sein mehrere Levels / in diesem Fall Spielversionen mit Unreal zu kompilieren und Per URL dann zu switchen.

    Das UI machst du dann übergeordnet im Web.


    Wenn du jetzt aber sagst:

    Ich möchte gerne hochauflösende Modelle mit komplizierten Shadern + Photorealistische texturen die dynamisch auf den Client geladen werden trotz Bambusleitung könnte das etwas schwieriger werden.

    (Jedenfalls fällt mir hier nichts dazu ein)


    Dazu müsste ich recht genau wissen was genau du vor hast.

  • Ich möchte einen Leveleditor über den ich Levels zur Laufzeit hoch und runter laden kann wirklich unter "banal" fällt ;)

    Ich weiss nicht ob ich Chinesisch schreibe… Nein, ich will ein ganz normales "Spiel", in welches zu Laufzeit Levels hinzugeladen werden können. Ich will keinen Editor bauen! Vielleicht stehen wir alle einfach gerade auf dem Schlauch…


    Und nein, ich kann/darf leider nicht genauer darüber Auskunft geben, was das Endprodukt sein wird.

    Beheimatet in: Cinema 4D, Blender, Maxwell Render, Photoshop, Illustrator, Substance, Cura und mittlerweile auch in UE4.


    Working on the next big thing ??

  • Wenn Du an Deinem Vorhaben festhalten möchtest, sollte das kein Problem sein.

    Die Level müssten nur cooked vorliegen und anschließend vom Client wieder heruntergeladen werden.

    Einige Punkte müssten aber vermutlich beim packagen beachtet werden.

    Siehe oben. Vermutlich durch den Edit untergegangen.


    Hast Du das bisher versucht?

  • Leute, des was er will ist das System von Neverwinternights Online. Da prüft der Client auch, ob geänderte Leveldaten vorhanden sind und läd immer den aktuellsten Level vom Spiel runter.


    Eigentlich musst du nur schauen, ob du die Bestandteile deines Levels statt einer lokalen Speicheradresse auch mit einer Referenz auf einem Server hinterlegen kannst.


    Wenn das geht, muss du dann eine Routine an deinen Button anknüpfen, der prüft, ob du das angeklickte Level schon rutnergeladen hast und ob es Updates gibt, also zweistufig. Entweder er läd erst das ganze Level an einen lokalen Speicherort oder er ändert nur die Dinge, die sich durch ein Update geändert haben.


    Letztlich willst du einen Download und einen Patcher der @Runtime funktioniert.


    Denke mal, dass das geht, aber sicher nur mit C++.