My Island (Deel 2) backup

C# Programming Info Mind-Map
(Klik op de Mind-Map Thumbnail om deze in een nieuw venster te openen.)

Image from Monodevelop
MonoDevelop met het kleuren schema ‘Oblivion’

My Island deel 2: Het schrijven van een Script voor Unity3D in de programmeertaal C#, met de standaard externe IDE (integrated development environment) genaamd MonoDevelop.

Introductie

Deze opdracht gaat verder waar deel 1 van My Island is geëindigd en laat zien hoe je een simpel script kan schrijven voor Unity met de object georiënteerde programmeertaal C# en hoe je dat script vervolgens kan koppelen aan je speler.
Wees gerust als je nog nooit echt geprogrammeerd hebt want iedereen doet dit eigenlijk al.
Denk maar aan Facebook of WhatsApp: Als je daar de code 🙂 typt wordt dat door de computer ‘vertaald’ naar een plaatje van een smiley 😀

Wat Object georiënteerd is

Object georiënteerd wil zeggen dat de programmeertaal uitermate geschikt is voor het programmeren van ‘objecten’.
In Unity zijn die objecten vaak ook echt zichtbare 3D objecten maar een object kan in principe alles zijn, bijvoorbeeld ook een plaatje, een geluid, een lamp, een lijst met namen etc. Ook zoiets als een camera of het spelers object in Unity wordt gezien als een object en is daarom ook te programmeren.

Het werkt in principe zo: je hebt een object, bijvoorbeeld een kubus of een ander ‘ding’. Op een papieren lijst schrijf je wat er met die kubus of tafel moet gebeuren (bijvoorbeeld 2 meter naar voren schuiven en daarna 1 opzij) en die lijst maak je daarna vast (door te slepen) aan het object. Het script bepaald dus het gedrag (behaviour) van het object. Bijvoorbeeld: hoe een vijand reageert als je in de buurt komt, hoe een platform waar je op moet springen heen en weer beweegt en hoeveel leven je krijgt als je over een healthpack loopt.

Screen Shot 2015-12-28 at 13.27.54

Hoe je zo’n script schrijft en vastmaakt aan een object (in dit geval het spelersobject) leer je in de volgende stappen!

 

Stap 1: Een nieuw script creëren

Open de map Assets > _Scripts in de Project View. Klik met je rechter muisknop in de Assets > _Scripts map en klik Create > C# Script.
Geef het script de naam PlayerScript en dubbelklik erop om het script te openen.
Het externe code schrijf programma MonoDevelop waarmee we het script gaan schrijven zal binnen een aantal seconden openen.

Over MonoDevelop

MonoDevelop is een vrij ‘simpel’ code-schrijf programma wat standaard geleverd wordt met Unity3D. Je zou code ook in een .txt text bestand kunnen schrijven met Word of Notepad maar het voordeel van MonoDevelop is dat het programma onder andere aangeeft wanneer je een typ-fout maakt, bepaalde woorden al kent en automatisch voor je af kan maken.
Het vereist in het begin enige gewenning maar binnen korte tijd schrijf je hier 5 keer zo snel mee.
Als het programma een woord voor je af wil maken druk je op spatie. Als het niet het juiste woord is kun je gewoon verder typen of op escape drukken.

Stap 2: De naam van het script controleren

Controleer of je in regel nr. 4 de naam PlayerScript ziet staan. Zo niet verander dan het woord NewBehaviourScript in PlayerScript want deze verwijzing moet precies hetzelfde zijn als de naam van het script.

