Nicht eingeloggt
Registrieren

Anfängertutorial für Kismet im Ued 4

Ich setze für dieses Tutorial keine Programmiererfahrung vorraus, obwohl es für Kismet von Vorteil ist, schon mit objektorientierten Programmiersprachen zu tun gehabt zu haben.
Auch Erfahrung mit Matinees und Triggern werden nicht vorrausgesetzt.
Einfaches Mappen (Brushes, Staticmeshes hinzufügen, Adden, Substracten, Eigenschaften bearbeiten) ist aber Vorraussetzung.

Es folgt eine kurze Einleitung zum Verständnis des Begriffs "UnrealKismet".
Wer es eilig hat, kann sie problemlos überspringen.

Um Kismet zu definieren, greife ich auf die 3-Schichten-Architektur zurück, die ich aus dem Informatik-Unterricht habe . Nach Konzept eben jener besteht ein Programm aus folgenden 3 Schichten:
- Benutzeroberfläche
- Fachschicht (Funktionen)
- Datenhaltungsschicht (Objekte, Variablen)

Im Falle von Unreal Tournament 3 wird die Benutzeroberfläche von euch in Form einer Map gestaltet, plus dem, was das Spiel hinzufügt (Spieler, Waffen, HUD...).
Die Datenhaltungsschicht besteht zu einem Teil aus den Objekten, die ihr beim Mappen erstellt habt.
Kismet ist zum Erstellen der Fachschicht und zum Erweitern der Datenhaltungsschicht.

Mit Kismet könnt ihr:
- Variablen deklarieren, verändern, und benutzen
- Auf alle möglichen Ereignisse im Spiel reagieren
- Verschiedenste Dinge im Spielverlauf ändern

Daraus ergibt sich eine Reihe von Dingen, die mit Kismet realisierbar sind:
- Fahrstühle, Türen, Fallen, ...
- Kamerafahrten, Filmsequenzen (z.B. bei Kernzerstörung in Kriegsführung-Maps), oder theoretisch ganze Filme
..und einiges mehr...

In der Map MarketDistrict rauscht beispielsweise ab und zu ein Zug durch die Station. In Sinkhole gibt es ein Tutorial. All diese Dinge werden mit UnrealKismet erstellt. Und mit etwas herumexperemtieren ist es ganz einfach.
Wenn ihr mal nicht weiter wisst, ist es wie immer ratsam, sich eine Map von Epic anzuschauen.


Kapitel 1 - Eine Umgebung zum experimentieren
Bevor ihr mit Kismet loslegen könnt, müsst ihr erstmal eine kleine Map erstellen, nicht unbedingt etwas spielbares...
Ich empfehle für den Anfang folgendes:
- Erstellt eine neue Map (Substraktiv)
- Schneidet einen Raum (1024*1024*1024) aus
- Fügt noch ein Licht und einen PlayerStart hinzu

Builden braucht ihr noch nicht.

Heraus kommt also so etwas:
kismetanf01.jpg

Ich werde in einigen der folgenden Kapitel eine neue Map auf Basis dieser Map anfangen, darum empfehle ich, diese Map unter dem Namen "KBasis" zu speichern und in den entsprechnden Kapiteln KBasis zu laden und dann unter dem Namen "DM-KTest1" (2,3,...) zu speichern.

Legen wir also mit "DM-KTest1" los.

 


Kapitel 2 - DM-KTest1 - Ein Fahrstuhl
Erstellen wir nun einen Fahrstuhl.

Ein Fahrstuhl ist eine mögliche Anwendungsart des InterpolateActors (Interpolate (engl.): einschalten). Früher hießen sie Mover.

InterplolateActors sind StaticMeshes, die noch ein paar zusätzliche Eigenschaften bezüglich ihrer Bewglichkeit haben. Suchen wir uns also einen StaticMesh, der als Fahrstuhl geeignet ist
(Generic Browser öffnen => "Generic"-Tab => bei StaticMeshes Häkchen setzen => Paket aussuchen/laden => rechts einen aussuchen und markieren)

kismetanf02.jpg

In diesem Fall habe ich HU_Floor2 geladen (UT3-Ordner\UTGame\CookedPC\Environments\HU_Floor2.upk) und S_HU_Floor_SM_SidewalkA_128 genommen. Da muss man sich dann aber noch eine Kollision besorgen ^^.
Fügt jetzt den StaticMesh in die Map ein, aber nicht als StaticMesh, sondern als "InterpActor".

