
EdenSpark Update 1.0
Multiplayer – gemeinsam über das Netzwerk spielen
EdenSpark-Spiele können nun gemeinsam gespielt werden. Ein Spiel läuft als Server, zu dem sich Clients verbinden, und der Zustand der Spielwelt wird automatisch zwischen ihnen übertragen: Man schreibt das Spiel einmal, legt fest, was die Spieler gemeinsam nutzen, und die Engine sorgt dafür, dass die Kopien aller Spieler synchron bleiben.
Lobby- und Netzwerkdienste sind integriert und können mithilfe der Netzwerk-API von Eden in das Spiel eingebunden werden. Ein Spieler öffnet die Lobby aus dem Spiel heraus, meldet sich an, erstellt eine Lobby und lädt Freunde ein; wer sie erstellt hat, hostet das Spiel in seinem eigenen Prozess. Wenn man einer Einladung folgt, startet das Spiel bereits mit einer aktiven Verbindung.
Das Markieren der gemeinsamen Elemente der Spieler erfolgt durch eine einzige Annotation. Eine für ein Einzelspieler-Spiel geschriebene Komponente funktioniert weiterhin: Füge [replicated] hinzu, und die Serverkopie dieser Komponente erscheint auf jedem Client, zusammen mit dem Knoten, auf dem sie sich befindet – ihrer Position, ihrem übergeordneten Knoten, ihrem Namen, ihrem Mesh und ihrer Kollision.
[replicated]
class Health : Component {
hp : float = 100.0
def override on_update {
if (hasRemoteAuthority) { // someone else's copy: show it, decide nothing
updateHealthBarUI()
return
}
hp = min(hp + 5.0 * get_delta_time(), 100.0)
}
}Die Engine übernimmt den Teil, der schwer richtig hinzubekommen ist. Ein sich bewegendes Objekt wird mit einer kurzen Verzögerung gegenüber dem Server angezeigt und interpoliert zwischen den empfangenen Aktualisierungen, sodass die Bewegung bei einer stabilen Verbindung flüssig bleibt und nicht im Rhythmus der eintreffenden Pakete ruckelt. Ein Physikobjekt wird von seiner eigenen Physik dorthin getragen, wo es sich laut Server befindet, sodass es unterwegs mit der Spielwelt kollidiert, anstatt durch sie hindurchzugleiten. Das Spiel legt fest, wer welches Objekt sehen darf und wer es steuert, und die Engine sendet nichts an einen Spieler, der davon nichts wissen soll.
Für den eigenen Charakter eines Spielers, bei dem jede Verzögerung direkt spürbar ist, kann ein Spiel die lokale Simulation sofort ausführen und den Server diese anschließend bestätigen lassen, wobei nur dort Korrekturen vorgenommen werden, wo die beiden Ergebnisse voneinander abweichen.
Zwei Projekte als Ausgangspunkt: samples/new/net_cubes zeigt den gesamten Aufbau in seiner kleinsten Form, und samples/new/net_ships ist eine spielbare Arena, in der sich mehrere Spieler unter realen Latenzbedingungen gegenseitig herumschubsen.
Der Multiplayer-Modus ist neu und wird aktiv weiterentwickelt – es ist zu erwarten, dass er in den kommenden Updates weiter ausgebaut wird.
Offscreen-Emission in der GI
Emissionen sind nun für die Offscreen-GI-Berechnung sichtbar, was bedeutet, dass emittierende Oberflächen deine Szene beleuchten können, auch wenn du sie nicht im Blick hast. Dies verstärkt zudem den Beitrag der Emission zur GI erheblich, sodass solche Objekte als Flächenlichter fungieren können.


