Dieser Leitfaden richtet sich an Personen, die noch nie oder kaum mit Programmieren in Berührung gekommen sind. Es wird Ihnen beim Schreiben Ihrer ersten einfachen Skripte in Space Engineers helfen. Wenn Sie nach einem erweiterten Leitfaden suchen, empfehle ich diese hier. von Malware.
Haftungsausschluss
Englisch ist nicht meine Muttersprache, also erwartet bitte kein sprachliches Meisterwerk. Außerdem habe ich nie Codieren/Programmieren gelernt und mein Wissen durch Google-Recherche und nervende Freunde mit dummen Fragen zum Codieren in C# aufgebaut. Daher kann dieser Leitfaden falsche Begriffe oder kleinere Fehler enthalten. Aber ich bin mir sicher, dass dieser Leitfaden es jedem ohne Kenntnisse über Skripterstellung ermöglichen wird, einfache Skripte für Weltraumingenieure zu erstellen.
Beispielskript
Ich denke, der beste Weg, Skripting in Space Engineers zu lernen, ist anhand von Beispielen. Wir werden einen Rotor in diesem ersten zu einem bestimmten Punkt bewegen lassen.
Zu Beginn müssen wir dem Spiel mitteilen, welchen Block wir ansprechen wollen. Wir speichern den Block in einer Variablen, um das Skript besser lesbar zu machen. Lassen Sie uns daher eine Variable für unseren Rotor erstellen:
Jede Variable benötigt einen Typ („MyMotorStator“) und einen Namen („Rotor“). Der Typ gibt an, welchen Wert wir in die Variable speichern können. Dieser Wert kann eine Zahl oder nur Text sein, aber in unserem Fall ist es ein Rotorblock. Der Typ dafür ist „MyMotorStator“. Wir können einfach einen beliebigen Namen wählen, aber es wird empfohlen, einen zu wählen, der das Skript leicht lesbar und verständlich macht, insbesondere wenn es komplexer wird.
Jede Codezeile (wie ein Satz) benötigt ein Semikolon „;“ an seinem Ende. Dies ist leicht zu vergessen, aber nur ein fehlendes Semikolon führt dazu, dass das gesamte Skript nicht wie beabsichtigt funktioniert.
Jetzt geben wir der Variablen ihren Wert: Der Rotorblock. In unserem Fall sagen wir einfach, dass der Rotorblock "Super Mega Station Rotor" heißt.
Der Typ wird nur erwähnt, wenn wir zum ersten Mal eine Variable erstellen. Um einer Variablen einen Wert zu geben, verwenden wir einfach das Symbol „=“.
Dieser Teil ist die Methode, um den Block in unserem Raster zu adressieren. Wir schreiben einfach den genauen Namen des Blocks zwischen die beiden „“. Kümmere dich nicht zu sehr um den Text, wir kommen später darauf zurück. Am Ende schreiben wir den Typ noch einmal, um sicherzustellen, dass der Block, der unserer Variablen zugewiesen wird, den richtigen Typ hat. Wenn Sie dies vergessen und es beispielsweise ein LCD-Panel mit dem Namen „Super Mega Station Rotor“ gibt, wird es der Variablen zugewiesen. Dies mag nicht notwendig klingen, aber verwenden Sie es einfach, um ein sichereres Skript zu haben.
Jedes Mal, wenn wir jetzt die Variable 'Rotor' in unserem Skript verwenden, adressiert das Spiel unseren Rotorblock.
Lassen Sie uns jetzt den Rotor zu einem bestimmten Punkt bewegen. Wir möchten, dass es sich mit einer positiven Geschwindigkeit um 45 Grad dreht. Also müssen wir 2 Dinge tun. Die erste besteht darin, den maximalen Winkel auf 45 Grad einzustellen. Die zweite besteht darin, dem Rotor seine Geschwindigkeit zu geben.
Beginnen wir mit Schritt eins:
Zuerst teilen wir dem Spiel mit, dass wir den Rotorblock verwenden wollen. Dann schreiben wir ein „.“ und fügen Sie die Eigenschaft oder Methode hinzu, die wir verwenden möchten. Diese Eigenschaft benötigt einen Wert, um die maximale Rotorgrenze festzulegen. Also schreiben wir „45“. Das „f“ ist der Typ des Werts (in diesem Fall eine Zahl, aber darauf komme ich später zurück)
Kommen wir zur Velocity-Einstellung. Das funktioniert ganz ähnlich, nur die Eigenschaft ist anders. Wir setzen die Geschwindigkeit in diesem Fall auf 1.
Und das ist es. Sobald das Skript ausgeführt wird, dreht sich der Rotor mit 1 U / min, bis er 45 Grad erreicht.
Das ganze Skript würde so aussehen:
Ich fasse es zusammen:
Zuerst speichern wir die Blöcke in einer Variablen, um ein besser lesbares Skript und eine einfachere Verwendung zu haben. (Man könnte es auch einfach so schreiben:
Aber ich denke, es ist offensichtlich schöner, stattdessen Variablen zu verwenden.
Dann können wir Eigenschaften und Methoden verwenden, um die Einstellungen der Blöcke zu ändern.
Die Grundlagen, die zum Programmieren in Space Engineers benötigt werden
Keine Sorge, Sie müssen sich nicht sofort an alles erinnern, was hier aufgelistet ist, ich werde ein Kapitel mit einer Liste von allem, was Sie brauchen könnten, hinzufügen. Aber in diesem Teil werde ich versuchen, diese grundlegenden Dinge zu erklären, die für fast jedes Skript benötigt werden.
„//“ und „/* */“ kennzeichnen Kommentare in Ihrem Skript. Diese werden bei der Ausführung ignoriert. Das heißt, Sie können etwas erklären oder Ihrem Code einfach eine Überschrift geben. Das vorangestellte „//“ gilt für die aktuelle Zeile und „/* */“ umschließt den Kommentar. Kommentieren hilft beim Verständnis eines Drehbuchs und sollte nicht unterschätzt werden.
Mathematische und logische Operatoren
Beginnen wir mit einfachen mathematischen und logischen Operatoren. Das sollte ein Kinderspiel werden
Ich liste nur die wichtigsten auf.
„+“: Ergänzung
„-“: Subtraktion
„*“: Multiplikation
"/": Aufteilung
„%“: Modulo; Dadurch wird der Rest einer Division zurückgegeben. Beispiele: (5 / 2 = 2; Rest = 1) => 5 % 2 = 1; 7 % 4 = 3;
„==“: Gleich; dies wird zum Vergleichen von Werten verwendet.
„!=“: Ungleich; im Grunde das Gegenteil von „==“.
„>“, „>=“, „<“, „<=“: Größer/kleiner als (oder gleich); Wird auch zum Vergleichen von Werten verwendet.
"&&": Und; alle damit verbundenen Variablen müssen in Ihrem Vergleich übereinstimmen
„||“: Oder; mindestens eine der damit verbundenen Variablen muss in Ihrem Vergleich übereinstimmen
„=“: In Skripten wird dies hauptsächlich verwendet, um Werte zuzuweisen.
Variablentypen
Fahren wir mit den Variablentypen fort:
„bool“: Dieser Variablentyp kann nur einen dieser beiden Werte haben: Er ist entweder „true“ oder „false“.
„string“ : Dies ist nur einfacher Text. Ein Beispiel wäre das Speichern von Text in einer Variablen, um ihn später auf einem LCD-Bildschirm anzuzeigen.
„int“ : Dies ist eine Zahl ohne Nachkommastellen. Der Wert wird nicht gerundet; stattdessen werden alle Nachkommastellen einfach abgeschnitten. Eine als „int“ gespeicherte 4.9 ist 4.
„float“ : Dies ist auch eine Zahl, hat aber Nachkommastellen.
„doppelt“: Die dritte Nummernart. Es ist ähnlich wie „float“, aber die Zahl kann größer sein. Dies wird für grundlegendes Scripting nicht so wichtig sein. Ich würde empfehlen, Float zu verwenden, es sei denn, eine Methode erfordert Double als Eingabe. Wenn Sie in Ihrem Skript einen Zahlenwert zuweisen, wird dieser normalerweise als „doppelt“ behandelt. Um als „Float“ behandelt zu werden, müssen Sie ein „f“ hinter die Zahl schreiben, z. B. „4.9f“.
„IMyMotorStator“: Das sollte Ihnen bekannt vorkommen. Es ist ein Blocktyp von Space Engineers. Es gibt viele verschiedene und wir werden es vorerst ignorieren.
Um eine Variable zu initialisieren (anzulegen), schreiben wir einfach den Typ und den Variablennamen und enden mit einem Semikolon:
Wir können ihm danach einen Wert geben:
Wir können diese beiden Schritte auch gleichzeitig ausführen:
Es kann mit den drei Zahlentypen „int“, „float“ und „double“ gerechnet werden.
Wichtig: Das Speichern einer Zahl in einem „String“ funktioniert, aber Sie können keine mathematischen Operatoren darauf anwenden, da sie als Text angesehen wird. Man kann sich das wie das Rechnen mit Buchstaben vorstellen.
Fortgeschrittene logische Operatoren
Ich gehe davon aus, dass ich nicht erklären muss, wie das grundlegende Wahr/Falsch-Logiksystem funktioniert. Aber wenn jemand dabei Hilfe braucht, einfach einen Kommentar schreiben.
Lassen Sie uns die Verwendung von fortgeschritteneren logischen Operationen erklären.
If-Funktion
Beginnen wir mit der „if-Funktion“. Es vergleicht 2 Parameter und führt den enthaltenen Code nur aus, wenn der Vergleich richtig/wahr ist. Ich denke, der einfachste Weg, es zu erklären, ist wieder anhand von Beispielen.
Nehmen wir an, wir haben einen bereits rotierenden Rotor und wenn er bei 30 Grad ist, sollte ein Licht angehen.
Wie in unserem ersten Skript beginnen wir damit, unsere Blöcke in Variablen zu speichern.
Beginnen wir mit der „if-Funktion“.
Das ist der Kopf. Das Argument wird zwischen das „()“ geschrieben. Für diese Eigenschaft muss der Winkel in Radiant sein. 0.5236 rad in Grad umgerechnet ist 30.
Das ist der Körper. Es enthält den Code zwischen dem „{}“. Es umschließt einen Codebereich, der zu der davor geschriebenen Funktion gehört.
Zuerst prüft diese Funktion, ob das Argument in „()“ wahr ist, und führt dann den Code zwischen „{}“ aus, wenn das Argument korrekt ist. Wenn nicht, wird der Code zwischen dem „{}“ ignoriert.
Wir können die „if-Funktion“ auch mit einem „else“ „aufwerten“. Dies ermöglicht es uns, Code auszuführen, falls das Argument falsch ist. Wenn die Aussage in der „if-Funktion“ wahr ist, wird das „else“ ignoriert.
In diesem Beispiel möchten wir, dass das Licht ausgeschaltet wird, wenn der Rotor nicht auf 30 Grad steht.
Schließlich können Sie auch ein „if else“ hinzufügen. Es fungiert als „else“, hat aber auch eine Bedingung, die wahr sein muss, um seinen Code auszuführen. Nehmen wir an, wir möchten 4 Lichter in verschiedenen Farben haben und wir möchten, dass ein bestimmtes Licht für die vier Viertel des Rotorwinkels eingeschaltet wird.
Zuerst müssen wir Variablen für unsere neuen Lichter erstellen.
Beginnen wir mit dem Aufbau unserer „Wenn-Funktion“
Dies prüft, ob der Winkel 0 oder mehr, aber auch weniger als 90 Grad (1.571 rad) beträgt. Beide Bedingungen müssen erfüllt sein, damit die Aussage wahr ist. Wenn Sie den „Oder-Operator“ („||“) anstelle des „Und-Operators“ („&&“) verwenden würden, muss nur eine der Bedingungen wahr sein, damit die Aussage wahr ist.
Das grüne Licht geht an, alle anderen Lichter gehen aus.
Wir werden dies jetzt für die anderen Viertel wiederholen.
3.142 rad entspricht 180 Grad. Wir müssen nicht prüfen, ob er über 90 Grad liegt, da dieses „if else“ nur geprüft wird, wenn die „if“-Bedingung falsch ist und der Winkel somit über 90 Grad liegt.
4.712 rad entspricht 270 Grad.
Für den letzten Fall müssen wir kein „else if“ verwenden, weil die einzigen Winkel übrig bleiben, die wir ohnehin in unserer Bedingung haben wollen (270-360 Grad).
Schalter
Die nächste Funktion, die wir verwenden können, ist der „Schalter“. Es ist ziemlich ähnlich einer „wenn“ und „wenn sonst“ Konstellation, aber alle Ihre Bedingungen müssen auf nur einem Wert einer Variablen basieren. Außerdem kann man es nur mit einem „==“ vergleichen. Für unser letztes Beispiel würde es also nicht funktionieren, da wir für unsere Bedingungen „kleiner als“ („<“) brauchten.
Im folgenden Beispiel ändern wir es zu den Bedingungen, die ein exakter Winkel und keine Fläche sind. Nehmen wir also an, wir wollen 4 Fälle. 0, 90, 180 und 270 Grad. Jeder Winkel schaltet eines unserer Lichter ein und alle anderen aus.
Das ist der Kopf. Zwischen das „()“ wird der Wert geschrieben, den wir prüfen wollen. Dies kann natürlich auch eine Variable sein.
Der Winkel wird mit der „0“ verglichen. Das kann man sich wie ein „if (Rotor.Angle == 0)“ vorstellen.
Durch die Unterbrechung springt das Skript aus dem gesamten Schalter heraus, nachdem der richtige Fall gefunden wurde. Dies ist wichtig, um Ausführungszeit zu sparen, da keine Zeit für die Überprüfung aller anderen Fälle verschwendet wird.
Dies ist optional. Dieser Fall wird verwendet, wenn keine anderen Fälle die Bedingung erfüllen. In unserem Beispiel wird dies verwendet, wenn der Winkel zwischen 0, 90, 180 und 270 Grad liegt, aber keine dieser genauen Zahlen. Wir können zum Beispiel einfach alle Lichter ausschalten.
For-Schleife
Die vorerst letzte ist die „for-Schleife“. Es wird verwendet, um denselben Code für eine Gruppe von Variablen zu wiederholen. Um diese Gruppe von Variablen zu erstellen, müssen wir etwas über die „Liste“ lernen. Es erstellt eine Gruppe der Objekte, die Sie in die Liste aufgenommen haben; zum Beispiel alle Lichtblöcke auf einem Raster. Das Erstellen einer neuen Liste unterscheidet sich geringfügig vom Erstellen einer Variablen:
Wir haben eine Liste mit dem Namen „Lights“ erstellt. Außerdem benötigt die Liste einen Typ, was bedeutet, dass eine Liste keine Objekte eines anderen Typs enthalten kann. In diesem Fall ist unser Typ „IMyInteriorLight“. Dies ist die Art von Lichtblöcken in Space Engineers, aber Sie können auch eine Liste von Zahlen mit dem Typ „int“ erstellen.
Lassen Sie uns nun die Liste mit allen Lichtblöcken in unserem Raster füllen:
Dadurch werden alle Blöcke aus der Gruppe „Super Mega Station Lights“ in die Liste eingefügt, die zwischen dem „()“ am Ende genannt wird.
Um ein einzelnes Objekt in unserer Liste anzusprechen, verwenden wir diesen Ausdruck: „Lights[0]“. Jedes Objekt in der Liste hat eine Nummer, auf die es reagiert. Diese beginnt beim ersten Objekt immer bei „0“ und wird hochgezählt. Wenn Sie eine Liste mit 20 Objekten erstellen, reagiert das erste Objekt auf „0“ und das letzte auf „19“. Die zwischen den „[]“ geschriebene Nummer adressiert das einzelne Objekt. Um das dritte Licht einzuschalten, würden wir es so schreiben:
Die Liste ist eingerichtet, also fahren wir mit der „for-Schleife“ fort:
Das ist der Kopf. Zwischen dem „()“ haben wir 3 verschiedene Parameter, die durch ein Semikolon getrennt sind. Die erste („int i = 0“) erstellt eine Variable namens „i“ mit einem Wert von „0“. Der dritte („i++“) fügt einfach jedes Mal, wenn die Schleife ausgeführt wird, „1“ zu unserer Variablen „i“ hinzu. Der zweite Parameter („i < Lights.length“) definiert, wann die Schleife enden soll. Das bedeutet, dass die Schleife ausgeführt wird, solange „i“ kleiner als ein bestimmter Wert ist. Wenn Sie „i < 20“ schreiben würden, würde die Schleife nur 20 Mal ausgeführt werden. In dieser Situation habe ich Lights.length verwendet, was uns die Anzahl der Objekte gibt, die die Liste „Lights“ enthält. Das bedeutet im Grunde, dass die „for-Schleife“ so oft ausgeführt wird, wie die Anzahl der Objekte in unserer Liste.
Dies ist der Rumpf der „for-Schleife“. Durch die Verwendung der Variable „i“ beginnen wir mit dem ersten Objekt („0“) in unserer Liste. Da wir bei jeder Schleife „1“ zu „i“ addieren, gehen wir auch in unserer Objektliste um 1 weiter. Am Ende der „for-Schleife“ ging also jedes Licht auf der Liste an.
Diese erweiterten logischen Operatoren sollen Ihnen beim Erstellen Ihrer eigenen Skripte helfen.
Eigenschaften und Methoden
Dies könnte einer der schwierigsten Schritte für einen Anfänger sein. Es gibt eine riesige Menge verschiedener Blöcke in Space Engineers und somit gibt es viele verschiedene Blocktypen, Methoden und Eigenschaften. Wenn Sie den Unterschied zwischen Eigenschaften und Methoden wissen wollen, müssten Sie jemand anderen fragen, da ich es nicht wirklich weiß, aber das spielt keine Rolle.
Der beste Weg, mit ihnen zu arbeiten, ist, alles hier nachzuschlagen
[github.com]während Sie etwas skripten. Großes Lob an Malware, die es erstellt hat. Dort finden Sie alle Blocktypen und ihre Methoden und Eigenschaften (im Grunde, was Sie mit dem Block machen können). Es gibt ein paar Dinge, die Sie wissen müssen, um diese zu verwenden.
Um eine Eigenschaft/Methode zu verwenden, müssen Sie Ihre Blockvariable schreiben und dann ein „.“ hinzufügen. und schreiben Sie dann Ihre Eigenschaft/Methode.
Die meisten Eigenschaften können einen Wert entweder abrufen oder festlegen (einige erhalten nur Werte). Sie entscheiden dies, indem Sie ihm entweder einen Wert zuweisen, indem Sie so etwas wie „= Wert“ hinzufügen, oder nicht. Hier sind zwei Beispiele, um Ihnen eine Vorstellung davon zu geben, wie das funktioniert:
Einen Wert ermitteln:
Dies speichert den Winkel in unsere Variable „Winkel“.
Wert festlegen:
Dadurch wird die Rotorarretierung aktiviert.
In der Anleitung sehen Sie auch, welchen Typ die Eigenschaft/Methode zurückgibt oder als Input benötigt. Dies ist sehr wichtig. Die Eigenschaft „RotorLock“ benötigt ein „bool“, was bedeutet, dass sie nur „true“ oder „false“ als Ein- oder Ausgabe akzeptiert.
Schreiben Sie Ihr erstes Drehbuch
Wenn Sie den programmierbaren Block öffnen, sehen Sie Folgendes:
Die Funktionen „Programmieren“ und „Speichern“ ignorieren wir vorerst. Ihr gesamter Code wird zwischen den beiden „{}“ der „Main“-Funktion platziert. Dies ist der Teil, der ausgeführt wird, wenn das Skript verwendet wird. Wenn Sie das erste Skript vom Anfang dieser Anleitung implementieren würden, würde es so aussehen:
Ich rate Ihnen dringend, Ihre Skripte außerhalb von Space Engineers zu schreiben. Der beste Weg für mich ist die Verwendung von Visual Studio zusammen mit der Malware-Erweiterung. Es bietet viele Funktionen, die Sie beim Codieren lieben werden. Eine Anleitung zur Installation und Verwendung ist ebenfalls vorhanden
[github.com]im Malware-Handbuch.
Spickzettel
Mathematische und logische Operatoren:
"+"
"-"
"*"
"/"
"%"
„==“
„!=“
„>“, „>=“, „<“, „<=“
„&&“
„||“
"="
Werttypen:
„bool“: wahr/falsch
„Zeichenfolge“: Text
„int“: Zahl ohne Nachkommastellen
„float“: Zahl mit Nachkommastellen
„doppelt“: größere Zahl
„Liste“: Gruppe von Objekten
„IMyInteriorLight“: Beispiel für einen Blocktyp
Fortgeschrittene logische Operatoren:
Eigenschaften/Methoden:
Das ist alles, was wir heute dafür teilen Space Engineers führen. Dieses Handbuch wurde ursprünglich erstellt und geschrieben von 33iRobot33. Falls wir dieses Handbuch nicht aktualisieren, finden Sie das neueste Update, indem Sie diesen folgen Link.