kismetanf03.jpg

Dieser Actor ist jetzt durch sog. Matinees bewegbar. Ein solches Matinee, das den Fahrstuhl immer wieder hoch und runter fahren lässt, wollen wir jetzt erstellen.
Dazu öffnen wir das erste mal den Kismet-Editor.
Klickt dazu auf das grüne K oben neben dem Generic Browser-Symbol:

kismetanf04.jpg

Es öffnet sich dieses Fenster:

kismetanf05.jpg

Zunächst ein paar Grundlagen.
Die wichtigsten Typen von Objekten in UnrealKismet sind flogende:
- Events: Sie sind Auslöser für alles mögliche (Beispiel: ein TriggerEvent).
Sie treten meist in Form von Rauten auf.
- Actions: Sie machen irgendetwas (z.B. rechnen).
Diese sind meist rechteckig.
- Variables (Variablen): Zahlen, Wörter, Sätze, Punkte, Vektoren...
Sie sind in Kreisen.

kismetanf06.jpg

Hinzu kommt noch ein spezielles Objekt, das Matinee:

kismetanf07.jpg

Diese Objekte werden mit Pfeilen verbunden, indem man einen "Connector" anklickt und den Pfeil bis zu einem andern zieht.

kismetanf08.gif

Fangen wir jetzt mit dem Fahrstuhl an:
Dazu benötigen wir:
- Einen Auslöser, in diesem Fall den Start des Levels und
- Ein Matinee, das den Fahrstuhl ständig bewegt.

Klickt dafür mit rechts auf einen freien Bereich und wählt zuerst "New Event" => "Level Startup"

kismetanf09.jpg

Dann fügt rechts daneben ein Matinee ein ("New Matinee").

Verbindet dann den "Out"-Connector des Level-Startups mit dem "Play"-Connector des Matinees. Dann verbindet noch "Completed" des Matinees mit "Reverse" und "Aborted" mit "Play" Das Ergebnis sieht dann in etwa so aus:

kismetanf10.jpg

Was ihr jetzt vorliegen habt, ist ein Matinee, das beim Start des Levels sofort ausgelöst wird, und wenn es "fertig" ist, spielt es sich selber wieder ab, aber dann rückwärts. Der Fahrstuhl fährt also hoch, wieder runter, wieder hoch...

Jetzt müsst ihr dem Matinee beibringen, was es zu bewegen hat (den Fahrstuhl) und wie er das tun soll (ein Mal nach oben).
Dazu stellt ihr sicher, dass im Editor euer Fahrstuhl markiert ist und doppelklickt dann auf des Matinee.
Das Fenster, das sich darufhin öffnet, dient zur Bearbeitung der Variable "Matinee Data", dem Kreis, der dem Matinee beim Erstellen automatisch angehängt wurde.

Rechtsklickt nun auf das leere Feld unter den Knöpfen "All", "Cameras", "Skeletal Meshes" und fügt eine neue leere Gruppe hinzu ("Add New Empty Group").

kismetanf11.jpg

Gebt der Gruppe einen Namen, z.B. Fahrstuhl.

Rechtsklickt dann auf die entstandene Gruppe und fügt einen "Movement Track" hinzu ("Add New Movement Track").

Wenn ihr eich jetzt den Kismet-Editor anseht, werdet ihr feststellen, dass euer Matinee einen neuen, rosanen Connector mit dem Namen Fahrstuhl erhalten hat, der mit einem rosa Kreis verbunden ist. Dieser Kreis ist eine Variable, die euren Fahrstuhl repräsentiert. Eure Gruppe mit dem Movement Track bezieht sich nun auf euren InterpolateActor. Dazu später mehr.

Zurück zum Matinee-Editor.
Richtet eure Fenster am besten so ein, dass ihr den Matinee-Editor und eure Viewports gleichzeitig sehen und bearbeiten könnt.
Beachtet nun das kleine, rote Dreieck rechts neben "Movement".

kismetanf12.jpg

Dieses Dreieck ist ein Keyframe. Jedem Keyframe kann (in einem Movement Track) eine Position und Rotation zugewiesen werden. Um einen weiteren Key hinzuzufügen, setzt den Marker...

kismetanf13.jpg