public class PlayerScript : MonoBehaviour {

Het script heeft al een paar regels code die je computer vertellen dat het hier om een C# script gaat en niet om een gewoon textbestand of een script met een andere programmeertaal zoals Java of Boo.
Ook geven de eerste twee regels aan dat het een script is wat gebruikt maakt van zowel het Unity3D als het standaard System “woordenboek” of de “gereedschapskist” van codes.
We kunnen direct beginnen met het schrijven van onze code omdat Unity3D het script al voor ons heeft klaargemaakt.

De {} krulhaakjes (Curly Braces) geven de verschillende ruimtes aan waarin we code kunnen schrijven. Omdat het script begint met een haakje en eindigt met een haakje weet je computer waar de code begint en eindigt.
Het volgende krulhaakje zie je na Start () staan en geeft de tweede ruimte aan, dit is dus een ruimte in een ruimte.
Je kunt het script zien als een huis en Start () {} en Update () {} als 2 aparte kamers in dat huis.

Als je het script vastmaakt aan een object in Unity3D en op Play druk dan leest je computer het script van boven naar beneden, van links naar rechts en vertaalt de codes in gebeurtenissen op je scherm. Als je computer alles heeft gelezen dan is er 1 beeldje (frame) voorbij en begint het lezen weer vanaf bovenaan. Als je in een spel 60 beeldjes per seconde ziet dus 60FPS (frames per seconde), dan leest je computer het script dus 60 keer per seconde!

Stap 3: Een ‘public’ variabel aanmaken

Klik met je muis op regel nummer 5 en druk tweemaal op Enter om wat schrijf ruimte te maken. Klik daarna op regel nummer 6 en typ het volgende met de hoofdletters op de juiste manier want C# is hoofdlettergevoelig!:

public Transform myTransform;

Zorg ervoor dat je script er zo uitziet:

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

      public Transform myTransform;

      // Use this for initialization
      void Start () {

      }

      // Update is called once per frame
      void Update () {

      }

}

Stap 4: Variabelen en types variabelen

Druk op ctrl+S om het script op te slaan.
We hebben nu onze eerste Variabel verklaard. Dit doen we om het script te laten weten dat we een Transform component uit Unity3D willen gebruiken in ons script, (bijvoorbeeld die van onze speler). En we hebben daar onze eigen naam aan gegeven. Het woordje ‘myTransform’ had ook ‘xyz’ of alleen maar ‘x’ kunnen zijn. Dit mogen we zelf verzinnen.
Het woordje ’public’ vertelt Unity3D dat de variabel zichtbaar mag zijn in de Inspector view in Unity3D. Als we daar ‘private’ hadden geschreven dan was de Variabel onzichtbaar geweest voor ons in Unity3D.

We hebben de variabel buiten de Start () {} en Update () {} kamers geschreven zodat we de variabel binnen zowel Start () als Update () kunnen gebruiken.
Als we de Variabel binnen Start () of Update () hadden geschreven was deze alleen bruikbaar geweest binnen een van deze twee “kamers”.

Programmeren begint vaak met het schrijven van een variabel. Een variabel is een naam (of symbool) die staat voor een waarde. Bijvoorbeeld x = 10 of health = 100.
X en health zijn de namen en 10 en 100 de waardes. Variabelen zijn handig omdat je erdoor flexibel kunt programmeren. Je kan bijvoorbeeld programmeren dat health aan het begin 100 is maar als de speler geraakt wordt door een vijand dat er van health 10 afgaat. Hierna is health dus nog maar 90.
Er zijn 3 belangrijke types variabelen die het meeste gebruikt worden: Int, float en string.

Int (integer) wordt gebruikt voor hele getallen (dus geen fracties), die positief, negatief of nul kunnen zijn. De nummer 10, 0, -25 en 5023 zijn allen integers.

Float is voor getallen die ook decimale plaatsen hebben bijvoorbeeld 1.5, 100.223 of -2.66.

String is voor woorden en namen etc. en wordt altijd tussen aanhalingstekens geschreven. 

Voor een iets uitgebreidere uitleg over variabelen kijk in het menu bij Extra of op de officiële site van Unity: http://unity3d.com/learn/tutorials/topics/scripting

Stap 5: Het script koppelen aan de speler

Ga terug naar Unity3D en sleep het PlayerScript script vanuit de Project View op het FPSController object in de Hierarchy View.
Je hebt het script nu vastgemaakt aan het FPSController object.
Selecteer het FPSController object in de Hierarchy view om het zichtbaar te maken in de Inspector. Scroll naar onder in de Inspector en als je het goed gedaan hebt zie je daar het Player Script (Script) component met de Public Variabel MyTransform zichtbaar, die we in het script hebben geschreven.
Unity3D-MyIsland InfoGraphic 10

Stap 6: De myTransform variabel toewijzen (initialiseren)

