Nicht eingeloggt
Registrieren

Volume Tutorial

Volumes - Tutorial zu den Volumina - Teil I

Dieses Tutorial besteht aus drei Teilen. Im ersten Teil wird erklärt, wie man ein Volumen erstellt. Der zweite Teil ist den allgemeinen Eigenschaften der beiden Oberklassen Volume und PhysicsVolume gewidmet. Im dritten Teil schließlich werden spezielle Eigenschaften der Volumina besprochen, und zwar geordnet nach der Wirkung, die man damit erzielen möchte.

So kann man als fortgeschrittener Leser gleich den dritten Teil ansteuern, das nachfolgende Inhaltsverzeichnis aber auch als Link-Sammlung zu den einzelnen Themen benutzen.

Achtung: Einige der Volumes die in diesem Tutorial erklärt und beschrieben werden, stehen erst ab dem UnrealED 3.0 zur Verfügung!
Inhalt:
  1. Volumina: allgemeine Charakteristik
    • Ein Volumen erstellen
    • Weitere Eigenschaften von Volumina
  2. Die Einstellungen der PhysicsVolume
    • Einträge der Mutterklasse Volume
    • Einträge der Klasse PhysicsVolume
    • Bedeutung spezieller Einträge
      • Rutschfestigkeit
      • Schadenswirkung
      • Einfluß auf Bewegung
        1. Gravity
        2. ZoneVelocity
        3. TerminalVelocity
      • Nebel
      • Flüssigkeit
        1. Unterschiede der Flüssigkeiten
        2. Ereignisse beim Betreten/Verlassen des Volumen
  3. Unterklassen des PhysicsVolume
    • Die Unterklassen WaterVolume, SlimeVolume und LavaVolume
    • Die Unterklasse VacuumVolume
    • Die Unterklasse PressureVolume
    • Die Unterklasse LadderVolume
    • Die Unterklasse BlockingVolume
    • Die unabhängige Klasse Antiportal
      • Allgemeine Charakteristik
      • Funktionsweise des AntiPortals
      • Beispiel für die Verwendung
1 - Volumes - allgemeine Charakteristik

Sogenannte Volumina (engl. Volumes) ersetzen in der modernen Unreal Engine teilweise die bekannten Zonen (Zones), welche nur noch für die generelle Karteneinteilung und zur Optimierung der Performance sinnvoll sind. Volumina sind unsichtbare Bauformen (Brushes), die registrieren, ob sich eine Spielfigur darin befindet, das Volumen betritt oder verläßt. Innerhalb eines Volumen kann man verschiedene physikalische Eigenschaften definieren. Ein Volumen wird auch benutzt, um ein Echo zu erzeugen, um ein Umgebungslicht zu setzen, eine SkyZone oder eine WarpZone zu erstellen. Ebenso ermöglicht ein Volumen den Geländenebel (TerrainFog) und viele andere Sachen. Nur wenn sich der Spieler innerhalb des Volumen befindet, werden dessen Eigenschaften auf ihn angewendet. Die Volumina sind völlig unabhängig von den bekannten Zonen. So ist es jetzt möglich innerhalb einer erstellten Zone mehrere Unter-Eigenschaften festzulegen. Wasser, Lava, Säure und Luftstrudel oder "fester Boden" werden in der Luft-Zone als Volumina erstellt.

Da die Volumina im eigentlichen Spiel nicht sichtbar sind, muss man sie teilweise in Kombination mit anderen Aktoren (Actors) nutzen. So erfordert ein WaterVolume eine zusätzliche sichtbare Wasseroberfläche und das LadderVolume eine sichtbare Leiter.


1.1 - Ein Volumen erstellen

Ein Volumen sieht aus wie eine gewöhnliche Bauform. Seine Außenlinien sind in einem hellen Rosa gehalten. Auf dem Bild ist die rechte Baufom das gesetzte Volumen, links daneben befindet sich der RedBuilderBrush, den wir nach dem Setzen zur Seite gezogen haben. In diesem Zustand kann das Volumen jederzeit an einen anderen Ort geschoben werden. Man kann das Volumen auch weiterbearbeiten, indem man es verzieht oder gar mit dem Clipping-Tool bearbeitet. Ein Volumen zu erstellen ist nicht schwer, denn es kann jede beliebige Bauform als Volumen gesetzt werden, man muß nur

die "Add Volume"-Schaltfläche anklicken!



Es erscheint ein Menü, aus dem man das gewünschte Volumen mit vordefinierten Eigenschaften auswählen kann.
  • BlockingVolume - Blockieren eines Spielers (z.Bsp. unsichtbare Wände)
  • Volume - allgemeines, nicht vordeffiniertes Standard Volumen
  • LadderVolume - zum Erstellen einer Leiter
  • PhysicsVolume - zum Erstellen spezieller physikalischer Eigenschaften
  • DefaultPhysicsVolume - Standard "PhysicsVolume" (für normale Luft)
  • VacuumVolume - zum Erstellen eines Luftleeren Volumen
  • PressureVolume - zum Erstellen eines Hochdruck Volumen
  • WaterVolume - zum Erstellen eines Wasser Volumen
  • SnipingVolume - zum Erstellen eines Scharfschützen Volumen
  • SlimeVolume - zum Erstellen eines Schleim Volumen
  • LavaVolume - zum Erstellen eines Lava Volumen
  • LimitationVolume - Ein Volume das zum Ausblenden zum bestimmten Klassen (z.B. Projektile) auf dient. (z.B. um schüsse vor "FakeBackdrop" Flächen aus zu blenden)
