Nicht eingeloggt
Registrieren

Matinee Fahrstuhl

UED 3 Tutorial: Matinee Fahrstuhl
Autor: DerDimö



Aufzug über 3 Etagen (singleplayer / offline)

In diesem Tutorial lernt ihr, wie ihr mittels einer Matinee Sequenz einen vollfunktionsfähigen Aufzug bauen könnt, der von jedem der 3 Stockwerke aus "gerufen" werden kann (man drück aufs Knöpfchen und er kommt) und in dessen inneren man jedes der 3 Stockwerke als Ziel auswählen kann.

Ich erkläre den Aufzug gleich so, dass er nacher auch optisch einwandfrei aussieht (sprich Türen, die sich korrekt öffnen und schließen, etc), da das aber nicht zwingend für die Funktion ist und ihr die Funktionsweise eventuell für etwas ganz anderes nutzen wollt habe ich alles, was nicht zwingend notwendig ist in blau gemacht.
Das gilt sowohl für den Text, als auch für die Bilder.



Na dann fangen wir mal an.

Als Erstes braucht ihr einen sehr hohen Schacht, in den euer Aufzug reinpasst, in meinem Fall habe ich 2816 genommen, aber es spielt eigentlich keine Rolle, wie hoch ihr ihn möachen wollt.
Dann setzt ihr die 3 Stockwerke in gleichem Abstand zu einander und verbindet diese mit einem kleinen Durchgang.
In meinem Fall sind die Stockwerke 384 Einheiten hoch, 640 Einheiten voneinander entfernt und in einem Abstand von 32 Einheiten zum Schacht.
Dementsprechend sind die Durchgänge 32 Einheiten dick, 128 Einheiten lang und 192 Einheiten och, nur damit ihr eine ungefähre Vorstellung habt.


Damit es weiter gehen kann brauchen wir einen bewegliche Aufzugkabine, sprich einen Mover.
Den könnt ihr gestalten, wie ihr wollt, meiner sieht so aus:

ein schlichter Würfel mit einer Öffnung, nichts besonderes, aber für dieses Tutorial wird er's tun.
Denn adden wir nun irgendwo in unseren Schacht, im Moment spielt es noch keine Rolle, wo.



Als nächstes erstellen wir eine Matinee Sequenz.
Es wäre an dieser Stelle ratsam, wenn ihr bereits die Matineettorials gelesen habt, aber das dient nur dem Verständnis, hier erkläre ich noch einmal alles Schritt für Schritt.
Nachdem ihr nur auf das Matineesymbol geklickt habt geht ihr auf "Add new Scene" und klickt da 4-mal drauf, da wir 4 Sequenzen benötigen werden.
Anschließend stellt ihr bei jeder Sequenz unter "Scene Manager" die folgenden Werte um:
Affect: AFFECT_Actor
AffectedActor: "EuerMover, einfach mit "Use" einbinden, in meinem Fall wäre das Mover'myLevel.Mover5'"

Nun wählt ihr im Matinee Tool die Karteikarte "Tools Aus und erstellt irgendwo einen InterpolationPoint, in dem ihr auf "AddInterpolationPoint" klickt.
Dieser muss unbedingt vollkommen auf 0 ausgerichtet sein, er darf also keine Drehung um irgendeine der 3 Achsen haben.
Aber bevor ihr euch jetzt dran macht und ihn von Hand auf 0 ausrichtet, geht doch einfach schnell in die Properties und löscht alle Werte die ihr bei "Rotation" unser "Movement" findet
Nachdem ihr ihn nun auf 0 ausgerichtet habt dupliziert ihr ihn mit STRG+W 2 mal, so dass wir 3 InterpolationPoints haben.
Diese setzt ihr nun auf die 3 Etagen, auf denen der Aufzug später halten soll.
Wichtig ist hierbei, dass der Pivot des InterpolationPoints genau an der Stelle ist, an der später der Pivot des Movers sein soll. Das ist etwas gefummel, aber daran führt kein Weg vorbei.
(An dieser Stelle eine kurze Anmerkung: wenn ihr einen zu komplexen Mover erstellt habt und nicht auf den Pivot geachtet habt, dann löscht ihn und erstellt ihn neu, mit einem sauberen Pivot, sonst habt ihr später einen Haufen mehr Arbeit vor euch.)