... nach rechts, am besten bis zum rechten Rand der Timeline, auf der er sich befindet, und klickt dann oben rechts im Fenster auf "Key hinzufügen":

kismetanf14.jpg

Markiert nun per Klick den neuen Key. Jetzt kommt der wichtige Schritt:
Bewegt bei markiertem zweiten Key euren Fahrstuhl nach oben.

kismetanf15.jpg

Schließt nun den Matinee-Editor, speichert die Map und buildet.

Dann könnt ihr eure Map testen.

Ein wenig sollte man aber meistens noch ändern.
Hier gibt es ein paar Einstellungen zu sehen, die ihr ändern solltet, weil euer Actor sonst schwarz bleibt und keine Schatten wirft.

 


Kapitel 3 - Theorie-Stunde: Variablen und Connectors
So, nun folgt ein kleiner theoretischer Teil, und zwar zum Thema Variablen.

Wie gesagt, Variablen sind immer in Kreisen zu sehen.
Hinzufügen ist ganz einfach:

kismetanf17.jpg

Variablen können alles mögliche sein, hier erstmal die für den Anfang wichtigsten:
- Bool[ean] (rot, "Logischer Wert"): Kann "Ja" oder "Nein" sein ("true" oder "false")
- Float (blau, "Gleitkommazahl"): Stellt eine Zahl mit Nachkommastellen dar.
- Int[eger] (türkis, "Ganzzahl"): Stellt eine Zahl ohne Nachkommastellen dar
- Matinee Data (orange): wird automatisch mit einem Matinee erzeigt und enthält alle seine Daten (Groups, Keyframes, etc.)
- Object (rosa): Repräsentiert ein Objekt. Objektvariablen werden z.B. an ein Matinee gehängt, damit dieses weiß, welches Objekt es überhaupt bewegen soll.

Variablen unterscheiden sich von ihrer Handhabung ziemlich von andern Objekten in Kismet.
Abgesehen davon, dass Variablen nichts tun, außer Werte zu beinhalten, haben sie keine Connectors. Dennoch kann man Variablen mit Pfeilen versehen.
Einfach den Kreis selbst anklicken und den Pfeil "wohin" ziehen. Oder beim anderen Ende des geplanten Pfeils anfangen.

Euch ist sicher schon aufgefallen, dass die Connectors, z.B. beim Matinee, unterschiedliche Farben haben.
Das hat natürlich eine Bedeutung. Ein rosa Connector "will" mit einer rosa Variable (also einer Objektvariable) verbunden werden, und bei allen anderen Farben ist es genau so.
Schwarze Connectoren sind dagegen zum verbinden mit anderen Action- oder Event-Objekten.

Der Inhalt einer Variable lassen sich bearbeiten, indem ihr die Variable markiert und unten im Kismet den Wert "xValue" verändert. x ist dabei von Variablentyp zu Variablentyp anders (b für bool, obj für Object, etc.)

Jetzt noch eine spezielle (und praktische) Art, Objektvariablen hinzuzufügen:
Fügt man eine Objektvariable einfach so hinzu, dann ist sie leer.
Die Programmierer unter euch kennen das (nil in Pascal, Null in Java,...).
Wenn ihr jetzt nicht jedes Mal eine leere Variable hinzufügen und danach ein Objekt zuweisen wollt, gibt es eine enfache Methode!
Markiert das (oder die) Objekt(e), von denen ihr (je) eine Variable haben wollt, öffnet Kismet, rechtsklickt und wählt "New Object Var using [Euer Objekt]", und schon habt ihr eure neue(n) Variable(n), gleich mit dem richtigen Objekt darin.

Mit diesem Wissen über Connectoren könnt ihr jetzt das nächste Kapitel problemlos durchgehen.

 


Kapitel 4 - DM-KTest2 - Triggerei
Wollen wir jetzt ein wenig komplexere Sachen bauen.
Ladet also KBasis wieder und speichert unter "DM-KTest2".
Zuerst schnappen wir uns einen Trigger.

(Nur sicherheitshalber :wink: )
kismetanf18.jpg

Jetzt finden wir mal etwas lustiges, was sich Triggern lässt... Wie wärs mit einer Falltür?
Ein bisschen mappen, ein kleines Matinee... siehe eine der vorherigen Kapitel.
Fertig sieht das bei mir so aus:

kismetanf19.jpg

"Trigger auf Falltür". Natürlich geht auch überall anders.