1.2 - Weitere Eigenschaften von Volumes

Zusätzlich können aber auch nachfolgende Eigenschaften durch Volumina abgedeckt werden:
  • LocationName - Name des Aufenthaltsort des Spielers
  • VolumeFog - Eigenschaften des Nebels
  • Pain - Eigenschaften der Schmerzen (z.Bsp.: für ein Feuer)
  • Fluid - Flussrichtung / Windrichtung (z.Bsp.: für Wasser oder Luft/Wind)
  • Gravity Velocity - Eigenschaften des Spielergewichts (z.Bsp.: Schwerelosigkeit)
  • Slippery Floors - Eigenschaften des Bodens (z.Bsp.: rutschige Flächen)
  • AntiPortalActors - ...???...

Diese einzelnen Einträge wirken sich auf besondere Weise auf die Spielfigur aus. In den nachfolgenden Teilen dieses Tutorials werden sie detailiert erklärt. Ebenso wird gezeigt, wie man mit Hilfe von vordeffinierten Klassen jede menge Arbeit einsparen kann.

2 - Einstellungen der PhysicsVolume

Nach der allgemeinen Charakterisierung eines Volumen im ersten Teil des Tutorials sollen hier die speziellen Einträge besprochen werden, die sich dem Kartendesigner im ActorClassBrowser darbieten.


2.1 - Einträge der Mutterklasse Volume

Die eigentliche Mutterklasse (oder Ausgangsklasse) Volume ist eigentlich nur dazu fähig ein Volumen zu definieren und dessen LocationName festzulegen. Für den Einsatz im Editor eignen sich die verschiedenen Unterklassen viel eher. Die eigentliche Volume-Klasse nutzt man kaum alleinstehend, außer man will einem Bereich der Karte einen Namen zuordnen ohne spezielle physikalische Eigenschaften anzuwenden.


Der Eintrag LocationName ist durch die Grundklasse in allen Unterklassen ebenfalls vorhanden. Dieser sollte unbedingt gesetzt werden, und zwar in jedem einzelnen gesetzten Volumen. Der Eintrag wird unter VolumeProperties -> Volume -> LocationName vorgenommen; die nebenstehende Abbildung zeigt das entsprechende Feld. Der vergebene LocationName kann dann im Spiel benutzt werden, um festzustellen, wo sich die Spielfigur eines Spielers in der Karte gerade aufhält. Ebenso wird der LocationName in der TeamChat Funktion angezeigt.



2.2 - Allgemeine Einträge der Klasse PhysicsVolume

Die Klasse PhysicsVolume ist eine Unterklasse von Volume, aber die Oberklasse aller übrigen vorhandenen Volumina, die ausnahmslos Unterklassen der Klasse PhysicsVolume sind.

Einige haben nur vorgefertigte Werte für verschiedene Standard-Eigenschaften (WaterVolume), andere sind jedoch mit speziellen Script-Eigenschaften (Erklettern einer Leiter) ganz auf die jeweiligen Bedürfnisse abgestimmt. LadderVolume, VacuumVolume, WaterVolume, SlimeVolume und LavaVolume sind Unterklassen der Klasse PhysicsVolume. Diese Klasse beherbergt schon die meisten Properties-Einträge, die mit den generellen physikalischen Gegebenheiten des Volumen zu tun haben. Die Unterklassen enthalten diese Einträge naturgemäß ebenfalls.


So ist es auch möglich verschiedene Eigenschaften gleichzeitig auf ein Volumen anzuwenden. Die verschiedenen Möglichkeiten der allgemeinen physikalischen Eigenschaften findet man immer unter VolumeProperties -> PhysicsVolume. In Kombination können ganz lustige und brauchbare Effekte erstellt werden. Denkbar ist zum Beispiel: Eine Unterwasserleiter, Schmerzen, Antigravitation, Nebelschwaden, rutschige Fussböden etc.
Um die Einstellungen zu bearbeiten, müssen die Properties geöffnet werden. Mit einem Rechtsklick auf die Bauform erscheint ein Kontextmenü; ganz oben befinden sich der Eintrag PhysicsVolume Properties, den wir anklicken. In einem seperaten Fenster wird jetzt nebenstehendes Eigenschaften-Fenster sichtbar, in welchem nachfolgende Einträge eingestellt werden können:


