Skyrim:Unterschiede zur vorherigen Scripterstellung

Aus Skript-Wiki
Version vom 16. Februar 2012, 22:38 Uhr von Keris (Diskussion | Beiträge) (Die Seite wurde neu angelegt: =='''Was ist neu?'''== Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch ...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Was ist neu?

Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch die Einführung erweiterter Funktionalität und flexibilität gibt es jedoch viele signifikante Änderungen in Syntax und Workflow sowie gelegentlich in der Funktionalität. Diese Seite ist für Leute, die mit den Konzepten eine Scriptsprache vertraut sind und ein bischen darüber wissen, was Pypyrus ist. Falls das für dich nicht zutrifft, lies bitter erst die Einführung in Papyrus.

Eine technisch und detailierte Erkläfung der neuen Scriptsprache bietet die Papyrus Sprachreferenz.

Neue Konzepte

Die neue Scriptsprache bietet mehr möglichkeiten. Dies bedeutet, dass die Menge dessen, was du über die neue Scriptsprache wissen musst, anwachsen wird. Auf der Habenseite steht, dass bestimmte Ergänzungen der Scriptsprache dafür sorgen, dass Dinge viel schneller und leichter zu machen sind. Unter diesen neuen Ergänzungen sind es eigene Funktionen zu machen, die Möglichkeit, Timer zu nutzen, Schleifenlogik und Zustand, die Möglichkeiten zur Vereinfachung des Lebens. Ich selbst habe es als so empfunden, dass es beim Scripten einfacher ist, geradlinig zu denken. Es gibt viel weniger Rück- und Vorwärtssprünge zwischen GameMode und anderen Ereignissen. Ich finde, das ich ebenfalls weniger Variablen verfolgen und enable/disablen muss.

Ersetzen des GameModes
Timer

Im alten System bedeutete ein Event (Ereignis) ablaufen zu lassen, dass das gesamte Script sofort und vollständig durchlaufen wurde. Wenn man nicht wollte, dass Teile des Scripts durchlaufen wurden, wurden If-Anweisungen gebraucht, mit deren Bedingungen dann Teile des Scripts ausgeklammert wurden. Wenn du Teile des Scripts später laufen lassen wolltest, musstest du mit einer Bedingung einen Timer GameMode-Block „anstellen“ getSecondsPassed laufen lassen, bis dann ein anderer Abschnitt des Scripts laufen konnte.

Im neuen Systen kannst du latente Funktionen nutzen (so wie die Wait() Funktion), um das Scipt zeitweise pausieren zu lassen. Wenn die Pause vorbei ist (das wird üblicherweise irgndewon von dir definiert) wird das Script wieder anfangen zu laufen und an genau an der unterbrochenen Stelle weitermachen.

Einige latente Funktionen: <tesscript>

wartet 5.1 Sekunden

Wait( 5.1 ) </ tesscript >
<tesscript >

Dies spielt eine Animation und wartet dann auf ein Animations-Event um fortzusetzen
Dies Animations-Event wird durch die Havok-Verhaltensweise des Akteurs ausgelöst.

PlayAnimationAndWait( "AnimationName", "EventName" ) </tesscript >

Beachte bitte, dass du die Utility-Library am Anfang deines Scripts importieren musst, <tesscript > import utility </tesscript > wenn du Wait() benutzen willst.


Ersatzweise kannst du

< tesscript> utility.Wait(5.1) </tesscript >

ohne etwas zu importieren eingeben.


♥ und danke an unsere Freunde bei Bethesda für solche ein wunderbares Spiel und beeindruckendes Creation Kit!


• Hinweis: du kannst Libraries Game and Debug ebenfalls laden, so dass du zum Beispiel nur getplayer() und messageBox("happy msg") statt game.getPlayer() und debug.messageBox eingeben musst.


Schleifen

Im alten System konntest du eine Schleife konstruieren, indem du eine Reihen von IF-Anweisungen machtest und einen Zähler inkrementell änderst, bis eine bestimmte Bedingung (üblicherweise, indem der Zähler gebraucht wird) nicht mehr länger wahr ist.. Im neuen System kann man Schleifen-Anweisungen innerhalb jedes gewünschten Events nutzen (bisher ist ein „While“ implementiert). Solange der dem While folgende Ausdruck wahr ist, läuft die Schleifen.

<tesscript> While counter <= 100  ;mache etwas 100 mal

    ...
    counter += 1        ;Kurzform für "counter = counter + 1"

EndWhile </tesscript >


OnUpdate

OnUpdate ist ein Event, dass an deine „Form“ gesendet wird, wenn und nur dann wenn es angefragt ist. Es wird in regelmäßigen Abständen gesendet, die von dir definiert werden (vergleichbar wie der Gamemode-Block bei Quests mit der Delay-Option arbeitet). Beachte, dass jedes Script, welches mit der Form verbunden ist, Update-Events empfängt. Wenn z.B. dein Queststage-Fragment für Updates angemeldet ist, empfängt dein Questscript ebenfalls die Update-Events. Damit deine Form beginnt, Update-Events zu empfangen, muss es dafür eingetragen werden.

<tesscript > RegisterForUpdate(10.0) ;frage alle 10 Sekunden nach Updates </tesscript > Wenn du nicht länger Updates empfangen möchtest, melde dich ab: <tesscript > UnregisterForUpdate() </tesscript > Wenn du ändern möchtest, wie oft dir Updates gesendet werden, melde dich einfach mit der neuen Zeitspanne neu an.

Bitte schau in der OnUpdate-Beschreibung nach, denn dort befinden sich einige Warnungen, von denen ein Scripter Kenntnis haben sollte.

Ein Script durchläuft mehrere Instanzen des selben Events

Events, wie OnActivate, liefen in einem einzigen Frame. Nach der Einführung von Multithreading, Schleifen und latenten Funktionen wie Wait(), kann das Abarbeiten eines einzelnen Events eine längere Zeit dauern. Das führt zu der Frage: „was passiert, wenn ich ein OnTriggerEnter-Event auslöse, bevor die Abarbeitung des vorherigen OnTriggerEnter-Event erledigt ist?“ Es stellt sich heraus, dass es einem einzigen Script möglich ist, mehrfache Instanzen eines einzelnen Events abzuarbeiten. Um dies zu vermeiden, kannst du Status- oder Control-Variablen benutzen, um zu ändern oder abzuschalten, was passiert, wenn ein Event aufgerufen wird, bevor die Abarbeitung einer anderen Instanz des selben Events abgearbeitet ist.

Keywords

Es gibt ein paar Keywords (Schlüsselwörter), die aus dem einen oder anderen Grund sinnvoll sind.

  • None - dies kennzeichnet eine Referenz, die im Prinzip leer ist.

<tesscript> refVariable01 = GetLinkedRef() if refVariable01 != None

   ;mache etwas mit refVariable01 weil GetLinkedRef() etwas zurück gegeben hat

endif </tesscript>

  • Self - eine Variable, die auf die derzeitige Instanz des Scripts verweist. Es ist mit der getself-Funktion aus der alten Scriptsprache vergleichbar nur gibt es die Referenz des Scripts und nicht die Referenz des Objekts, auf dem das Script läuft.
  • Parent - ein besonderes Keyword, das man beim Aufruf einer Funktion benutzen kann, um sicher zu stellen, dass du die Funktion aufrufst, die als Funktion in einem Parent-Script definiert ist und nicht die Funktion im lokalen Script.
  • Hidden - verbirgt ein Script oder eine Property vor dem Editor
  • Conditional - markiert ein Script oder eine Variable als sichtbar für das Conditional-System. Beachte, dass das Script für alle Variablen innerhalb als conditional markiert sein muss, damit es sichtbar ist. Du darfst nur ein Conditional-Script zur Zeit mit einem Objekt verbinden.
  • True - wird für Boolesche Werte anstelle von 1 benutzt
  • False - wird für Boolesche Werte anstelle von 0 benutzt

Misc Stuff