Jetzt kommt ein Tipp!
Mehrere Objekte mit einem Matinee bewegen
Ein Matinee kann viele Objekte gleichzeitig auf viele verschiedene Arten bewegen.
Ihr könnt z.B. mehrere Groups mit Movement-Tracks erstellen. Für jede Group erhält das Matinee einen rosa Connector.
kismetanf20.jpg

Außerdem könnt ihr jede Menge Objekte gleichzeitig an eine Gruppe (bzw. an den rosa Connector) anbinden.
Genau das habe ich hier gemacht, denn meine Falltür besteht aus 4 InterpolateActors:

kismetanf21.jpg

Denkt beim hinzufügen zusätzlicher Objektvariablen an das vorherige Kapitel.

Jetzt lernt ihr ein neues Objekt kennen. Er ist ein Event mit dem Namen "Touch".
Dieses Event hat immer ein Objekt zugewiesen (assigned).
Wenn der Touch-Wert der Kollision dieses Objekts sich ändert, dann wird dieses Event ausglöst.
Um das etwas zu verdeutlichen, schaltet in eurem 3D-Viewport "Collision" an (c drücken) und betrachtet euren Trigger. Ihr seht nun den Kollisionsradius des Triggers.
kismetanf22.jpg

Die Maße davon lassen sich in den Eigenschaften des Triggers verändern (Trigger.Trigger.CylinderComponent.CollisionRadius und -CollisionHeight).

Wenn ihr die Kollisionseigenschaften des Triggers betrachtet (Trigger.Collision.CollisionType), dann werdet ihr wahrscheinlich sehen, dass dieser auf "Collide_TouchAll" gestellt ist.

Wenn bei diesen Einstellungen ein Spieler oder ein Schuss in den Kollisionsbereich des Triggers eindringt, wird "Touch" true (wahr), und wenn es wieder draußen ist, false (falsch).

Fügt nun erst einmal das Touch-Event hinzu. Die einfachste möglichkeit dazu ist das markieren des Triggers im Editor, das anschließende öffnen von Kismet, und dann: rechtsklick => "New Event using Trigger_0" (oder wie auch immer der Trigger heißt) => "Touch".

Nun seht ihr das Event.
Verbindet jetzt noch den "Touched"-Connector mit dem "Play"-Connector des Matinees, und voilá:
kismetanf23.jpg

Was nun also passiert:
"Touched" der Kollision des Triggers wird auf True gesetzt. Dadurch wird das Ereignis "Touched" des Events "Touch" ausgelöst, und was immer ihr an den Connector ranknallt, es passiert. also löst der getouchte Trigger das Matinee aus.

Und jetzt: Speichern, Builden, Testen!

 


Kapitel 5 - Ein wenig Objektkunde (Gate und Delay)
Ich möchte euch nun ein paar weitere Objekte vorstellen:

Das Gate und das Delay.

kismetanf24.jpg

Befassen wir uns zuerst mit dem Gate.

Der Name (Gate=Tor) ist gut gewählt, denn es erfüllt genau die Funktion eines solchen.
Das Tor kann geschlossen und geöffnet werden, und es kann etwas durchgeschickt werden.

Stellt euch als Beispiel für die Anwendung eines Gates eine Map vor, in der er zwei Trigger gibt:
Man muss erst den einen aktivieren und dann den anderen, dann passiert etwas.
Das passende Kismet dazu sieht so aus:

kismetanf25.jpg

Was passiert nun?
Wie ihr über dem Gate-Objekt sehen könnt, ist "bOpen=FALSE". Das bedeutet, dass das Tor am Anfang geschlossen ist (TRUE wäre also offen).
Trigger_1 (der untere) versucht bei jeder Berührung, einen Pfeil durch das Tor zu schicken (durch den Eingang, also "In", versteht sich), stößt dabei aber nur gegen die geschlossene Tür.

Was kann man nur tun? Richtig, das Tor öffnen. Wenn Trigger_0 berührt wird, dann löst er "Open" aus, und, na klar, schon ist das Tor auf.
Der nächste Pfeil, den Trigger_1 schickt, kommt durch, also beim Ausgang ("Out") wieder aus dem Tor heraus.
Verbindet den "Out"-Connector mit einem Action-Objekt oder einem Matinee, und schon ist der gewünschte Effekt kreiert.