[table 1 4 1]bMoveProjectiles|True = "Projektiles" bewegen sich synchron zur eingestellten "Velocity". (nur wenn es eine "ZoneVelocity" gibt)
bNeutralZone| True = Innerhalb des "Volume" kann der Spieler nicht getötet werden.
bNoInventory |True = Spieler werfen innerhalb des "Volume" beim Sterben keine Waffen weg.
bPainCausing| True = Spieler erhalten beim Betreten des "Volume" Energieabzug Schmerzen (nur wenn "DamagePerSec" gesetzt ist)
bWaterVolume| True = Aktiviert innerhalb des "Volume" den "Fluid" Wassereffekt. (teilweise im Script deaktiviert)
bDistanceFog| True = Aktiviert innerhalb des "Volume" den "Fog" Effekt. (nur wenn "VolumeFog" gesetzt ist)
DamagePerSec| Anzahl der pro Sekunde abgezogenen Schadenspunkte. (nur wenn "bPainCausing=True" gesetzt ist)
DamageType| Der Typ der zugefügten Schadensklasse, die bei "DamagePerSec" zugefügt wird. (nur wenn "bPainCausing=True" und "DamagePerSec" gesetzt ist)
FluidFriction| Wert der Dickflüssigkeit der Flüssigkeit (nur wenn "bWaterVolume=True" gesetzt wurde)
Gravity| Mit diesem Subeintrag wird sowohl die Flussrichtung, wie auch der Auftrieb im "Volume" geregelt.
GroundFriction| Der Wert gibt an, wie rutschig der Boden innerhalb des "Volume" ist.
Priority| Wenn sich mehrere "PhysicsVolumes" überlappen, wird das "PhysicsVolume" mit dem höchsten Wert Anwendung finden.
TerminalVelocity| Verändert die Fallgeschwindigkeit fliessend
ZoneVelocity| Wert der Geschwindigkeit, die ein Spieler erhält beim Betreten des "PhysicsVolume" ... (z.Bsp. für Wind)
EntryActor
EntrySound
ExitActor
ExitSound| Diverse selbsterklärende Sound-Einträge (nur wenn "bWaterVolume=True" gesetzt wurde)[/table]


2.3 - Bedeutung spezieller Einträge

2.3.1 - Rutschfestigkeit

Um eine rutschige Fläche zu gestalten (z. B. für eine vereiste Fläche), muss nur der GroundFriction-Standardwert unter PhysicsVolume von "8" auf einen anderen Wert gesetzt werden. Nachfolgend ein Beschreibung sinnvoller Werte:



[table 1 4 1]GroundFriction < 0.3 |Der Spieler gleitet sehr lange nachdem er schon in eine andere Richtung steuert
GroundFriction < 3| Der Spieler gleitet wenig/kaum nachdem er schon in eine andere Richtung steuert
GroundFriction = 8| Der StandardWert hiermit gleitet ein Spieler nicht und steuert sofort die neue Richtung an![/table]
Der Wert für GroundFriction ist nicht zu hoch zu setzen, das versteht die Engine nicht richtig, außerdem macht es auch keinen Sinn den Boden mit Klebstoff zu bekleistern. Zu hohe Werte lassen den Spieler nur nervös hin und her rütteln. Werte über 500 erzeugen zusätzlich unpassende, seltsam anmutende Sprünge der Spielfigur.


2.3.2 - Schadenswirkung

Dieser Wert wird benötigt, um zum Beispiel bei einem Feuer, Lava oder Schleim Schmerzen zu simulieren. Damit das PhysicsVolume überhaupt Schmerzen verursachen kann, muss der Eintrag bPainCausing auf den Wert ?True? eingestellt werden. Ebenso ist es notwendig den DamagePerSec-Wert > 0 einzustellen. Letzterer ist die Anzahl an Schadenspunkten, die pro Sekunde Aufenthalt im Volumen abgezogen werden. Hat der Spieler alle seine Energiepunkte verloren, wird er mit der in DamageType festgelegten Animation und Todesnachricht getötet. Falls der DamageType nicht gesetzt wurde, stirbt der Spieler den Standard-Tod.

Alle verfügbaren Schadenstypen findet man übrigens im ActorClassBrowser unter DamageType (auf unserem Bild haben wir einfach mal alle verfügbaren Arten aufgelistet). Den Eintrag nimmt man wie folgt vor: Öffne den ActorClassBrowser und klicke oben den Haken raus, um alle verfügbaren Klassen zu sehen. Erst dann erscheint auch DamageType als Eintrag im ActorClassBrowser. Diesen Eintrag selektieren wir, so daß er sichtbar farblich hinterlegt wurde. Im Properties-Fenster klickt man dann mit der Maus auf den zu ändernden Eintrag und wählt am Ende der Zeile die dann erscheinende Use-Schaltfläche. Der selektierte DamageType wird somit automatisch in das entsprechende Feld eingetragen.



Damit ein realistischer Effekt entsteht, sollte man darauf achten, daß der DamageType auch zum angelegten PhysicsVolume passt. Ein Feuer, in welchem man gurgelnd ertrinkt, oder ein Wasser, in welchem man in einer Stichflamme verbrennt, eignen sich weniger. Es stehen genug Todesarten zur Verfügung, um der Spielfigur einen glaubwürdigen Tod zu bereiten.

In den Default Properties der einzelnen Schadenstypen findet man die Todesnachricht für den Spieler, die Bildschirmanimation und viele weitere Einträge, die stattfinden, wenn die Spielfigur getötet wird.


2.3.3 Einfluß auf Bewegung