Nachdem ihr nun die 3 Interpolationpoints ausgerichtet habt, müsst ihr eure 4 Sequenzen benennen.
Das macht ihr unter "Events" --> "Tag". Meine hab ich einfach danach benannt, was sie machen, sprich Unten-Mitte; Mitte-Oben; Oben-Mitte; Mitte-Unten, aber im Prinzip ist es egal, ob ihr sie nach eurem Lieblingsgoldhamster, oder nach eurer Großmutter benennt
Jetzt müsst ihr für jede Sequenz 2 Aktionen erstellen, wählt dazu einfach die Sequenz aus und geht in die Karteikarte "Actions" im Matinee Tool.
Dort klickt ihr dann jeweils 2-mal auf "Add new Action" und nehmt eine "Action Move Camera".
In diese Actions müsst ihr nun eure InterpolationPoint eintragen (und für alle Schlauberger unter euch: nein, es ist nicht geschickter es mit "AddInterpolationPoint and Action" zu machen, da ihr die InterpolationPoint eh mehrmals verwenden müsst, es sei denn ihr habt Lust auf mehr Arbeit )
Für die Sequenz, die sich von oben zur Mitte bewegt nehmt ihr für die erste Action eure obersten InterpolationPoint und für die 2 Action euren mittleren InterpolationPoint. Be der Gelegenheit gebt ihr der 2. Action auch gleich eine Zeit, die sie dauern soll, später wird das die Zeit sein, die euer Aufzug braucht um sich von einer Etage zur nächsten zu bewegen.
In meinem Fall hab ich hier 3 Sekunden eingetragen.
Das macht ihr nun für alle 4 Sequenzen.
Zu guter Letzt bekommt nun noch jede Sequenz bei einer ihrer zwei Actions (welche ist eigentlich egal) eine SubAction --> CameraOrientation.
Dort stellt ihr die Orientation dann auf None, sonst habt ihr keine Chance eueren Aufzug auszurichten.
Dann müsste das in etwa so aussehen:
dimo_matinee_fahrstuhl_tut_02.jpg


So, dann kommen wir langsam zu dem Herz des Ganzen: die TriggeredCondition
Diese sind der Kernbestandteil, der die ganze Abfolge erst ermöglicht.
Ich gehe mal davon aus, dass die Wenigsten von euch schon mal eine TriggeredCondition verwendet haben, also erkläre ich die gleich noch ausführlicher.
Für die, die sie bereits kennen: Anfangs aus, mit Ausnahme der TriggeredCondition, die den Stock angibt, in dem sich die 0-Possition des Aufzugs befindet. Toggle und TriggerControl natürlich an.

Also um eine TriggeredCondition einzufügen müsst ihr sie erstmal im ACB anwählen, ihr findet sie unter Triggers --> TriggeredCondition. Nachdem ihr sie eingefügt habt, öffnet ihr die Properties.
Die einzigen Einträge, die wir hier noch ändern müssen sind der Tag unter Events und die Einträge unter "TriggeredCondition".
Als Tag hab ich jeweils für die 3 TriggeredConditions "Fahrstul-X" genommen, wobei X für Oben, Mitte, oder Unten steht. Das ist einer der Hauptunterschiede zu einem normalen Trigger, dessen Event ihr ja über ein "WaitForEvent" im ScriptedTrigger abfragen könnt. In diesem Fall erfolgt die Abfrage der TriggeredCondition im ScriptedTrigger nämlich über den Tag.
Danach ändert ihr die Einstellungen unter "TriggerdCondition" wie folgt:
bEnanbled=True (mit Ausnahme der Triggered Condition, die sich in dem Stockwerk befindet, von dem aus der Aufzug nachher startet)
bToogled=True
bTriggerControlled=True
bEnabled gibt dabei nur an, ob die Condition von Anfang an wahr, oder falsch sein soll. bToogled gibt an, ob die Condition wieder zurückspringt, sobald sie nicht mehr durch einen Trigger angesprochen wird (hilfreich, wenn ihr 2 Spieler zwingen wollt an 2 Orten gleichzeitig zu sein, damit etwas ausgelöst wird). bTriggerControlled gibt zudem noch an, dass ein Trigger für die Kontrolle der Condition verwendet wird.


