Lys og Kugler 2

Denne vejledning bygger videre på [[Lys og Kugler 1]], som du derfor skal have lavet først.

Vi gør vi vores scene interaktiv, så man selv kan tilføje flere kugler når man klikker med musen, og det begynder at føles lidt som et spil.

Installer Visual Studio

I Unity koder man interaktivitet og anden opførsel med C# (udtales “see sharp”), som er et programmerings sprog Microsoft har lavet, og som bruges i alle mulige sammenhæng.

For at kunne redigere i C# koden skal vi have installeret Microsoft’s Visual Studio.

Trin 1 - Tilføj et Script

Man kan tilføje scripts til alle spil objekter i Unity, og det virker på samme måde som vi brugte “Add Component” tidligere.

Hvilket objekt man tilføjer scripts til afhænger lidt af hvad det er man vil lave, men her har jeg valgt at tilføje opførslen til vores kamera (Main Camera), da det er det eneste objekt vi har præcist ét af, og da vi i øvrigt også skal bruge kameraet til at finde ud af hvor de nye kugler skal komme fra.

Script Main

Visual Studio skulle gerne starte, og se ud i stil med dette:
Visual Studio 2022 Community Edition, Main.cs
Farver og opsætning kan være forskellig på din computer.

Koden er forudfyldt med to funktioner: Start og Update. Teksten markeret med grøn er kommentarer, der forklarer hvad de to funktioner bruges til.

Trin 2 - Tilføj en public variabel

I første omgang har vi brug for at få fortalt koden hvilket spil objekt vi gerne vil “skyde” med. Det kan vi gøre ved at tilføje en public variabel. Alle variable markeret med public bliver synlige og kan tilpasses fra Unity editoren.

Trin 3 - Tildel objekt til variabel

Det skulle gerne se sådan her ud nu:
Pasted image 20230324220939

Trin 4 - Reager på klik

Vi vil gerne have vores kode til at gøre noget når vi klikker på skærmen.

Du kan læse mere om de Unity ting vi bruger her, hvis du har lyst:

Input.mousePosition
Input.GetMouseButtonUp

Det der sker her er dog at vi tjekker med if (...) om noget er sandt.

Her tjekker vi med Input.GetMouseButtonUp om venstre musetast netop er blevet sluppet.

Når det bliver sker, bliver koden i mellem den krøllede start { og slut } parantes udført.

I første omgang vælger vi blot at skrive ud til “debug loggen” at der er blevet trykket på venstre musetast.

Du kan se alle beskeder, samt flere detaljer hvis du går ind under Console som vist her.isual Studio

(0,0,0) er nederst til venstre, og de to første tal - x og y - bliver større når man går henholdsvis til højre og opad.

Disse tal er helt anderledes end de tal vi brugte for Position da vi placerede vores objekter til at starte med. Så vi får brug for en måde at omregne på. Hvis man søger på nettet efter noget i stil med “unity screen to world position” finder man frem til at der er en funktion der hedder hedder ScreenToWorldPoint. Den skal vi bruge om lidt…

Trin 5 - Tilføj kugler

void Update()
{
    if (Input.GetMouseButtonUp(0))
    {
        // Vi bruger funktionen ScreenPointToRay på det nuværende hovedkamera
        // for at få en ray (stråle) i "verdens" koordinater ud fra musens
        // skærm koordinater.
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        // Med vektor-regning flyttes position lidt væk fra kameraet, så 
        // vores nye kugle ikke starter for tæt på.
        // Prøv evt. at ændre tallet og se hvad der sker.
        // f'et er nødvendigt for at lave tallet til et såkaldt "float".
        Vector3 position = ray.origin + ray.direction * 2.0f;

        // Tilføj en ny kugle på den beregnede position. Quaternion.identity
        // bestemmer hvordan den er roteret i rummet.
        // For en kugle gør det naturligvis ingen forskel.
        Instantiate(ballPrefab, position, Quaternion.identity);
    }
}

Du kan læse mere om de Unity ting vi bruger her:

Input.mousePosition
Camera.ScreenPointToRay
Object.Instantiate

I min version ser det sådan her ud:

Trin 6 - Fart på

Vores nye kugler er måske lidt sløve i det. Lad os give dem et “skub”.

            Vector3 position = ray.origin + ray.direction * 2.0f;

            // Tilføj en ny kugle på den beregnede position. Quaternion.identity
            // bestemmer hvordan den er roteret i rummet.
            // For en kugle gør det naturligvis ingen forskel.
            Rigidbody body = Instantiate(ballPrefab, position, Quaternion.identity);

            // Sæt en fart i retning af strålen fra kameraet.
            // Tallet 15.0 passer til min scene, men du kan prøve dig frem hvad du 
            // synes der ser godt ud i dit spil!
            body.velocity = ray.direction * 15.0f;
        }
    }

Der er flere ting vi kan prøve at ændre. Prøv fx at øge “mass” (dvs. hvor tung kuglen du skyder med er):

I mit eksempel ser det sådan her ud:

Jeg glæder mig til at se hvordan jeres er kommet til at se ud!