Im Normalfall (Voreinstellung) fallen in der Unreal Engine alle Objekte gemäß den Schwerkraftgesetzen wie in der Natur physikalisch nach unten. Aber nicht für alle Situationen ist dies die gewollte Richtung, in der sich innerhalb eines Volumen die Objekte bewegen sollen. So ist es sinnvoll in einem fließenden Gewässer die Objekte in Flussrichtung wegfließen zu lassen. Auch vor einem Ventilator könnten theoretisch andere Bewegungsregeln gelten. Um all diese Fälle abzufangen gibt es im PhysicsVolume drei wichtige Einträge:

[table 1 4 1]Gravity| Standard Schwerkraft-Wert ( Standard X=0 | Y=0 | Z=-950 ) entspricht der Erdanziehungskraft
ZoneVelocity| Der Spieler gleitet wenig/kaum nachdem er schon in eine andere Richtung steuert
TerminalVelocity| Der StandardWert hiermit gleitet ein Spieler nicht und steuert sofort die neue Richtung an![/table]

Gravity

Der Standard Gravity-Wert ist eine Simulation der normalen Schwerkraft, wie sie auch auf der Erde vorzufinden ist (EPIC sagt sogar, daß der Wert physikalisch cm/s² entspricht). Tatsächlich öffnen sich beim Betrachten der Felder drei Werte: "X", "Y" und "Z". Diese stehen standardmäßig auf Erdanziehung (siehe unser Bild). Die verschiedenen Werte erzeugen dabei jeweils eindeutige Fallrichtungen, die in der nachfolgenden Aufstellung abgelesen werden können:



[table 1 4 1]X > 0| nach Osten
X < 0| nach Westen
Y > 0| nach Süden
Y < 0| nach Norden
Z > 0| nach oben
Z < 0| nach unten [/table]

Zwischenwerte sind möglich, da sich die Gravity immer aus allen 3 Werten berechnet. Je höher der Wert ist, desto schneller drückt es Objekte und Spieler innerhalb des Volumen in die entsprechende Richtung. Hier einige vorgefertigte Werte, die man des öfteren gebrauchen kann:

[table 1 4 1]Bleischuhe| X=0 | Y=0 | Z=-2000 keine Sprünge möglich
Erdanziehungskraft| X=0 | Y=0 | Z=-950 normale Sprünge möglich
Mondanziehungskraft| X=0 | Y=0 | Z=-300 sehr hohe Sprünge möglich [/table]

Achtung: Der Gravity-Wert ändert die Richtung, jedoch nicht die Ausrichtung einer Spielfigur! Wenn sie gemäß einer veränderten Schwerkraft nach oben fällt, dann immer mit dem Kopf voran. Zusätzlich beschleunigt der Wert die Spielfigur konstant, bis sie schließlich Schaden erleidet, wenn sie mit einer bestimmten Geschwindigkeit auf ein solides Objekt auftrift (z. B. den Fußboden). Bei Z=-950 tritt der Schaden ab einer Fallhöhe von 1024 WE auf.

ZoneVelocity


ZoneVelocity ist eine generelle Kraft, die der Spielfigur entgegenwirkt. Mit diesem Effekt realisiert man unter anderem eine Luftströmung oder fließendes Wasser, das den Spieler mitreißen kann. Der ZoneVelocity-Eintrag bewirkt eine konstante, immer gleich schnelle Bewegung, die anders als der Gravity-Eintrag die Figur nicht beschleunigt. Wie schon die Schwerkraft verfügt auch der ZoneVelocity-Eintrag über die drei Unterwerte "X", "Y" und "Z", die auch hier die selbe Ausrichtung aufweisen, wie das bei der Scherkraft der Fall ist:

[table 1 4 1]X > 0| nach Osten
X < 0| nach Westen
Y > 0| nach Süden
Y < 0| nach Norden
Z > 0 | nach oben
Z < 0 | nach unten[/table]

(Anmerkung: Der Begriff ZoneVelocity stammt noch aus der Zeit, als solche Eigenschaften nicht über Volumina, sondern Zonen realisiert wurden. Die Programmierer haben wahrscheinlich den alten Code samt Überschrift kopiert.)

TerminalVelocity

Der Eintrag TerminalVelocity regelt schließlich die Fallgeschwindigkeit, und zwar unabhängig von ZoneVelocity oder Gravity. Hat man z. B. eine Karte gebaut, auf der die Spielfigur von sehr hohen Absätzen springen soll, ohne dabei Schaden zu erleiden, dann muß nicht gleich die Schwerkraft auf Mondanziehung reduziert werden. Es genügt, den voreingestellten Wert der TerminalVelocity zu reduzieren. Also gilt:

[table 1 4 1]TerminalVelocity < 2500| normales Hochspringen mit anschließend verlangsamtem Fall
TerminalVelocity > 2500| normales Hochspringen mit anschließend beschleunigtem Fall[/table]

2.3.4 - Nebel

Der sogenannte VolumeFog ist Bestandteil der Klasse PhysicsVolume und ist nur sichtbar, wenn bDistanceFog als ?True? eingestellt wurde. Alle Einstellungen sammeln sich unter PhysicsVolume -> Properties -> VolumeFog und sind in allen PhysicsVolume-Unterklassen fester Bestandteil.