Das war’s soweit mit dem IfConditions, jetzt kommt der witzige Teil:
Die Scripted Trigger (ich hab nie gesagt, dass es leicht ist und schnell geht )
Wenn ihr logisch darüber nachdenkt, dann dürftet ihr recht schnell selbst darauf kommen, dass wir für jedes Stockwerg 2 SckriptedTrigger brauchen, denn es gibt 3 Möglichkeiten:
1. Der Aufzug ist in dem Stockwerk --> es muss nichts geschehen
2. Der Aufzug ist in einem der beiden anderen Stockwerke --> er muss über die eine mögliche Folge von Sequenzen kommen
3. Er befindet sich im anderen Stockwerk als in Punkt 2. --> er muss über die andere mögliche Folge von Sequenzen kommen.
Da dies die Aufwendigste Arbeit ist und ich mich zu Tode schreibe, wenn ich im Einzelnen erkläre, wofür ihr welche Aktion braucht, hab ich jetzt nur die Bilder der 6 ScritedTrigger angehängt, wie sie fertig aussehen müssen. Das meiste ist eh selbsterklärend und im Prinzip sind alle ScriptedTrigger gleich, nur mit anderen Namen…
Ich hab sie so angeordnet, dass im 1. Stock die stehen, die den Aufzug aus den beiden anderen Stockwerken in den 1. Stock bringen.

Unterer Stock:


Mittlere Etage:


Oberster Stock:

Kurze Erklärung zum blauen Teil:
Die "Tuer-X" Events (z.B. "TuerOben") lösen die Türmover aus.
Die FakeTuer ist ein Emitter, der getriggert wird.
Dazu aber später mehr.


Und nun scharf nachgedacht, was fehlt denn noch?
Richtig!

Die ganzen Trigger.
Das ist die wohl monotonste Arbeit, aber was sein muss sein.
Also nehmt euch einen Trigger ausm ACB und fügt ihn in die Map ein. Insgesamt braucht man für 3 Stockwerke 12 Trigger. Ich würde euch aber empfehlen erst mal nur 3 zu erstellen, da wir diese 3 auch 4-mal duplizieren können und uns somit Arbeit sparen.
Jetzt gebt ihr den Triggern ihre entsprechenden Events.
Ich habe hierfür "Call-X" verwendet, weil der Aufzug ja zu einem bestimmten Stock gerufen wird, aber das bleibt euch überlassen, denkt nur dran das dann auch in eurem ScriptedTrigger richtig einzustellen.
Nachdem ihr nun den 3 Triggern ihre 3 verschiedenen Events gegeben habt kommt, wie vorher angekündigt, das duplizieren. Nun stellt ihr in jedes Stockwerk innen einen Knopf rein, der den Aufzug in dieses Stockwerk ruft und bringt jeweils 3 außen an, so dass man sein Stockwerk auswählen kann (wer pingelig ist, kann nun jeweils wieder einen der 3 äußeren löschen, da er eh nicht verwendet werden kann, aber er stört auch nicht).


Sodele, jetzt sollte eigentlich alles funktionsfähig sein.
Ab jetzt folgt nur noch die graphische Gestaltung.


