Deze gids is bedoeld voor mensen die nooit of nauwelijks in aanraking kwamen met coderen. Het zal je helpen bij het schrijven van je eerste eenvoudige scripts in Space Engineers. Als u naar een geavanceerde gids zoekt, raad ik u aan deze van malware.
Disclaimer
Engels is niet mijn eerste taal, dus verwacht geen taalkundig meesterwerk. Ook heb ik nooit codering/programmering geleerd en heb ik mijn kennis opgebouwd via Google-onderzoek en vervelende vrienden met domme vragen over codering in C #. Deze gids kan dus verkeerde termen of kleine fouten bevatten. Maar ik ben er zeker van dat deze gids iedereen zonder enige kennis van scripts in staat zal stellen om eenvoudige scripts voor Space Engineers te maken.
Voorbeeldscript
Ik denk dat de beste manier om scripting in Space Engineers te leren, is via voorbeelden. In deze eerste zullen we een rotor naar een bepaald punt laten bewegen.
In het begin moeten we het spel vertellen welk blok we willen adresseren. We zullen het blok opslaan in een variabele om het script leesbaarder te maken. Laten we daarom een variabele maken voor onze rotor:
Elke variabele heeft een type (“MyMotorStator”) en een naam (“Rotor”) nodig. Het type vertelt welke waarde we in de variabele kunnen opslaan. Deze waarde kan een getal zijn of alleen tekst, maar in ons geval is het een rotorblok. Het type hiervoor is "MyMotorStator". We kunnen gewoon elke naam kiezen, maar het wordt aangeraden er een te nemen die het script gemakkelijk te lezen en te begrijpen maakt, vooral wanneer het complexer wordt.
Elke regel code (zoals een zin) heeft een puntkomma ";" nodig aan zijn einde. Dit is gemakkelijk te vergeten, maar slechts één ontbrekende puntkomma zorgt ervoor dat het hele script niet werkt zoals bedoeld.
Nu geven we de variabele zijn waarde: Het rotorblok. In ons geval zeggen we gewoon dat het rotorblok 'Super mega station rotor' heet
Het type wordt alleen genoemd als we voor het eerst een variabele maken. Om een variabele een waarde te geven, gebruiken we gewoon het symbool "=".
Dit deel is de methode om het blok in ons raster te adresseren. We schrijven gewoon de exacte naam van het blok tussen de twee "". Maak je niet al te druk over de tekst, daar komen we later op terug. Aan het einde schrijven we het type opnieuw om er zeker van te zijn dat het blok dat aan onze variabele wordt toegewezen, het juiste type heeft. Als u dit vergeet en er is bijvoorbeeld een LCD-paneel met de naam "Super mega station rotor", wordt het toegewezen aan de variabele. Dit klinkt misschien niet nodig, maar gebruik het gewoon om een veiliger script te hebben.
Elke keer dat we de variabele 'Rotor' in ons script gebruiken, adresseert het spel ons rotorblok.
Laten we de rotor nu naar een bepaald punt verplaatsen. We willen dat het met een positieve snelheid naar 45 graden draait. We moeten dus 2 dingen doen. De eerste is om de maximale hoek in te stellen op 45 graden. De tweede is om de rotor zijn snelheid te geven.
Laten we beginnen met stap één:
Eerst vertellen we het spel dat we het rotorblok willen gebruiken. Dan schrijven we een “.” en voeg de eigenschap of methode toe die we willen gebruiken. Deze eigenschap heeft een waarde nodig om de maximale limiet van de rotors in te stellen. Dus we schrijven "45". De "f" is het type van de waarde (in dit geval een getal, maar daar kom ik later op terug)
Laten we naar de snelheidsinstelling komen. Dit werkt vrij gelijkaardig alleen de eigenschap is anders. In dit geval stellen we de snelheid op 1.
En dat is het. Zodra het script is uitgevoerd, draait de rotor met 1 tpm totdat hij 45 graden bereikt.
Het hele script zou er als volgt uitzien:
Ik zal het samenvatten:
In eerste instantie slaan we de blokken op in een variabele om een beter leesbaar script te hebben en gemakkelijker te gebruiken. (Je zou het ook zo kunnen schrijven:
Maar ik denk dat het natuurlijk leuker is om in plaats daarvan variabelen te gebruiken.
Dan kunnen we eigenschappen en methoden gebruiken om de instellingen van de blokken te wijzigen.
De basis die nodig is voor codering in Space Engineers
Maak je geen zorgen, je hoeft niet meteen alles te onthouden wat hier staat, ik zal een hoofdstuk toevoegen met een lijst van alles wat je nodig zou kunnen hebben. Maar in dit deel zal ik proberen deze basisdingen uit te leggen die nodig zijn voor bijna elk script.
"//" en "/* */" markeren opmerkingen in uw script. Deze worden genegeerd wanneer ze worden uitgevoerd. Dit betekent dat je iets kunt uitleggen of gewoon een kop aan je code kunt geven. "//" vooraan geschreven werkt voor de huidige regel en "/* */" omsluit de opmerking. Commentaar geven helpt bij het begrijpen van een script en mag niet worden onderschat.
Wiskundige en logische operatoren
Laten we beginnen met eenvoudige wiskundige en logische operatoren. Dit moet een makkie zijn
Ik noem gewoon de belangrijkste.
“+”: Toevoeging
“-“: Aftrekken
“*”: Vermenigvuldiging
"/": Divisie
"%": modulair; dit zal de rest van een deling teruggeven. Voorbeelden: (5 / 2 = 2; rest = 1) => 5 % 2 = 1; 7 % 4 = 3;
"==": is gelijk aan; dit wordt gebruikt voor het vergelijken van waarden.
“!=": Niet gelijk; eigenlijk het tegenovergestelde van "==".
“>”, “>=”, “<“, “<=”: Groter/kleiner dan (of gelijk aan); Ook gebruikt voor het vergelijken van waarden.
"&&": En; alle variabelen die hiermee verband houden, moeten overeenkomen in uw vergelijking
“||”: Of; minimaal één van de variabelen die hiermee samenhangen moet overeenkomen in je vergelijking
“=": In scripts wordt dit voornamelijk gebruikt om waarden toe te kennen.
Variabele typen
Laten we doorgaan met variabele typen:
"bool": dit type variabele kan slechts één van deze twee waarden hebben: het is "true" of "false".
"string" : Dit is gewoon platte tekst. Een voorbeeld zou zijn om tekst op te slaan in een variabele om deze later op een LCD-scherm weer te geven.
“int” : Dit is een getal maar zonder decimalen. De waarde wordt niet afgerond; in plaats daarvan worden alle decimalen gewoon afgesneden. Een 4.9 opgeslagen als "int" is 4.
"float" : Dit is ook een getal, maar het heeft decimalen.
"dubbel": het derde soort nummer. Het is vergelijkbaar met "zweven", maar het aantal kan groter zijn. Dit is niet zo belangrijk voor basisscripts. Ik zou adviseren om float te gebruiken, tenzij een methode dubbel als invoer vereist. Als u een getalswaarde in uw script toewijst, wordt deze meestal als "dubbel" behandeld. Om als "zwevend" te worden behandeld, moet u een "f" achter het nummer schrijven, zoals "4.9f".
"IMyMotorStator": dit zou bekend in de oren moeten klinken. Het is een bloktype van Space Engineers. Er zijn veel verschillende en we zullen het voor nu negeren.
Om een variabele te initialiseren (maken), schrijven we het type en de naam van de variabele en eindigen we met een puntkomma:
We kunnen het hierna een waarde geven:
We kunnen deze twee stappen ook tegelijk uitvoeren:
Het is mogelijk om te rekenen met de drie getaltypes “int”, “float” en “double”.
Belangrijk: Het opslaan van een getal in een “string” werkt, maar je kunt er geen wiskundige operatoren op gebruiken omdat het als tekst wordt gezien. Je kunt het je voorstellen als rekenen met letters.
Geavanceerde logische operators
Ik ga ervan uit dat ik niet hoef uit te leggen hoe het fundamentele waar/onwaar logische systeem werkt. Maar als iemand daar hulp bij nodig heeft, schrijf dan gewoon een opmerking.
Laten we het gebruik van meer geavanceerde logische bewerkingen uitleggen.
Als-functie
Laten we beginnen met de "if-functie". Het vergelijkt 2 parameters en voert alleen de opgenomen code uit als de vergelijking correct/waar is. Ik denk dat de gemakkelijkste manier om het uit te leggen is opnieuw via voorbeelden.
Laten we zeggen dat we een rotor hebben die al draait en wanneer deze op 30 graden staat, moet er een licht gaan branden.
Net als in ons eerste script beginnen we met het opslaan van onze blokken in variabelen.
Laten we beginnen met de "if-functie".
Dit is het hoofd. Het argument is geschreven tussen de "()". Deze eigenschap heeft de hoek nodig om stralend te zijn. 0.5236 rad omgerekend in graden is 30.
Dit is het lichaam. Het bevat de code tussen de “{}”. Het omsluit een codegebied dat hoort bij de functie die ervoor staat.
Deze functie controleert eerst of het argument in de "()" waar is en voert vervolgens de code tussen de "{}" uit als het argument correct is. Als dit niet het geval is, wordt de code tussen de "{}" genegeerd.
We kunnen de "if-functie" ook 'upgraden' met een "else". Dit stelt ons in staat om code te laten uitvoeren in het geval dat het argument onjuist is. Als de instructie in de "if-functie" waar is, wordt de "else" genegeerd.
In dit voorbeeld willen we dat het licht uitgaat als de rotor niet op 30 graden staat.
Ten slotte kunt u ook een "als anders" toevoegen. Het zal fungeren als een "els" maar het heeft ook een voorwaarde die waar moet zijn om de code uit te voeren. Laten we zeggen dat we 4 lampen in verschillende kleuren willen hebben en we willen dat een specifiek licht wordt ingeschakeld voor de vier kwartalen van de rotorhoek.
Eerst moeten we variabelen maken voor onze nieuwe lampen.
Laten we beginnen met het bouwen van onze "if-functie"
Hiermee wordt gecontroleerd of de hoek 0 of hoger is, maar ook kleiner dan 90 graden (1.571 rad). Aan beide voorwaarden moet zijn voldaan om de bewering waar te maken. Als u de "Or-operator" ("||") zou willen zijn in plaats van de "And-operator" ("&&"), hoeft slechts één van de voorwaarden waar te zijn om de verklaring waar te maken.
Het groene lampje gaat aan, alle andere lampjes gaan uit.
We herhalen dit nu voor de andere kwartalen.
3.142 rad is gelijk aan 180 graden. We hoeven niet te controleren of deze groter is dan 90 graden, omdat deze "als anders" alleen wordt gecontroleerd als de "als"-voorwaarde onwaar is en de hoek dus groter is dan 90 graden.
4.712 rad is gelijk aan 270 graden.
Voor het laatste geval hoeven we geen "else if" te gebruiken, omdat de enige hoeken die overblijven de hoeken zijn die we sowieso in onze toestand willen (270-360 graden).
Stap over voor slechts
De volgende functie die we kunnen gebruiken is de “schakelaar”. Het is vrij gelijkaardig aan een "als" en "als anders" constellatie, maar al uw voorwaarden moeten gebaseerd zijn op slechts één waarde van één variabele. Verder kun je het alleen vergelijken met een “==”. Dus het zou niet werken voor ons laatste voorbeeld, omdat we 'kleiner dan' ("<") nodig hadden voor onze voorwaarden.
In het volgende voorbeeld veranderen we het zodat het een exacte hoek is en niet een gebied. Dus laten we zeggen dat we 4 gevallen willen. 0, 90, 180 en 270 graden. Elke hoek zal een van onze lichten aanzetten en alle andere uit.
Dit is het hoofd. Tussen de "()" staat de waarde die we willen controleren. Dit kan natuurlijk ook een variabele zijn.
De hoek wordt vergeleken met de “0”. Je kunt je dit voorstellen als een "if (Rotor.Angle == 0)".
De onderbreking zorgt ervoor dat het script uit de hele schakelaar springt nadat het juiste geval is gevonden. Dit is belangrijk om uitvoeringstijd te besparen, aangezien er geen tijd wordt verspild aan het controleren van alle andere gevallen.
Dit is optioneel. Dit hoesje wordt gebruikt als er geen ander hoesje aan de conditie voldoet. In ons voorbeeld wordt dit gebruikt wanneer de hoek tussen 0, 90, 180 en 270 graden ligt, maar niet een van deze exacte getallen. We kunnen bijvoorbeeld gewoon alle lichten uitdoen.
For loop
De laatste voor nu is de "for-lus". Het wordt gebruikt om dezelfde code te herhalen voor een groep variabelen. Om die groep variabelen te maken, moeten we meer te weten komen over de "lijst". Het creëert een groep van de objecten die u in de lijst plaatst; bijvoorbeeld alle lichtblokken op een raster. Het maken van een nieuwe lijst verschilt enigszins van het maken van een variabele:
We hebben een lijst gemaakt met de naam “Lights”. De lijst heeft ook een type nodig, dus dit betekent dat een lijst geen objecten van een ander type kan bevatten. In dit geval is ons type “IMyInteriorLight”. Dit is het type lichtblokken in Space Engineers, maar je kunt ook een lijst met nummers maken met het type "int".
Laten we nu de lijst vullen met alle lichtblokken op ons raster:
Dit plaatst alle blokken uit de groep "Super mega station lichten" in de lijst die wordt vermeld tussen de "()" aan het einde.
Om een enkel object in onze lijst aan te pakken, gebruiken we deze zin: "Lights[0]". Elk object in de lijst heeft een nummer waarop het reageert. Deze begint altijd bij “0” voor het eerste object en wordt naar boven geteld. Als u een lijst met 20 objecten maakt, reageert het eerste object op "0" en het laatste op "19". Het nummer tussen de "[]" adresseert het individuele object. Om het derde licht aan te doen, zouden we het als volgt schrijven:
De lijst is ingesteld, dus laten we doorgaan met de "for-lus":
Dit is het hoofd. Tussen de "()" hebben we 3 verschillende parameters gescheiden door een puntkomma. De eerste (“int i = 0”) creëert een variabele met de naam “i” met een waarde van “0”. De derde ("i++") voegt gewoon "1" toe aan onze variabele "i" elke keer dat de lus wordt uitgevoerd. De tweede parameter (“i < Lights.length”) bepaalt wanneer de lus moet eindigen. Dit betekent dat de lus wordt uitgevoerd zolang "i" lager is dan een specifieke waarde. Als u "i < 20" zou schrijven, zou de lus gewoon 20 keer worden uitgevoerd. In deze situatie heb ik Lights.length gebruikt, wat ons het aantal objecten geeft dat de lijst "Lights" bevat. Dit betekent in feite dat de "for-loop" net zo vaak wordt uitgevoerd als het aantal objecten in onze lijst.
Dit is de body van de "for-loop". Door de variabele "i" te gebruiken, beginnen we met het eerste object ("0") in onze lijst. Omdat we bij elke lus "1" aan "i" toevoegen, gaan we ook door onze lijst met objecten met 1. Dus aan het einde van de "for-lus" ging elk lampje op de lijst aan.
Deze geavanceerde logische operatoren zouden u moeten helpen bij het maken van uw eigen scripts.
Eigenschappen en methoden
Dit is misschien wel een van de moeilijkste stappen voor een beginner. Er is een enorme hoeveelheid verschillende blokken in Space Engineers en dus zijn er veel verschillende bloktypes, methoden en eigenschappen. Als je het verschil wilt weten tussen eigenschappen en methoden, zou je het aan iemand anders moeten vragen, aangezien ik het niet echt weet, maar dat maakt niet echt uit.
De beste manier om met hen samen te werken, is door het allemaal hierin op te zoeken
[github.com]terwijl je iets aan het scripten bent. Enorme credits voor Malware die het heeft gemaakt. Daar kun je alle bloktypen en hun methoden en eigenschappen vinden (wat je eigenlijk met het blok kunt doen). Er zijn een paar dingen die je moet weten om deze te gebruiken.
Om een eigenschap/methode te gebruiken, moet je je blokvariabele schrijven en vervolgens een "." en schrijf vervolgens uw eigenschap/methode.
De meeste eigenschappen kunnen een waarde ophalen of instellen (sommige krijgen alleen waarden). U beslist dit door het een waarde te geven door iets als "= waarde" toe te voegen of niet. Hier zijn twee voorbeelden om u een idee te geven hoe dit werkt:
Een waarde krijgen:
Dit slaat de hoek op in onze variabele "hoek".
Een waarde instellen:
Hierdoor wordt de rotorvergrendeling ingeschakeld.
In de gids zie je ook welk type de eigenschap/methode teruggeeft of nodig heeft als input. Dit is erg belangrijk. De eigenschap "RotorLock" heeft een "bool" nodig, wat betekent dat het alleen "true" of "false" als invoer of uitvoer accepteert.
Je eerste script schrijven
Als je het programmeerbare blok opent zie je dit:
We zullen de functies "Programma" en "Opslaan" voorlopig negeren. Uw hele code wordt tussen de twee "{}" van de "Hoofd"-functie geplaatst. Dit is het deel dat wordt uitgevoerd wanneer het script wordt gebruikt. Als u het eerste script vanaf het begin van deze handleiding zou implementeren, zou het er als volgt uitzien:
Ik raad je ten zeerste aan om je scripts buiten Space Engineers te schrijven. De beste manier voor mij is om Visual Studio samen met de extensie van Malware te gebruiken. Het biedt veel functies waar u tijdens het coderen dol op zult zijn. Er is ook een handleiding voor het installeren en gebruiken ervan
[github.com]in de handleiding van Malware.
Cheatsheet
Wiskundige en logische operatoren:
"+"
"-"
"*"
“/”
"%"
“==”
“!="
“>”, “>=”, “<“, “<=”
"&&"
"||"
“=”
Waardetypes:
"bool": waar/onwaar
"string": tekst
“int”: getal zonder decimalen
“float”: getal met decimalen
“dubbel”: groter getal
"lijst": groep objecten
“IMyInteriorLight”: voorbeeld van een bloktype
Geavanceerde logische operators:
Eigenschappen/methoden:
Dat is alles wat we hiervoor vandaag delen Space Engineers gids. Deze handleiding is oorspronkelijk gemaakt en geschreven door 33iRobot33. Als we deze handleiding niet kunnen bijwerken, kunt u de laatste update vinden door deze te volgen link.