Die drei unteren Einträge des Bildes regeln die Stärke des im Volumen sichtbaren Nebels. Nebel kann auch unter Wasser (auch Lava und Schleim) vorherrschen, dort ist es sogar als Standard gesetzt. Je weiter man schaut, desto trüber wird die Sicht. Weit entfernte Objekte belasten so nicht unnötig die ohnehin durch manch eine architektonische Meisterleistung hart angegriffene Performance der Engine im Spielbetrieb. Ein VolumeFog ist nur sichtbar, wenn man sich im entsprechenden PhysicsVolume befindet, was gerade durch den Spielerstandort und die Priority angesprochen ist. Außerhalb des PhysicsVolume ist der VolumeFog nicht sichtbar.

Hier noch eine Aufstellung der verfügbaren VolumeFog-Einträge und deren Auswirkungen:

[table 1 4 1]DistanceFogColor| Die allgemeine Farbe des Nebels. Eine Pipettenfunktion (Pick),eine RGB-Wert Eingabe und das Windows-Farb Schema stehen zur Verfügung.
DistanceFogEnd| Wert in WE der angibt, wie weit man maximal innerhalb des "Volume" sehen kann. alles was weiter weg ist taucht im Nebel unter.
DistanceFogStart| Wert in WE der angibt, wie weit man minimal innerhalb des "Volume" sehen kann. alles was näher dran ist wird nicht vom Nebel umhüllt.Dieser Wert muss demnach kleiner sein als der "DistanceFogEnd"-Wert. Zwischen den beiden Werten sollte ein gebührender Abstand liegen.[/table]


2.3.5 - Flüssigkeit


Die Unreal Engine bietet eine große Anzahl an Möglichkeiten ein Volumen mit Flüssigkeiten zu befüllen. Sobald ein Volumen als bWaterVolume als ?True? eingestellt ist, stehen auch die Sound-Einträge zur Verfügung! Diese legen fest, welche Sound-Datei beim Betreten oder Verlassen des Volumen gespielt wird. Generell setzt man ein vordefiniertes Flüssigkeits-Volumen ein. Dazu stehen folgende Möglichkeiten zur Verfügung:


[table 1 4 1]WaterVolume| neutrales Wasser
SlimeVolume| ätzende Säure
LavaVolume| kochende Lave[/table]

Unterschiede der Flüssigkeiten

Innerhalb dieser drei Volumina bewegt sich ein Spieler schwimmend fort. Jedoch verzichtet nur das WaterVolume auf eine Schadenswirkung. Um die Widerstandswerte (Grad der Dickflüssigkeit) zu ändern, muss die FluidFriction-Einstellung geändert werden. So lässt sich festlegen, ob man im dickflüssigen Morast oder in leichtem Flugbenzin schwimmt.

Der Standardwert beträgt bei Wasser 2.4; er ist auch voreingetragen. Hier noch einige zusätzliche allgemein gebräuchliche Einstellungen des FluidFriction-Eintrags:



[table 1 4 1]FluidFriction = 0 bis 0.5| Diese Werte gibt den Schwimmer Auftrieb, der Schwimmer kann eigentlich nicht von alleine absaufen!
FluidFriction = 2.4| Dieser Wert stellt den Standard für Wasser dar, es scheint der realistischste Einstellung zu sein
FluidFriction = 2.4| bis 8 Diese Werte stellen eine dickflüssigere Substanz dar, wie Schleim, Morast und sonstiges.
FluidFriction = 8| bis 64 Diese Werte stellt sehr dickflüssige Substanzen dar, wie Pech, Leim oder Klebstoff
FluidFriction > 50000 |Diese Werte stellen eine Art Gummimasse dar, die wirkt wie ein Trampolin.Sogar Geschosse prallen ab wie ein Flummi. Das Eintauchen ist nicht mehr möglich.[/table]

Ereignisse beim Betreten/Verlassen des Volumen

Mit den vier zusätzlichen Sound-Einträgen ist es möglich beim Eintritt/Austritt in das PhysicsVolume ein Ereignis zu erzeugen, das als Geräusch z. B. das plätschernde Wasser beim Eintauchen simuliert oder einen Aktoren aktiviert, z. B. die Explosion beim Berühren der Lava.



Unter PhysicsVolume findet man dazu folgende Einträge:

[table 1 4 1]EntyActor| Legt fest welcher "Actor" beim Eintritt erzeugt wird
EntrySound |Legt fest welcher "Sound" beim Eintritt erzeugt wird
ExitActor| Legt fest welcher "Actor" beim Austritt erzeugt wird
ExitSound| Legt fest welcher "Sound" beim Austritt erzeugt wird[/table]

Abgespielt wird ein solcher Sound jedoch nur, wenn der Eintrag WaterVolume als ?True? eingestellt wurde. Das ist bei den Klassen WaterVolume, SlimeVolume und LavaVolume der Fall.


Alle benötigten Aktoren findet man im ActorClassBrowser, jedoch ziemlich verstreut! Hier ist ein Überblick über einige gebräuchliche Aktoren mit Angabe, wo man sie finden kann:




[table 1 4 1]Wasser Ringe| Actor Class Browser/Effects/WaterImpact
Flammen Effekt| Effects/AnimSpriteEffect/UT_FlameExplosion[/table]



