Pong! : Stap 4

Stap 4 : De besturing van de spelers programmeren

Tot nu toe ben je alleen bezig geweest met klik en sleep acties in Unity om objecten te verplaatsen en je hebt daarmee al een heel pong level gemaakt. Dit alles zonder te hoeven programmeren!
Voor de besturing echter is dit wel een beetje nodig. Wees gerust want voor een basis Pong spel zijn maar een paar regels code nodig. Je hoeft het nu niet eens zelf te typen als je weet hoe je tekst kunt kopiëren/plakken maar het is een goeie oefening.
De regels code schrijf je in een ‘script’, wat gewoon een tekst document is maar dan met codetaal in plaats van praattaal.
Deze tutorial gaat verder niet dieper in op hoe de programmeertaal* werkt, het gaat nu vooral om de ervaring en zodat je ziet hoe het ongeveer in zijn werk gaat.

(* Je kunt eigenlijk beter spreken van een programmeer “taal”, met aanhalingstekens, want het is velen malen makkelijker te leren dan een spreektaal! )

Klik met je rechter muisknop in de Project view en selecteer Create > C# Script in het rechtermuis-menu:

Screen Shot 2016-08-25 at 12.44.48

Geef het script de naam ‘Speler1Besturing’. Dit kan ook met het rechtermuis-menu ‘Naam Wijzigen’:

Screen Shot 2016-08-25 at 12.48.22

Dubbelklik op het script bestand in de Project view om het te openen, een ander programma genaamd MonoDevelop zal automatisch openen. Dit is het code-schrijf programma wat standaard bij Unity zit.

Controleer of je in regel 4 de naam van je script ziet, dus ‘Speler1Besturing’:

ScriptNaamCallout-01

Maak ruimte tussen de twee krulhaakjes { } die je na ‘Update ()’ ziet staan door met je muis achter het eerste krulhaakje te klikken en een keer of 3 op Enter te drukken:

MonodevelopMakeSpace

Tijdens het schrijven zal je merken dat het programma je wil helpen met het schrijven van codes door met suggesties te komen in de menuutjes die open springen.
Je kan daarmee snel woorden afmaken door met je pijltjestoetsen het woord dat je af wilt maken te selecteren en daarna op Spatie of Enter te drukken of je kunt het negeren en gewoon verder typen:

MonoDevelopAutofill

Typ, of kopieer en plak, de volgende regels in de lege ruimte die je net tussen de krulhaakjes hebt gemaakt, dus tussen de krulhaakjes van de Update () functie. (Iets verder omlaag op deze pagina staat het volledige script)
Let wel op hoofdletters want C# is hoofdletter gevoelig! (case sensitive):

if ( Input.GetKey(KeyCode.W) == true )
{
    transform.position = transform.position + Vector3.forward * Time.deltaTime * 5;
}

Misschien kun je al een beetje uit de codes opmaken wat deze regel doet, namelijk de speler naar voren bewegen als je op de ‘W’ toets drukt.

Om de speler ook naar achteren te kunnen bewegen hoef je eigenlijk alleen dezelfde regels code nog een keer te typen of kopiëren/plakken en twee dingetjes te veranderen.
De ‘S’ achter Keycode en ‘back’ achter ‘Vector3′:

if ( Input.GetKey(KeyCode.S) == true )
{
    transform.position = transform.position + Vector3.back * Time.deltaTime * 5;
}

Als het goed is ziet het volledige script er nu zo uit:

using UnityEngine;
using System.Collections;

public
 class Speler1Besturing : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {

        if ( Input.GetKey(KeyCode.W) == true )
        {
            transform.position = transform.position + Vector3.forward * Time.deltaTime * 5;
        }

        if ( Input.GetKey(KeyCode.S) == true )
        {
            transform.position = transform.position + Vector3.back * Time.deltaTime * 5;
        }
        
    }
}

In gewone taal (pseudo code) staat er eigenlijk:
“Als de W toets ingedrukt wordt verplaats dan het object 5 meter per seconde naar voren”
en
“Als de S toets ingedrukt wordt verplaats dan het object 5 meter per seconde naar achteren”.