Hier bei sind 2 Sachen wichtig:
Die Türen müssen sowohl im Fahrstuhl schließen, als auch außerhalb, damit niemand in den Schacht reinfällt. Das mit Movern zu lösen ist schlicht unmöglich, weil ein Mover, der an einen anderen Attached ist (also die inneren Türen, die mit dem Aufzug mitfahren sollen) keine eigene Bewegung mehr vollziehen kann.
Meine zugegeben nicht all zu elegante Lösung war einfach eine Tür in jedem Stockwerk zu machen die so breit ist, dass sie sowohl vom Stockwerk aus gesehen wird, als auch vom Inneren des Aufzugs aus und dazu einen Emitter, der die Meshs der Tür im geschlossenen Zustand spawnt und mit dem Aufzug mitfährt (natürlich eine Idee weiter in den Aufzug hinein versetzt, als die Mover).
Wenn sich nun die Türen schließen wird in dem Moment der Emitter aktiviert und man sieht nur noch den Emitter und nicht mehr die Mover, wenn man im Inneren des Aufzugs ist.
Diese fährt dann einfach mit und wird oben wieder deaktiviert, kurz bevor sich die Movertüren öffnen.
Da er minimal nach inner versetzt ist, wird das nicht auffallen (wir sprechen hier von etwa 1/20 der Wegstrecke bei einem 1er Grid), dass plötzlich der MeshEmitter erscheint und den Blick auf die Mover verdeckt. Ebenso kann man es nicht erkennen, wenn er wieder verschwindet und die Türen sich öffnen.

Ich denke die Mover schafft ihr alleine, ich hab einfach 2 genommen, die dann in der Wand verschwinden und den Tag "TuerX" haben.
Beim Emitter müsst ihr darauf achten, dass ihr die kleinste möglichste LifeTime einstellt (0.000001) und unter General MaxParticles auf 1 stellt. Dadurch sieht es so aus, als ob er jeder Bewegung des Aufzugs folgen würde.


Nachdem ihr das geschafft habt sollte ihr nun einen vollfunktionsfähigen Aufzug mit Tür haben.


Zum Abschluss noch ein paar Warnungen:
Das System wird nicht im Netzwerk funktionieren.
Das heißt, es funktioniert schon, aber auf Grund der Ermangelung eines Netzwerkcodes dafür wird es nicht dargestellt.
Sprich für jeden Clienten sieht es so aus, als ob sich der Aufzug nie bewegt und selbst wenn man auf ihm steht und die Bewegung mitmacht sieht man dies nicht.
Wenn man aber der Aufzug verlässt, dann "beamt" sich eure Ansicht in den Stock, in dem sich der Aufzug nun befindet.
Das gleiche passiert, wenn man springt.

Apropos springen:
Noch ein unangenehmer Bug in der Engine ist, dass jeder Pawn (ob Bot, oder Spieler) die Geschwindigkeit des Aufzugs annimmt und beibehält, solange er auf diesem steht, selbst wenn der Aufzug sich gar nicht mehr bewegt. Fährt der Aufzug also nach oben und bleibt dann stehen könnt ihr einen enormen Sprung machen, fährt er aber nach unten und bleibt dann stehen, kommt ihr nicht mehr vom Fleck.
Wobei man damit sicherlich witzige Sachen anstellen könnte, die arme User verwirren

Gegen diese beiden Bugs lässt sich leider nichts machen, außer eventuell die Engine umschreiben, aber wer das kann, kann auch gleich seinen eigenen Aufzug schreiben ^^


In diesem Sinne:
Viel Spaß mit dem Tut, auch wenn es etwas langatmig ist und ich bin natürlich gerne bereit alle Fragen zu beantworten und würde mich freuen, wenn ihr mir weitere Bugs melden würdet.

Grüsse
DerDimö aka. Pandemonium