Es wird einfach eine Klasse im ActorClassBrowser selektiert, sie muss dabei farblich sichtbar hinterlegt werden. Danach wechselt man in das PhysicsVolume/Properties-Fenster und klickt auf den entsprechenden Eintrag, der geändert werden soll. Es erscheint am Ende der Zeile eine kleine Schaltfläche mit der Aufschrift Use. Wird diese jetzt geklickt, trägt sich das vorher selektierte Geräusch bzw. der Aktor selbsttätig in das entsprechende Feld ein.

Gleichzeitig zum Ereignis der Aktoren kann ein Geräusch abgespielt werden. Alle zur Verfügung stehenden Geräusche findet man im nebenstehend abgebildeten SoundBrowser!

3 - Unterklassen des PhysicsVolume

Anstatt mühsam alle Einträge selbst vorzunehmen, kann man mit einem Rechtsklick auf den Add Volume-Button vorgefertigte Unterklassen benutzen.

3.1 - WaterVolume, SlimeVolume und LavaVolume

Ein WaterVolume ist ein Gebiet, in welchem sich eine Spielfigur schwimmend fortbewegen kann. In einem SlimeVolume oder LavaVolume wird der Spielfigur zusätzlich Schaden zugefügt. Diese Volumina sind im Gebrauch fast identisch, sind sie doch alle drei Unterklassen des PhysicsVolume.

Beim Ein- und Austauchen wird ein ringförmiger Effekt auf der Oberfläche sichtbar, er simuliert die Wellen beim Eintauchen. Ebenso wird natürlich ein Sound abgespielt, der z. B. das Plätschern des Wassers simuliert. Ebenso verändert sich das Sichtfeld: Ein blau schimmernder Effekt trübt die Sicht, womit das Wasser simuliert wird. Dies wird erreicht durch die Einstellungen bDistanceFog=True und der DistanceFogColor. Die Farbe des Wassers kann dort sogar von blau (Standard) auf jede andere Farbe nach Wunsch geändert werden. Einfach die Werte bei DistanceFogColor ändern, indem man auf den Farbbalken klickt und dann auf die entsprechenden Buttons klickt!


Bis jetzt hat unsere Wasserfläche jedoch nur physikalische Eigenschaften, sichtbar ist sie jedoch innerhalb unserer Karte noch nicht. Was fehlt, ist eine Wasseroberfläche mit einer passenden Textur. So etwas läßt sich sehr schnell realisieren mit einer passenden Bauform und dem

Special Brush Werkzeug ...

Optimal ist ein Special Brush in genau derselben Größe wie das WaterVolume, der als Non-Solid Brush gebaut wird. Man schneidet zuerst ein Loch mit einem Subtract Brush, dann setzt man den Non-Solid mit der Wassertextur in das entstandene Loch hinein und fügt als letztes das WaterVolume hinzu. So kann man jederzeit auf die Eigenschaften des WaterVolume zugreifen, weil es in der 2D- oder der 3D-Wireframe-Ansicht nicht von einer anderen Bauform (der zuletzt gesetzten) verdeckt wird. Vergleiche dazu auch unsere nachfolgenden Abbildung:

1. Schritt 2. Schritt 3. Schritt

Subtract Brush Special Brush WaterVolume


Die eben beschriebene Möglichkeit eine Wasseroberfläche zu erzeugen geht relativ schnell, jedoch ist die damit erstellte Oberfläche nicht animiert. Man kann zwar eine animierte Textur nutzen, aber da die genutzte Bauform eine normale Primitive ist, erscheint die Oberfläche als plan. Wenn du lieber eine realitätsnahe, in ihrer Form animierte Wasseroberfläche erzeugen willst, kannst du den xProcMesh nutzen. Mit ihm wurde zum Beispiel das Wasser in der UT2003-Karte DM-Antalus unter der Tanne erstellt...


"XProcMesh" in der "Perspective" 3D-Ansicht



Unsere nebenstehende Abbildung zeigt einige der verfügbaren Einträge des in UT2003 vorhandenen xProcMesh. Die Wasseroberfläche reagiert in diesem Fall mit optisch wahrnehmbaren Polygon-Animationen sowohl auf Annäherung, als auch auf Berührung durch Pawns (Spielfiguren oder Bots)! Wenn ein Pawn durch den flachen Tümpel von DM-Antalus hindurchgeht, zieht er automatisch eine realistische Wellenbewegung hinter sich her. Diese wird durch die hier sichtbaren Einstellungen (vgl. das nebenstehende Bild) festgelegt und ist völlig unabhängig vom vorher gesetzten Volumen, in diesem Fall einem WaterVolume, weil der xProcMesh seinen eigenen Gesetzen gehorcht.


3.2 - VacuumVolume

Ein VacuumVolume ist ein Bereich innerhalb einer Karte, der einen geringeren Luftdruck aufweist. Die Unterklasse VacuumVolume ist ein ganz normales PhysicsVolume, dessen DamageType Einstellungen auf Depressurized gesetzt wurden.
Der entsprechend zugefügte Standard-Schaden ist jedoch auf Null gesetzt und sollte manuell erweitert werden. Dazu kann der Wert des DamagePerSec unter PhysicsVolume erhöht werden. Jedoch wird dieser Wert nur angewendet, wenn auch bPainCausing=True gesetzt wird. Vergleiche dazu auch unsere nebenstehende Abbildung!


3.3 - PressureVolume