Der "Toggle"-Connector ändert blind den Status des Tors, aus auf wird zu und umgekehrt.

Die Eigenschaft "bOpen" lässt sich, wie der Wert einer Variable, in den Eigenschaften ändern (unten im Kismet-Editor, wenn ihr das Gate markiert).

Und jetzt das Delay.

Ein Delay (engl.: Verzögerung) wartet, nachdem es ausgelöst wird, eine bestimmte Zeit, und löst dann etwas anderes aus. An den "Duration"-Connector könnt ihr eine Float-Variable anhängen. Der Wert dieser Variable wird dann die Zeit in Sekunden, die das Delay wartet.

Ein einfaches Beispiel für die Verwendung des Delays:

kismetanf26.jpg

Was hier passiert:
Trigger_0 wird berührt, das Delay wird gestartet. Nach fünf Sekunden Löst dann das Delay das Matinee aus.
Stop, Pause und Aborted erklären sich von selbst.

 


Kapitel 6 - Mit Variablen arbeiten
Variablen hinzufügen ist ja schön und gut, aber so richtig cool wird das ganze erst, wenn man die Dinger während des Spiels verändert und vielseitig benutzt.
Die Instrumente dafür sind:
- Conditions: Sie vergleichen eine Variable mit einem Wert.
hinzufügen: Rechtsklick => New Condition

- Comparisons: Eine Untergruppe der Conditions, sie vergleichen zwei Variablen miteinander.
hinzufügen: Rechtsklick => New Condition => Comparison

- Math: Eine Reihe von Operationen, um Zahlen (Int oder Float) mit einfachen Rechnungen zu verändern.
hinzufügen: Rechtsklick => New Action => Math

- Set Variables: Actions zum brachialen Überschreiben eines Wertes durch einen anderen.
hinzufügen: Rechtsklick => New Action => Set Variable

Hier ein Beispiel für Operationen mit Variablen:

kismetanf27.jpg

Was passiert hier?
Jedes Mal, wenn "Trigger_0 Touch" ausgelöst wird, vergleicht "Compare Int" den Zähler mit "5". Wenn der Zähler kleiner sein sollte (A < B), dann löst "Compare Int" die Action "Add Int" aus.
Diese nimmt sich zwei Int-Variablen (A und B), addiert diese und schreibt das Ergebnis in die Variable, die mit dem "IntResult"-Connector verbunden ist, in diesem Fall dem Zähler.

Das Ergebnis: Bei jedem Trigger-getouche steigt Zähler um "1", bis er 5 erreicht.
Dann wird fortan das ausgelöst, was mit "A == B" verbunden ist.
Man muss also 5 Mal den Trigger berühren, bis irgendwas passiert. Arbeit!!

 


Kapitel 7 - Kleinigkeiten
Jetzt folgen noch ein paar Kleinigkeiten, die das Arbeiten mit Kismet sehr vereinfachen können.

1. Erstellt Sequenzen!
Wenn ihr im Kismet-Editor herauszoomt und euch ein wenig umschaut, werdet ihr feststellen, dass der Bereich, in dem ihr

arbeitet, begrenzt ist und ab einer bestimmten Anzahl an Objekten recht unübersichtlich wird.
Dagegen ankommen könnt ihr durch das erstellen von Sequenzen.
Die Vorgehensweise ist einfach: Rechtsklick => "Create New Sequence [...]".
Ihr erhaltet dann ein kleines Blaues Kästchen, dem Ihr einen Namen verpassen könnt.
Ihr könnt diese Sequenz dann erreichen, indem ihr entweder auf die Box oder unten rechts in der Liste auf den Namen

doppelklickt.
Ihr habt innerhalb einer Sequenz nun eine vollwertige, neue Kismet-Umgebung.

2. Erstellt Kommentare!
Kommentare erstellen ist auch sehr einfach. Rechtsklick => "New Comment".
Namen eingeben, und schon steht der Kommentar da. Wirklich nützlich werden sie aber erst in Form einer Box. Setzt dazu die

Eigenschaft "bDrawBox" auf True (Häkchen setzen) und zieht die Box mit der unteren rechten Ecke schön groß.

Mit Kommentarboxen lässt sich alles schön einteilen:
kismetanf28.jpg

(Bei größerem Gewusel natürlich noch weitaus praktischer.)

DAS WAR'S!
Ich hoffe, ich konnte euch weiter helfen.