Voor nu is dit alle code die we nodig hebben voor speler 1.
Voor speler 2 maken we precies hetzelfde script met alleen andere knopjes codes voor de besturing!

Druk op Ctrl + S om het script op te slaan en keer daarna terug naar Unity.

(Het kan zijn dat je een rode waarschuwing te zien krijgt in de Console view, in dat geval heb je iets niet goed getypt in je script. Lees in dat geval je code nog een keer na en let op hoofdletters en punten/komma’s.
Je kunt ook op de rode waarschuwing in de Console View dubbelklikken. Unity schakelt dan over naar Monodevelop en laat zien in welke regel de fout zit!)

Klik op het ‘Speler1Besturing’ script in de Project view en klik daarna in de menubalk op Edit > Duplicate om een kopie van het script te maken.

Verander de naam van het script in ‘Speler2Besturing’ en dubbelkik erop om het script te openen en weer naar MonoDevelop te schakelen:

Screen Shot 2016-08-25 at 14.47.30

Verander in MonoDevelop de naam van de ‘class’ in regel 4 zodat deze overeen komt met de naam van je script dus ‘Speler2Besturing’:

public class Speler2Besturing : MonoBehaviour {

Verander in de twee ‘codeblokken’ (if-statements) de woorden ‘KeyCode.W’ en ‘KeyCode.S’ naar ‘KeyCode.UpArrow’ en ‘KeyCode.DownArrow’:

    if ( Input.GetKey(KeyCode.UpArrow) == true )
    {
        transform.position = transform.position + Vector3.forward * Time.deltaTime * 5;
    }

    ifInput.GetKey(KeyCode.DownArrow) == true)
    {
        transform.position = transform.position + Vector3.back * Time.deltaTime * 5;
    }

Sla het script op met Ctrl + S en keer weer terug naar Unity.

Je hebt nu de code scripts geschreven voor de besturing van beiden spelers.
Het volgende stapje is de scripts als  het ware ‘vast te plakken’ aan de twee spelers objecten/paddles.
Een script in Unity werkt namelijk pas als het een een object vast zit.

Klik op de linker spelers kubus in de Hierarchy view.
Klik daarna helemaal onderaan in de Inspector view op ‘Add Component’ en selecteer Scripts > Speler1Besturing in de lijst.
Het script zal net als het Rigidbody component van de UnityBasics tutorial aan het object vast komen te zitten:

ScriptAttachCallout-01

Doe hetzelfde voor de rechter speler 2 kubus met het ‘Speler2Besturing’ script, dus klik op de rechter spelers kubus in de Hierarchy view. Daarna ‘Add Component’ in de Inspector view en Scripts > Speler2Besturing.

Druk daarna op Play om te testen of allebei de spelers bewegen als je op de W, S, en pijltjes toetsen drukt:

Screen Shot 2016-08-25 at 15.14.16

Zoals je misschien al hebt gemerkt is er een probleem.
De spelers paddles gaan dwars door de muren van het level heen.
Dit kun je oplossen door de if-statements in het script iets aan te passen.

Druk nogmaals op Play om het spel weer te stoppen.

Open Speler1Besturing en Speler2Besturing in Monodevelop en verander de if-statements in allebei de scripts als volgt:

void Update () {

if ( Input.GetKey(KeyCode.W) == true && transform.position.z < 3.75f)
{
transform.position = transform.position + Vector3.forward * Time.deltaTime * 5;
}

if ( Input.GetKey(KeyCode.S) == true && transform.position.z > -3.75f)
{
transform.position = transform.position + Vector3.back * Time.deltaTime * 5;
}
}

In gewone taal staat er nu:
“Als de W toets ingedrukt wordt en de spelers positie kleiner is dan 3.75 plaats dan het object 5 meter per seconde naar voren”
en
“Als de S toets ingedrukt wordt en de spelers positie groter is dan -3.75 plaats dan het object 5 meter per seconde naar achteren”.

Zo zorg je er voor dat de spelers nooit door de muur kunnen bewegen!

Sla de allebei de scripts op met Ctrl+S en keer terug naar Unity om het te testen en sla daarna ook het level op met Ctrl+S !

Ga verder naar Stap 5: De bal laten bewegen

GreenArrowLeft Stap 3     Stap 5 GreenArrowRight