Ein PressureVolume ist ein Bereich innerhalb einer Map, welcher durch einen Trigger ausgelöst innerhalb der PressureVolume alle Spieler tötet. Die PressureVolume wird wie das auch bei anderen Actoren funktioniert über den Events/Tag und einen herkömmlichen Triggers/Trigger angesprochen. Die entsprechenden Einstellungen können unter Properties/PressureVolume getätigt werden. Vergleiche dazu auch unsere nebenstehende Abbildung!


3.4 - LadderVolume

Das LadderVolume ist ebenfalls ein erweitertes PhysicsVolume mit einem zusätzlichen Script, welches es einer Spielfigur erlaubt eine Leiter zu erklimmen. Um also eine Leiter zu erstellen, muss man eine Wand mit einer daran befindlichen Leiter konventionell bauen. Wie ein Käfig (um die Leiter herum) bauen wir zum Schluß ein LadderVolume, das genauso breit und hoch wie die Leiter ist, jedoch etwas nach vorne herausragt (vgl. unsere nebenstehende Abbildung). Eine Spielfigur sollte sich später genau innerhalb des Volumens befinden können. Wir empfehlen eine Tiefe von 48WE für das LadderVolume, damit es reibungslos funktioniert.

In unserem Beispiel ist die Leiter 256WE hoch und 64WE breit, die Tiefe beträgt 8WE. Das in unserem Bild weiße, weil selektierte LadderVolume ist ebenfalls 256WE hoch und 64WE breit, jedoch satte 48WE tief. Viel größer darf man es nicht machen, sonst fängt die Spielfigur schon in der Luft an zu klettern, viel zu weit entfernt von der Wand, und das wollen wir ja nicht.

Vom Mittelpunkt des LadderVolumes zeigt ein Pfeil in eine beliebige Richtung. Dieser Pfeil muss auf die Leiter/Wand zeigen, die erklommen werden soll. Um den Pfeil zu drehen, muss in den Eigenschaften des LadderVolumes unter WallDir den Yaw-Wert erhöhen. Im nachfolgenden eine Liste üblicher Werte:



[table 1 4 1]Norden|49152
Osten|0
Süden|16384
Westen|32768[/table]

Alle anderen Richtungen sind auch möglich und stellen jeweils einen Wert zwischen den Himmelsrichtungen dar. Probiert ein bisschen herum mit den Werten für die einzelnen Richtungen, das hilft bei der Orientierung!



Wenn die Leiter gebaut wurde, wie auf unserem Bild, sollte die Leiter bereits nutzbar sein, sobald die Karte gestartet wird. In dem Moment, wo man genau vor der Leiter steht, kann man mit den Pfeiltasten ?hoch? und ?runter? die Leiter erklimmen oder hinabsteigen.

Beim Rendern eines LadderVolumes werden am oberen und unteren Ende jeweils ein AutoLadder angefügt. Dies sind automatisch gesetzte PathNodes, die im Spiel den Bots den Weg weisen. Man muss die AutoLadder nicht manuell setzen, wie einen LiftExit oder LiftCenter. Sollte man aber trotzdem diese, auch AutoPaths genannten NavigationPoints manuell setzen wollen, so ist dies möglich, wenn auch nicht ganz so einfach:


AutoLadder Symbol

Man öffnet die LadderVolume Properties und setzt dort unter LadderVolume den Wert bAutoPath=True auf bAutoPath=False. Dies deaktiviert erstmal das automatische Setzen der AutoLadders. Dann kann man über den ActorClassBrowser auf bekannte Art und Weise einen sogenannten SmallNavigationPoint als Ersatz setzen. Man findet diesen unter der Hauptklasse NavigationPoint.

Eine Leiter benötigt immer mindestens zwei AutoLadders bzw. SmallNavigationPoints, einen am unteren Ende und einen am oberen Ende der Leiter. Die Richtungspfeile der neu gesetzten NavigationPoints müssen wie auch schon der Pfeil des LadderVolumes in die Richtung der Leiter/Wand zeigen, damit diese Punkte später auch vom Spielfigur/Bot richtig verstanden werden.

3.5 - BlockingVolume

Ein BlockingVolume ist die eine Unterklasse von Volume. Da sich eine Spielfigur nicht innerhalb eines BlockingVolume aufhalten kann, liegen innerhalb dieses Volumens auch keine pysikalischen Eigenschaften vor. Oben auf einem BlockingVolume kann eine Spielfigur laufen. Wenn aber eine Kugel auf das Volumen auftrifft, fliegt sie hindurch.

Denkbare Einsatzorte sind zum Beispiel Gitter, auf denen man laufen kann, durch die man aber auch gleichzeitig durchschießen kann. Ebenso denkbar ist ein Einsatz als unsichtbare Wand, die eine Spielfigur davon abhält durch einen Spalt in der Architektur durchzufallen.



Ein BlockingVolume ist für die Engine im Spiel wesentlich schneller abzufragen als ein normaler StaticMesh, der jeweils noch zusätzlich das BSP berechnen muss. Ein BlockingVolume ist demnach gar nicht in der Lage BSP-Fehler zu erzeugen, weil es völlig unabhängig davon ist. Man kann ein BlockingVolume um einen StaticMesh herum bauen, um den Mesh ungangbar zu machen. Als spezielles Feature kann dann eingestellt werden, daß nur die Kollisionsabfrage des StaticMesh durch das BlockingVolume ersetzt wird, indem man in den Properties des StaticMesh unter Collision den Wert bBlockNonZeroExtendTraces=False setzt. Jetzt wird die Spielfigur schon am BlockingVolume gestoppt, die Kugeln und Geschosse jedoch zerschellen erst am StaticMesh.

