|
Gewitter mit Hilfe des Input/Output Systems |
|
|
Wie ihr sicherlich schon bemerkt habt, gibt es ein sog. "Input/Output"-System in der Source Engine. Dieses System eröffnet sehr viele neue Möglichkeiten im Bereich des Triggerns. Früher unter Half-Life1 musste man sich mit einem "multi_manager" begnügen. Jedes Entity besitzt jetzt einen Input/Output Flag. Früher konnte man nur jedem Entity einen "targetname" und ein "target" zuweißen. Durch das neue System könnten die Entities unkomplizierter und auf viele verschiedenen Varianten miteinander "komunizieren".
Ich werde jetzt ein relatives primitives Beispiel benutzen, um das System näher zu erläutern: ein Blitzgewitter.
Zuerst habe ich mir also Gedanken gemacht, wie man so etwas am besten und übersichtlichsten löst. Schlußendlich kam ich dann auf folgende Entity-Konstellation:
- 1x logic_timer
- 1x logic_case
- mehrere ambient_generic (im Beispiel sind es 3)
- mehrere light-Entities (im Beispiel sind es 12)
- mehrere env_laser -> info_target Zusammenschlüsse (im Beispiel sind es 6)
Die Grundidee:
Der logic_timer wird wie der Entity Name schon sagt als Timer benutzt. Das besondere am logic_timer ist, dass er Entities in unterschiedlichen Zeitabständen triggern kann. Man kann ein Intervall von zum Beispiel 10-20 Sekunden angeben, in dem der Timer dann agiert. Im Beispiel würde das dann so aussehen:
Der Timer "wartet" zunächst 10 Sekunden nach Spielbeginn. Nach diesen 10 Sekunden triggert er innerhalb der nächsten 10 Sekunden ein Entity
(bzw mehrere). Das kann also nach 11 Sekunden geschehen, aber auch erst nach 18 oder gar 20 Sekunden, per Zufall. Nachdem das Entity getriggert
wurde, macht der logic_timer wieder 10 Sekunden gar nichts, dann beginnt das Spiel von neuem und er triggert innerhalb der nächsten 10 Sekunden wieder.
So wird bei mir im Beispiel das Gewitter aufgebaut sein, denn in der Natur folgen Blitze auch keinem bestimmten Zeitmuster.
Das logic_case werden wir dazu verwenden, um absoluten Zufall beim Triggern der einzelnen Blitze zu erreichen. Näheres dazu dann später.
Die Funktion der beiden logics sollte nun verstanden sein, was die anderen Entities beim Gewitter für eine Rolle spielen, sollte klar sein:
- Die ambient_generics werden den Sound dazugeben.
- Die lights natürlich unser Blitzlicht
- Die env_laser in Zusammenarbeit mit den info_targets die Blitze selbst.
Dann hab ich mir noch überlegt, dass man hier auch die 3d-Skybox sehr gut verwenden kann, nämlich für die Blitze. Wir werden alle Blitze in die 3d-Skybox setzen, das schafft Übersicht, hält das eigentliche Level von zuvielen Entities frei und gibt gleichzeitig genau den Effekt, den wir möchten.
Los geht's:
1) Baue dein Level.
2) Erstelle die 3d-Skybox. Ein Tutorial findest du hier.
3) Erstelle die benötigten Entities:
- Die ambient_generics irgendwo ins Hauptlevel.
- Den logic_timer ebenfalls irgendwo ins Hauptlevel (der Ãœbersicht zuliebe zu den ambient_generics).
- 6 lights in die 3d-Skybox zu den einzelnen env_lasern setzen. Die anderen 6 lights werden ins Hauptlevel gesetzt.
- Die 6 env_laser mit den dazugehörigen info_targets in die 3d-Skybox.
Einstellungen zu den einzelnen Entities (ihr könnt bei den Namen der Entities natürlich auch eigene verwenden):
Sound
1. ambient_generic: Name: donner1 (Rest der Einstellungen nach Belieben)
2. ambient_generic: Name: donner2 (Rest der Einstellungen nach Belieben)
2. ambient_generic: Name: donner3 (Rest der Einstellungen nach Belieben)
Natürlich jedem ambient_generic noch einen Donner-Sound zuweisen (z.B. im mp3-Format -> Tutorial).
Blitzlicht
a) Verteile in der 3d-Skybox (vorzugsweise an der Decke) 6 light-Entities. Am besten mit den Namen "blitzlicht1_skybox", "blitzlicht2_skybox" usw.
Beim Brightness-Wert könnt ihr variieren, jedoch sollten alle Lichter weiß sein.
b) Verteile im Level (wieder vorzugsweise erhöht) 6 light-Entities. Achte dabei ein bisschen auf die Winkel, aus denen eure env_laser später im Sky zu sehen sein werden. Schließlich sollen die Gebäude ingame auch Schatten werfen, die mit der Richtung, aus der die Blitze kommen, zu vereinbaren sind. Gib diesen 6 Lichter ebenfalls leicht nachzuvollziehende Namen, wie zum Beispiel "blitzlicht1", "blitzlicht2" usw. Auch hier kann beim Brightness-Wert variiert werden, die Farbe weiß sollte natürlich erhalten bleiben.
Blitze
Nun zu den eigentlichen Blitzen. Erstellt in der 3d-Skybox 6 env_laser und 6 info_targets. Dabei verschiebt ihr die env_lasers an die Decke, die info_targets auf den Grund der 3d-Skybox. Das env_laser-Entity ist der Anfangspunkt des Blitzes, das info_target bestimmt das Ende des Blitzes.
Gebt den env_lasers logische Namen wie "blitz1", "blitz2" usw. Das gleiche mit den info_targets: "blitz1_ziel", "blitz2_ziel" usw. Mehr braucht ihr bei den info_targets nicht einzustellen.
Jetzt aber zu den env_lasers (als Beispiel nehme ich "blitz1"):
Name: blitz1
Target of Laser: blitz1_ziel (= das dazugehörige info_target)
Brightness: 160 (Helligkeit des Blitzes; kann man auf die Helligkeit der light-Entities abstimmen, wer es ganz realistisch will)
Beam Color (RGB): 255 255 255 (Farbe des Blitzes; im Beispiel weiß)
Width of Beam: 0.75 (nach Belieben; der Wert 1 ist Standard)
Amount of noise (0-255): 140 (hier kann man einstellen, wie weit verzweigt und unregelmäßig der Blitz sein soll; 0 wäre hier ein kerzengerader "Blitz", was jedoch unrealistisch aussieht)
Alle anderen Einstellungen sind nicht von Bedeutung bzw. haben mit unserer Sache nichts zu tun. Bei den Flags sollte "Start on" natürlich deaktiviert sein.
Gehe jetzt jedes env_laser durch und variiere bei den Einstellungen Brightness, Witdh of Beam und Amount of noise (0-255). So wird garantiert, dass jeder Blitz anders aussieht - wie in der Natur eben auch.
Jetzt müssen die Blitze nur noch ausgerichtet werden, möglichst gleichmäßig, damit später überall im Sky einmal ein Blitz erscheint. Verschiebe also die env_lasers und
info_targets im Raum und achte darauf, dass du möglichst an den Seitenwänden der 3d-Skybox agierst und kein Blitz dem sky_camera-Entitiy zu nahe kommt, denn die Blitze sollen optisch im Sky bleiben und nicht durch die Levelgeometrie gehen.
4) Nun wurden alle Entities erstellt und eingerichtet - bis auf die beiden logics:
Gehe ins Hauptlevel und erstelle ein logic_timer und ein logic_case.
Gib dem logic_case den Namen "case".
Jetzt gehe zu den Einstellungen des logic_timer:
Name: timer
Start disabled: No (wir brauchen den Timer von Anfang an)
Use Random Time: Yes (ja, weil wir die Blitze zu unterschiedlichen Zeiten haben möchten)
Minimum Random Interval: 10
(das System habe ich bereits oben erklärt -> "Die Grundidee")
Maximum Random Interval: 20
Refire Interval: wird nicht benötigt
Wechsle nun in die Outputs und klicke dort auf "Add...". Jetzt trage folgende Werte ein, wie sie auf dem Bild zu sehen sind:
Zur Erläuterung:
My output named: Hier sind die Werte von Entity zu Entity verschieden. Bei einem Timer brauchen wir logischerweise den Output "OnTimer".
Targets entities named: Wie der Name schon sagt wird hier das Ziel-Entity angegeben. In unserem Fall aktivieren wir das logic_case-Entity.
via this input: Wo es einen Output gibt, muss es immer auch einen Input geben. Auch dieser Wert variiert natürlich von Entity zu Entity. Hammer erkennt
jedoch über den Namen, den wir bei Targets entities named: angegeben haben, um welches Entity es sich handelt und filtert automatisch alle möglichen Inputs heraus. Für unser logic_case brauchen wir "PickRandom".
After a delay in seconds of: Hier kann man noch eine Verzögerung hinzufügen, nach der das logic_case getriggert werden soll. Für unsere Fall jedoch unnötig.
Klicke Apply.
5) Nun zum letzten Schritt:
Gehe in die Einstellungen des logic_case.
Für unser Gewitter benötigen wir 6 Cases (= Fälle). Tragt in das Feld Case01 den Namen des ersten Lichtes ein: blitzlicht1
Geht genauso bei den weiteren 5 Cases vor. Bei Case02 tragt ihr also blitzlicht2 ein usw. Wenn ihr das bis einschließlich Feld Case06 gemacht habt, wechselt in die Outputs.
Jetzt wird die Sache etwas komplizierter. Jedes Entity muss nun mehrere Male hintereinander in kurzen Zeitabständen getriggert werden. Im Beispiel habe ich das mit jedem Entity vier Mal gemacht.
Da es zu kompliziert und irreführend wäre, das hier zu erklären, sollte die Beispiel-Map heruntergeladen werden.
Ich erläutere kurz die Einstellungen:
Alle Lichter werden mit der gleichen Verzögerung gleichzeitig mit den Blitzen aus der 3d-Skybox getriggert.
Somit wird die Levelgeometrie in der 3d-Skybox und im eigentlichen Level genau gleichzeitig beleuchtet.
Danach wird mit kurzem Abstand (siehe Delay-Spalte) der Sound abgespielt (nach den Naturgesetzen: Licht breitet sich schneller aus als Schall).
Schaue dir einfach mein Beispiel an und vollziehe alle Einstellungen nach. Dann wird einiges klarer werden. Natürlich kannst du die Beispielmap auch gerne compilen und ingame anschauen.
-> downloads/gewitter.zip |
|
|
Crow |
|
|