Statische Lichter
Lichter verfügen nun, genau wie Meshes, über die Eigenschaft isStatic, die standardmäßig deaktiviert ist.
Derzeit besteht deren einzige Auswirkung darin, dass nicht-statische Lichter im HD-Renderer nicht zur Offscreen-GI beitragen.
Zuvor waren alle Lichter für die GI sichtbar, und ihre Bewegung führte zu einer ständigen Aktualisierung mit sichtbarem „kochendem“ Rauschen. Auch wenn wir die Aktualisierungen der Beleuchtung in der GI erheblich beschleunigt und geglättet haben, war dies auf situative Szenenwechsel während des Spiels oder beim Erstellen deiner Spielszene ausgerichtet.
Mit der Einführung der Offscreen-Emission, die auf dem Caching der Primärbeleuchtung basiert, weist die GI nun eine zusätzliche Verzögerung beim Verschieben von Lichtern auf.
Daher haben wir beschlossen, dynamische Lichter auszugliedern, die beim Verschieben keine zusätzlichen Kosten oder Störungen verursachen. Beachte, dass sie für Screen-Space-GI-Traces weiterhin sichtbar sind.
Außerdem haben wir das Kontrollkästchen des meshStatic-Knotens im Editor in nodeStatic umbenannt, ebenso wie einige damit verbundene Funktionen, da der Status nun auch Lichter berücksichtigt.
UI-Canvases im Kamera-Viewport und im World Space
Ein UI-Canvas ist nicht mehr auf den gesamten Bildschirm beschränkt. Er kann nun innerhalb des Viewports einer einzelnen Kamera platziert werden – beispielsweise als HUD eines einzelnen Spielers im Split-Screen-Modus oder als Interface in einer Bild-in-Bild-Ansicht – oder als Fläche in der 3D-Szene erscheinen, die man aus jedem Winkel betrachten und anklicken kann.
Ein Canvas in der Szene wird von den dafür ausgewählten Kameras gerendert und ist über diese anklickbar – genauso wie Meshes ihre Kameras auswählen.
Editor-Eingaben, Diagnose und Zuverlässigkeit
Der Editor vereint Eingabekonfiguration, Diagnose und Projekt-Feedback in einem übersichtlicheren Arbeitsablauf. Das Benutzermenü zeigt die während der Entwicklung benötigten Steuerelemente und Fehlerdetails an.
Eingabeaktionen: Unterstützung für analoge Eingaben, Zeiger und Mausbewegungen
Eingabeaktionen verhalten sich nun einheitlich über Tasten, Trigger, Achsen, Joysticks und Zeigereingaben hinweg. Die gleichen Abfragen für „gedrückt“ und „gerade gedrückt“ können für digitale und analoge Steuerelemente verwendet werden, wodurch sich aktionsbasierte Eingaben leichter auf verschiedene Steuerungsschemata übertragen lassen. Bei Tastenaktionen kann zudem festgelegt werden, ob zusätzliche Tastaturmodifikatoren akzeptiert werden.
Scene Tree Selection und Suche
Die Scene Tree Selection folgt nun dem üblichen Verhalten bei Mehrfachauswahl. Dadurch wird die bearbeitungsbasierte Bearbeitung vorhersehbarer, wenn mehrere Nodes ausgewählt sind.
📐API-Änderungen
miscellaneous.md
- Die Eigenschaft fontScaling wurde aus den Komponenten UIText und Text3D entfernt, da sie für die von uns nun verwendete vektorbasierte Schriftdarstellung irrelevant ist.
Static lights
- set_mesh_static_recursive und get_mesh_static_status wurden in set_node_static_recursive bzw. get_node_static_status umbenannt. Die alten Funktionen bleiben als veraltete Aliase aus Kompatibilitätsgründen mit bestehendem Code erhalten.
✨ Hinzugefügt
- Ein Canvas kann an eine Kamera angehängt werden und folgt dann dem Ansichtsbereich dieser Kamera: Er wird darin angeordnet, gezeichnet und kann dort angeklickt werden. Ohne Kamera bedeckt er wie bisher den gesamten Bildschirm.
- Ein Canvas kann im Weltraum platziert und nur in den von Ihnen ausgewählten Kameras angezeigt werden.
- Die Auflösung, auf die ein Canvas skaliert wird, kann nun explizit festgelegt werden, anstatt aus der Größe übernommen zu werden, die der Canvas zufällig im ersten Frame hatte.
- Der Massenschwerpunkt und der Trägheitstensor werden bei einer Formänderung nicht mehr automatisch zurückgesetzt.
- Dem CharacterController kann nun eine Masse zugewiesen werden.
- Die Eigenschaften RigidBody.inertia und RigidBody.inertiaRotation sind nun beschreibbar.
- Über das Netzwerk spielen – ein Prozess führt das Spiel als Server aus, andere treten als Clients bei; ein gehostetes Match läuft innerhalb des eigenen Spiels eines Spielers, ohne dass ein separater Server bereitgestellt werden muss
- Lobby und Einladungen – öffne die Lobby aus dem Spiel heraus, melde dich an, erstelle einen Raum oder trete einem bei und lade Freunde ein; wenn du einer Einladung folgst, startet das Spiel direkt im Match
- [replicated]-Komponenten – Markiere eine Komponente, und die Kopie des Servers erscheint auf jedem Client, wobei die Transformation, der übergeordnete Knoten, der Name und die Engine-Komponenten des Knotens mitübertragen werden
- Flüssige Bewegung bei einer echten Verbindung – Remote-Objekte werden leicht hinter dem Server angezeigt und zwischen den Aktualisierungen interpoliert; Remote-Physikobjekte werden von der Physik weiterverarbeitet, sodass sie weiterhin kollidieren
- Vorhersage für den eigenen Charakter des Spielers – sofortige lokale Simulation und Abgleich mit der Antwort des Servers, sodass die Steuerung auch bei Latenz reaktionsschnell bleibt
- Sichtbarkeit und Eigentumsrechte – das Spiel entscheidet für jeden Spieler, welche Objekte überhaupt gesendet werden und welcher Spieler welches Objekt steuert
- Nachrichten zwischen Peers – Sende eine Nachricht an die Gegenseite und verarbeite sie dort, wo sie ankommt, mit der für die jeweilige Nachrichtenart erforderlichen Zustellgarantie
- Zwei Beispielprojekte – net_cubes für die minimale Konfiguration und net_ships für eine spielbare Multiplayer-Arena
- Unterstützung für Offscreen-Emission bei der globalen Beleuchtung.
- Die Eigenschaft isStatic für die Komponenten PointLight und SpotLight. Sie ist im Editor ausgeblendet und wird über das Kontrollkästchen nodeStatic des Knotens gesteuert.
- Die Konfiguration der Mausbewegungsachsen, der Empfindlichkeit und der Inversion erfolgt über die Eingabeeinstellungen im Benutzermenü.
- Die vollständige Liste der Kompilierungs- und Laufzeitfehler kann über das Benutzermenü mit Strg+C oder über das Kontextmenü des Fehlerfensters kopiert werden.
- is_action_pressed, is_action_just_pressed und is_action_just_released unterstützen nun Aktionen für Tasten, Trigger, Achsen, Joysticks und Delta-Zeiger.
- Für is_action_pressed, is_action_just_pressed, is_action_just_released und is_action_state_active steht ein optionales ModifierMatchMode-Argument zur Verfügung. Bestehende Aufrufe mit einem Argument bleiben gültig; ModifierMatchMode.Strong erfordert genau die konfigurierten Modifikatoren (Standardwert), während ModifierMatchMode.Weak das Halten zusätzlicher Modifikatoren zulässt.
- Mausbewegungen können als horizontale oder vertikale Aktionsachse hinzugefügt werden, mit konfigurierbarer Empfindlichkeit und Inversion.
- Zeigeraktionen unterstützen separate X- und Y-Inversionseinstellungen (nur im Delta-Modus).
- Mehrfachauswahl von Szenenknoten mithilfe der Standard-Auswahlfunktionen des Editors, einschließlich Bereichsauswahl.
🔧Verbessert
- Der Warnhinweis wird auf dunklen Editorhintergründen in einer besser lesbaren bernsteinfarbenen Schrift angezeigt.
- Die Registerkarte „Eingabe“ im Benutzermenü zeigt nun bei angehaltenem Spiel, während der Initialisierung des Eingabesystems oder wenn keine Aktionssätze definiert sind, eindeutige, zentrierte Zustände an.
- Erweiterte Eingabeeinstellungen und die Protokollpufferung sind für eigenständige Projekte, die nicht im Entwicklermodus ausgeführt werden, ausgeblendet oder deaktiviert.
- Aktionen, die bereits gedrückt wurden, bevor ihr Aktionssatz aktiviert wurde, melden keinen gedrückten Zustand mehr. Sie werden erst wieder gültig, nachdem sie in ihren neutralen Zustand zurückgekehrt sind und erneut gedrückt wurden.
- is_action_state_active meldet Aktivität im Release-Frame, während is_action_pressed nur den aktuellen Wert ungleich Null meldet. Bei Schaltflächenaktionen berücksichtigen beide Abfragen die Übereinstimmung mit starken oder schwachen Modifikatoren.
- Beim Einfügen von Knoten als untergeordnete oder gleichrangige Elemente wird nun der zuletzt ausgewählte Knoten als Ziel verwendet, anstatt des ersten Knotens in der Auswahl.
🐛 Fixed
- In den Einstellungen für externe Editoren werden die Platzhalter {file} und {editor} durch Pfade in Anführungszeichen ersetzt, sodass eine manuelle Angabe in Anführungszeichen nicht mehr erforderlich ist
- Verschiedene Fehler im Zusammenhang mit dem Flag autoResizeFrame in den Komponenten UIText und Text3D wurden behoben: Es ist nun nicht mehr von fontScaling abhängig, berücksichtigt nun margin und es gibt keine Rückkopplungsschleife mehr, die den Rahmen bei einer Änderung der Schriftgröße irreversibel verkleinerte.
- Die Eigenschaft margin der Komponenten UIText und Text3D wurde korrigiert: Der Text wird um genau die von Ihnen festgelegte Anzahl an Einheiten eingerückt, alle vier Werte verschieben den Text nach innen und berücksichtigen nun die Textausrichtung.
- Die falsche Positionierung von UIImage im Multi-Kamera-Fall mit dem Rendering-Modus ScreenSpaceOverlay für die Leinwand wurde behoben.
- Klicks auf eine gedrehte oder geneigte Leinwand in der Szene landen nun an der Stelle, an der die Leinwand gezeichnet wird.
- In einem geteilten Bildschirm wird eine Leinwand nicht mehr durch eine Kamera angeklickt, die sie nicht anzeigt, und eine Leinwand, die zu einer Kamera gehört, ignoriert die Maus außerhalb des Bildschirmbereichs dieser Kamera.
- Die Komprimierung des Konsolenprotokolls führt nicht mehr zu fehlerhaften Stapelpositionen oder Abstürzen, wenn übersprungene Einträge kopiert oder angezeigt werden.