3.6 - AntiPortalVolume

Allgemeine Charakteristik

Ein AntiPortalVolume ist im Ruhezustand orange eingefärbt. Selektiert man es aber, färbt es sich gelblich ein. Man erzeugt ein AntiPortalVolume mit dem

Add Antiportal Werkzeug!

Dieses Volumen stellt eine Besonderheit dar: Es muß keine 3D-Primitive zur Bauform haben wie im nebenstehenden Bild; ein Sheet reicht völlig aus. Dieses besondere Volumen dient der Optimierung der Performance.



Ein 3D-AntiPortalVolume wie der Kubus im Bild rechts muß innerhalb solider Architektur oder Terrains verborgen sein! Eine Spielfigur darf im Spielbetrieb auf keinen Fall innerhalb eines 3D-AntiPortals gelangen können, denn sonst würde der Spieler nichts mehr sehen außer einem bombastischen HOM-Effekt... Sollte so etwas beim Testen vorkommen, hilft meist die Überprüfung der gesetzten Volumen im Wireframe/Drahtgitter-Modus des 3D-Fensters. Wird dieses Volumen hingegen als 2D-Primitive gesetzt, also z. B. als Sheet in einer Wand, so spielt das keine Rolle.



Ein AntiPortalVolume verhält sich ähnlich wie ein Polygon, dessen Eigenschaften auf Antiportal geflaggt wurden. AntiPortal-Oberflächen haben die Aufgabe, alles zu okkludieren, was an geometrischen Bauformen oder Aktoren im Sichtwinkel des Spielers liegt. AntiPortal-Oberflächen okkludieren einen Gegenstand und dessen Polygone (zum Beispiel einen StaticMesh, einen Geländesektor oder ein BSP-Polygon) nur dann, wenn es vollständig durch ein AntiPortal (ob nun durch ein geflaggtes Polygon oder durch ein Volumen) abgedeckt wird. Um zu verstehen, was damit gemeint ist, müssen wir ein bißchen tiefer in die Funktionsweise der Engine einsteigen.

Funktionsweise des AntiPortals

?Okkludieren? meint das Aussparen (engl. occlusion) von Polygonen und ganzen Meshes während des laufenden Spiels vom rechenintensiven Prozess des Renderns. Die Engine des Spiels rendert nämlich alles, was sich im Sichtwinkel des Spielers befindet, egal, ob es hinter einer soliden Wand bzw. einem Terrain-Hügel verborgen ist oder nicht. Den erfahrenen Kartendesignern ist hier schon die ?Zone? als Mittel bekannt, um Polygone zu okkludieren, die einem Spieler verborgen sind. Damit wird der Engine Rechenzeit erspart und das Spiel flüssiger gemacht. Mit dem AntiPortal, ob nun als Eigenschaft eines Polygons oder als Volumen, können auch in derselben Zone befindliche, aber hinter der Architektur versteckte Dinge von der Engine okkludiert werden.

Beispiel für die Verwendung

Nehmen wir den Fall an, dass der Spieler vor einer Wand steht, die aus irgendwelchen Gründen aus zwei Bauformen besteht, deren gemeinsame Naht genau vor der Spielfigur ist. Dahinter befinde sich im Sichtwinkel, aber von den zwei Wänden versteckt ein Hardware Brush, der sehr polygon-intensiv gebaut wurde und deshalb viel Rechenzeit erfordert. Er steht genau hinter der Naht, d. h. seine rechte und seine linke Seite werden jeweils von der rechten oder der linken Wand verdeckt, ohne dass eine der Wände den ganzen Hardware Brush versperren würde. Der Kartendesigner merkt, dass das Spiel anfängt zu stottern, also will er alle überflüssigen Dinge vom Prozess des Renderns ausschließen. Er geht in die Eigenschaften der Polygone, wo die Wände links und rechts aneinanderstoßen, und flaggt die beiden als AntiPortal-Oberflächen. Jetzt okkludiert jede Wand das, was von ihr vollständig verdeckt wird. Leider ist das für unseren Spieler und den Hardware Brush nicht der Fall!

Hier schafft das AntiPortalVolume Abhilfe. Man konstruiere ein Sheet von der gemeinsamen Breite und Höhe der zwei Wände und versenke es in die Wand hinein. Jetzt wird der Hardware Brush vollständig okkludiert, und die Performance ist wieder akzeptabel.
Dasselbe ist der Fall bei Terrain. Dieses okkludiert nicht, d. h. der Baum hinter dem Hügel wird mitgerendert, obwohl der Spieler ihn nicht sehen kann. Ein Brush, vielleicht ein Kubus mitten im Hügel, schafft hier Abhilfe.

Es folgen zwei Einsatzmöglichkeiten von BlockingVolume und AntiPortalVolume:


Ein "BlockingVolume" als Baumstamm Ein "AntiportalVolume" für große Flächen