Sleep nu de FPSController vanuit de Hierarchy view naar het script waar je nu een leeg vakje ziet achter My Transform.
Hierdoor vertellen we het script om welke Transform het gaat als we het in het script over myTransform hebben!
Als je nu op Play zou drukken dan ‘leest’ je computer het script, maar we hebben nog niets geschreven dus ga weer terug naar MonoDevelop.

Stap 7: De startpositie van de speler programmeren

Klik met je muis achter het krul haakje na het woordje Start () { . Dit is het gedeelte wat Unity3d het eerste leest als we op Play drukken dus bij de start van de game. Wat we in
Start () {} schrijven leest Unity3D slechts 1 keer bij het starten van de Scene.
Dit gedeelte is bedoeld om ‘dingen klaar te zetten’ bij het beginnen van een Scene of level. Zorg ervoor dat Start () {} er zo uitziet:

// Use this for initialization
void Start () {

      myTransform.position = new Vector3(250,150,250);

}

Stap 8: Het script testen

Druk op ctrl+S om het script weer te saven.
Ga terug naar Unity3D en druk op Play. Zie hoe je vanaf 150 meter hoogte naar beneden valt met je eiland recht onder je!
We hebben Unity3D nu met ons script verteld dat bij het begin van het spel het Transform component van onze speler de Position variabelen op (250,150,250) moeten worden gezet wat als resultaat heeft dat onze speler aan het begin van de game op die plaats begint.
Je zult begrijpen dat een code als dit handig kan zijn om bijvoorbeeld aan het begin van een level de vijanden op de juiste plaats te zetten of wanneer je een speler van de een naar de andere plek wilt teleporteren.

Stap 9: Zorgen dat de speler niet uit het level kan vallen

We hebben nu een eiland maar zoals je misschien al gemerkt hebt kunnen we er nog steeds vanaf vallen de lege ruimte in!
Met het volgende ‘if’ statement kunnen we ervoor zorgen dat dit niet meer gebeurd en dat de speler weer netjes terug geplaats wordt in het level wanneer hij of zij over de rand of uit het level valt.
Een if-statement is eigenlijk een manier om te programmeren dat; “Als (if) dit gebeurt doe dan dat”.
Bijvoorbeeld: “Als het leven van de speler 0 is dan is het game over” of “Als de speler door deze deur loopt begint het volgende level”.
Een regel als dit noemt men een if Statement. Het if-statement is een van de meest gebruikte codes omdat het in veel situaties gebruikt kan worden.

In C# ziet een lege if statement er zo uit:

If () {}

Een if-statement om te zorgen dat de “Game Over” scene geladen wordt ziet er zo uit:

        if (health < 1 ) 
        {
            Application.LoadLevel ("GameOver");
        }

In pseudo code (dat is “code” geschreven als gewone praat taal) staat hier:
Als het leven van de speller minder is dan 1 start dan het game over level.

Ga terug naar MonoDevelop en zet de volgende if statement in het Update () {} gedeelte.
Wat je in Update () {} in schrijft wordt ieder frame door Unity3D uitgevoerd. Als het spel 60FPS gaat dus 60 keer per seconde. Niet zoals bij Start () {} maar 1 keer.
Omdat we ieder moment dat er gespeeld wordt willen checken of de speler uit het level is zetten we de code hiervoor in het Update() {} gedeelte.

// Update is called once per frame
void Update () {

if (myTransform.position.y < -5 )
            {
                        myTransform.position = new Vector3(250,150,250);
            }
}

In ‘pseudo code’ staat hier:
Als mijn positie op de Y-as minder is dan -5 dan wordt mijn nieuwe X,Y,Z positie (250,150,250).
Pseudo code is geen echte code maar een manier om eerst in gewone taal op te schrijven wat je wilt. Als je begint met programmeren is het vaak een goede manier om eerst pseudo code te schrijven en het daarna om te zetten in echte code.

Stap 10: Nogmaals het script testen

Druk op ctrl+S om het script weer op te slaan en keer terug naar Unity3D.
Druk op Play en loop over de rand van je level. Als je 5 meter bent gevallen wordt je door de code weer boven het level geplaatst!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.