inear

Alla experiment

Skapa, testa och förstå3D, WebGL och spelutveckling

Spelutveckling

Skapa ett enkelt spel i Unity: steg för steg för nybörjare

Bygg ett litet 3D-spel i Unity 6 där en boll samlar föremål och undviker fällor. Guiden tar dig från tomt projekt till ett spel som körs i webbläsaren.

Skribent
Publicerad
Lästid
15 min
Tonåring och vuxen bygger ett enkelt 3D-spel i Unity vid ett skrivbord

Unity är en av de mest använda spelmotorerna för den som vill börja bygga egna spel. I den här guiden bygger du ett litet 3D-spel där en boll rullar runt på en arena, samlar föremål och undviker fällor. Allt är skrivet för Unity 6 och slutar med att spelet går att spela i webbläsaren.

Skapa ett enkelt spel i Unity 3D
Spelet du bygger: en boll på en arena med föremål att plocka upp. Skärmbilderna i guiden kommer från en äldre version av Unity.
Skrivet för
Unity 6, kontrollerat mot dokumentationen för Unity 6.3 LTS
Språk
C#
Kodredigerare
Visual Studio, Visual Studio Code eller JetBrains Rider
Nivå
Nybörjare, inga tidigare kodkunskaper krävs
Resultat
Ett spel som körs i webbläsaren via WebGL

Guiden är en omskriven och uppdaterad version av en äldre handledning som tidigare låg på startsidan. Upplägget liknar Unitys egen nybörjarkurs Roll-a-Ball, som i dag finns för Unity 6.3 och går igenom samma grunder med video. Redaktionen har skrivit om alla steg och all kod så att de fungerar i dagens Unity.

Det här har ändrats sedan den gamla guiden

Den första versionen av guiden skrevs för en Unity-version som inte längre finns. Flera saker i den gamla texten fungerar inte i dag och är bra att känna till om du hittar äldre guider på nätet.

Förr I dag När det ändrades
Skript skrivna i Boo eller UnityScript Endast C# Boo slutade dokumenteras inför Unity 5 och UnityScript började fasas ut 2017
MonoDevelop som kodredigerare Visual Studio, Visual Studio Code eller Rider Unity 2018.1
Unity Web Player kördes i webbläsaren Plattformen Web med WebGL och WebAssembly Unity 5.4, 2016
GUIText för text på skärmen TextMeshPro finns i paketet Unity UI Unity 2023.2
Input.GetAxis via Input Manager Input System är numera standard Unity 6
Build Settings Build Profiles Unity 6

Boo var ett programmeringsspråk som liknade Python. Enligt Unitys blogg från september 2014 användes det så lite att dokumentationen lades ner inför Unity 5. UnityScript, som påminde om JavaScript, fick samma öde när företaget i augusti 2017 meddelade att språket skulle fasas ut. I dag skriver du alla skript i C#.

Web Player var ett insticksprogram för webbläsare som byggde på tekniken NPAPI. När webbläsarna slutade stödja sådana tillägg gick Unity över till WebGL. Branschtidningen MCV rapporterade i oktober 2015 att Unity 5.4 skulle bli den första versionen utan Web Player. Ett spel som byggs för webben i Unity 6 körs i stället direkt i webbläsaren utan något tillägg.

MonoDevelop följde med Unity i många år men togs bort ur installationen i Unity 2018.1, då Visual Studio blev den rekommenderade redigeraren. Dokumentationen för Unity 6 listar tre redigerare som stöds: Visual Studio på Windows samt Visual Studio Code och JetBrains Rider på Windows, macOS och Linux.

Så hänger spelet ihop

Spelet består av fyra små skript. Spelarens skript läser tangenterna och knuffar bollen, kameran följer efter och två enkla skript markerar föremål och fällor.

Input System läser tangenter och handkontrollPlayerController knuffar bollen med AddForceOnTriggerEnter räknar föremålen och visar poängen
Förenklad bild av flödet i spelet. Redaktionens egen illustration.
  1. ProjektetInstallera Unity 6, skapa ett nytt 3D-projekt och spara scenen.
  2. ArenanBygg golv och väggar av färdiga 3D-objekt.
  3. SpelarenGe en sfär fysik och styr den med ett C#-skript.
  4. Kameran och ljusetVinkla kameran, låt den följa bollen och ljussätt arenan.
  5. Föremål och poängSamla kuber och visa poängen med TextMeshPro.
  6. WebbenLägg till fällor och bygg spelet för webbläsaren.

Steg 1: Installera Unity och skapa ett projekt

Ladda ned Unity Hub från Unitys webbplats och installera en version av Unity 6 under fliken Installs. Kryssa samtidigt i modulen Web Build Support, eftersom du behöver den i sista steget. Unity Personal är gratis för privatpersoner och för företag vars intäkter och finansiering uppgår till högst 200 000 dollar.

  1. Öppna Unity Hub och välj Projects följt av New project.
  2. Välj mallen Universal 3D. Den ger ett tomt 3D-projekt där Universal Render Pipeline redan är inställd.
  3. Skriv ett namn som MittForstaSpel och välj en mapp för projektet.
  4. Tryck på Create project och vänta medan Unity skapar projektet.
Skapa ett nytt projekt
Projektdialogen i en äldre version av Unity. I Unity 6 skapar du projektet direkt i Unity Hub.

Steg 2: Bekanta dig med fönstren

Unity består av flera fönster som du kan dra och flytta fritt. Vill du återställa ordningen väljer du en färdig layout under Window och Layouts. Fem fönster används hela tiden i den här guiden.

  • Scene: Här bygger du banan och flyttar objekt.
  • Game: Visar vad kameran ser när du trycker på Play.
  • Hierarchy: Visar en lista med alla objekt som finns i scenen.
  • Project: Innehåller alla filer i projektet, till exempel skript, material och scener.
  • Inspector: Här ser du inställningarna för det markerade objektet.

Du navigerar i Scene genom att hålla in höger musknapp och styra med W, A, S och D medan mushjulet zoomar. Tryck på F för att fokusera på det markerade objektet.

Anpassa layouten
De fem huvudfönstren är Scene, Game, Hierarchy, Project och Inspector.

Steg 3: Spara scenen och öppna Build Profiles

Ett nytt projekt har redan en scen som heter SampleScene. Spara den under ett tydligare namn via File och Save As, till exempel Main i mappen Assets/Scenes. Gör det till en vana att spara ofta med Ctrl+S eller Cmd+S.

Öppna sedan File och Build Profiles. I äldre versioner hette fönstret Build Settings och det är här du väljer plattform och vilka scener som ska ingå i spelet. Kontrollera att din scen finns med i listan. Själva bygget gör du först när spelet är klart.

Spara scenen och ställ in strukturen
Byggfönstret från en tidigare version. I Unity 6 har det bytt namn till Build Profiles.

Steg 4: Bygg arenan

Arenan består av ett golv och fyra väggar. Du skapar nya objekt via menyn GameObject eller med plustecknet överst i Hierarchy.

  1. Välj GameObject > 3D Object > Plane. Ge objektet namnet Floor och nollställ det genom att klicka på de tre prickarna bredvid Transform och välja Reset.
  2. Sätt Scale på golvet till 2, 1, 2 så att arenan blir 20 gånger 20 enheter.
  3. Välj GameObject > 3D Object > Cube och ge kuben namnet Wall. Sätt Scale till 20, 2, 0.5 och Position till 0, 1, 10.
  4. Duplicera väggen tre gånger med Ctrl+D. Placera en kopia vid koordinaterna 0, 1, minus 10. Rotera de två återstående kopiorna 90 grader runt Y-axeln och lägg dem vid 10, 1, 0 respektive minus 10, 1, 0.
  5. Skapa ett tomt objekt via GameObject > Create Empty, döp det till Arena och dra in golvet och väggarna i det.

Att gruppera objekt under en tom förälder påverkar inte spelet men håller ordning i Hierarchy när scenen växer. Samma knep använder du för föremål och fällor längre fram.

Skapa scenen
Arenan med golv och fyra väggar samlade under ett tomt objekt.

Steg 5: Skapa spelaren med fysik

Spelaren är en vanlig sfär som styrs av Unitys fysikmotor. Välj GameObject, 3D Object och Sphere, döp sfären till Player och sätt Position till 0, 0.5, 0 så att den vilar på golvet.

Klicka på Add Component i Inspector och lägg till en Rigidbody. Komponenten gör att bollen påverkas av tyngdkraft och andra krafter. Behåll standardinställningarna så länge.

Sfären har redan en Sphere Collider. Collidern är den form som fysikmotorn räknar med när objekt krockar. Stänger du av den faller bollen rakt igenom golvet som ett spöke, vilket videon nedan visar. Slå på den igen innan du fortsätter.

Skapa spelkaraktären
Sfären med Rigidbody och Sphere Collider i Inspector.
Utan collider passerar bollen genom golvet.

Steg 6: Få bollen att rulla

Nu behöver bollen ett skript. Unity 6 använder Input System som standard och nya projekt har redan en fil som heter InputSystem_Actions med färdiga handlingar som Move och Jump.

  1. Skapa en mapp som heter Scripts i Assets.
  2. Högerklicka i mappen och välj Create > Scripting > MonoBehaviour Script. Ge filen namnet PlayerController.
  3. Dra skriptet till Player i Hierarchy.
  4. Dubbelklicka på skriptet så att det öppnas i din kodredigerare. Ersätt innehållet med koden nedan.
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
    [SerializeField] private InputActionReference moveAction;
    [SerializeField] private float speed = 10f;

    private Rigidbody rb;
    private Vector2 moveInput;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void OnEnable()
    {
        moveAction.action.Enable();
    }

    private void Update()
    {
        moveInput = moveAction.action.ReadValue<Vector2>();
    }

    private void FixedUpdate()
    {
        Vector3 movement = new Vector3(moveInput.x, 0f, moveInput.y);
        rb.AddForce(movement * speed);
    }
}

Skriptet läser handlingen Move i Update och använder värdet i FixedUpdate, som körs i takt med fysikmotorn. Metoden AddForce knuffar bollen i den riktning du styr. Den tidigare guiden multiplicerade kraften med Time.deltaTime, men det behövs inte eftersom en vanlig kraft redan verkar under hela fysiksteget. Variabeln speed visas i Inspector tack vare SerializeField, så du kan justera den utan att ändra koden.

Spara skriptet och gå tillbaka till Unity. Markera Player och leta upp fältet Move Action i Inspector. Klicka på den lilla cirkeln bredvid fältet och välj Player/Move från InputSystem_Actions. Tryck sedan på Play och styr bollen med piltangenterna eller W, A, S och D.

Använder du den äldre Input Manager? Gamla guider läser tangenterna med Input.GetAxis och axelnamnen Horizontal och Vertical. I ett nytt projekt i Unity 6 blir det fel om du inte ändrar Active Input Handling till Both under Edit, Project Settings och Player. Redaktionen rekommenderar Input System, som Unity själva beskriver som rätt val för de flesta projekt.

Få spelkaraktären att röra sig
Skriptet läggs till som en komponent på spelaren.
Få spelkaraktären att röra sig, inställningar
Publika fält som speed kan ändras direkt i Inspector.

Steg 7: Lägg till ljus

Mallen Universal 3D skapar redan ett riktat ljus som heter Directional Light. Markera det och kontrollera att Rotation ligger runt 50, minus 30, 0 så att skuggorna faller snett över arenan.

Vill du ha mjukare kontraster kan du duplicera ljuset, döpa kopian till Fill Light och vrida den åt motsatt håll. Sänk Intensity till ungefär en tiondel av huvudljuset och stäng av skuggorna för kopian. Samla båda ljusen under ett tomt objekt som heter Lights. Ett svagt blått fyllnadsljus ger arenan mer djup utan att ta över bilden.

Lägg till belysning
Ett huvudljus tillsammans med ett svagare fyllnadsljus.

Steg 8: Finjustera kameravinkeln

Markera Main Camera och sätt Position till 0, 10, minus 10 och Rotation till 45, 0, 0 så att kameran tittar snett ned över arenan. Justera värdena tills hela spelplanen syns i Game-vyn.

Finjustera kameravinkeln
Kameran vinklad snett ned över arenan.

Steg 9: Få kameran att följa bollen

Kameran ska följa bollen utan att snurra med den. Skapa ett nytt skript som heter CameraFollow, lägg det på Main Camera och skriv in koden nedan.

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [SerializeField] private Transform player;

    private Vector3 offset;

    private void Start()
    {
        offset = transform.position - player.position;
    }

    private void LateUpdate()
    {
        transform.position = player.position + offset;
    }
}

Avståndet mellan kamera och boll räknas ut en gång i Start. LateUpdate körs efter att alla andra objekt har flyttats under bildrutan, så kameran hamnar alltid rätt och skakar inte. Dra Player från Hierarchy till fältet Player på kamerans skript och testa igen.

Få kameran att följa spelkaraktären
För att koppla spelaren till kamerans skript drar du den till fältet i Inspector.

Steg 10: Skapa föremål att samla

Föremålen är små kuber som snurrar. Skapa en kub, döp den till Pickup och sätt Scale till 0.5 på alla axlar och Position till 3, 0.5, 3.

  1. Aktivera Is Trigger på kubens Box Collider så att bollen passerar igenom föremålet i stället för att studsa mot det.
  2. Skapa ett skript som heter Pickup med koden nedan och lägg det på kuben.
  3. Dra kuben från Hierarchy till mappen Assets. Den blir då en prefab, en mall som du kan återanvända.
  4. Placera ut sex till tio kopior av prefaben runt arenan och samla dem under ett tomt objekt som heter Pickups.
using UnityEngine;

public class Pickup : MonoBehaviour
{
    [SerializeField] private Vector3 spin = new Vector3(15f, 30f, 45f);

    private void Update()
    {
        transform.Rotate(spin * Time.deltaTime);
    }
}

Den gamla guiden lade en Rigidbody med Is Kinematic på varje föremål och kände igen dem med taggar. Spelarens boll har redan en Rigidbody och det räcker för att Unity ska rapportera när den rör en trigger. Skriptet Pickup fungerar som en etikett, så spelaren kan känna igen föremålet utan taggar och utan risk för stavfel.

Skapa föremål
Föremålen är utplacerade runt arenan.

Steg 11: Räkna poäng och visa dem med TextMeshPro

Poängen visas med TextMeshPro, som har ersatt den gamla komponenten GUIText. Sedan Unity 2023.2 ingår TextMeshPro i paketet Unity UI och behöver inte installeras separat.

  1. Välj GameObject > UI > Text – TextMeshPro. Första gången frågar Unity om du vill importera TMP Essentials. Klicka då på Import TMP Essentials.
  2. Unity skapar en Canvas med texten i. Döp textobjektet till ScoreText.
  3. Ankra texten i det övre vänstra hörnet via Rect Transform och välj en storlek som syns bra.

Öppna PlayerController igen och byt ut koden mot den här versionen. Det nya är fälten för texten, räknaren och metoden OnTriggerEnter.

using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
    [SerializeField] private InputActionReference moveAction;
    [SerializeField] private float speed = 10f;
    [SerializeField] private TMP_Text scoreText;
    [SerializeField] private string prefix;

    private Rigidbody rb;
    private Vector2 moveInput;
    private int score;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void OnEnable()
    {
        moveAction.action.Enable();
    }

    private void Start()
    {
        UpdateScore();
    }

    private void Update()
    {
        moveInput = moveAction.action.ReadValue<Vector2>();
    }

    private void FixedUpdate()
    {
        Vector3 movement = new Vector3(moveInput.x, 0f, moveInput.y);
        rb.AddForce(movement * speed);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.TryGetComponent(out Pickup pickup))
        {
            pickup.gameObject.SetActive(false);
            score++;
            UpdateScore();
        }
    }

    private void UpdateScore()
    {
        scoreText.text = prefix + score;
    }
}

OnTriggerEnter anropas när bollen rör en collider med Is Trigger ikryssad. TryGetComponent kontrollerar om objektet har skriptet Pickup och stänger i så fall av föremålet med SetActive(false) medan poängen räknas upp.

Markera Player, dra ScoreText till fältet Score Text och skriv Poäng: följt av ett mellanslag i fältet Prefix. Tryck på Play och rulla över föremålen för att se siffran öka.

Få spelaren att samla in föremålen och visa poängen
Poängen syns i skärmens hörn.
Få spelaren att samla in föremålen och visa poängen, inställningar
Textobjektet kopplas till spelarens skript i Inspector.

Steg 12: Skapa faror

Farorna är platta rutor på golvet som skjuter upp bollen i luften. Skapa en Quad, döp den till Hazard, vrid den 90 grader runt X-axeln och sätt Y till 0.01 så att den ligger precis ovanför golvet.

  1. Ta bort komponenten Mesh Collider och lägg till en Box Collider där Is Trigger är ikryssad. Sätt Size till 1, 1, 0.5 så att triggern får lite tjocklek.
  2. Högerklicka i Project-fönstret och skapa ett Material med en stark färg. Dra materialet till quaden så att faran syns tydligt.
  3. Skapa skriptet Hazard med koden nedan och lägg det på quaden.
  4. Gör quaden till en prefab och sprid ut flera kopior under ett tomt objekt med namnet Hazards.
using UnityEngine;

public class Hazard : MonoBehaviour
{
    public float jumpForce = 6f;
}

Lägg till en ny gren i OnTriggerEnter i PlayerController, direkt efter blocket för Pickup:

        else if (other.TryGetComponent(out Hazard hazard))
        {
            rb.AddForce(Vector3.up * hazard.jumpForce, ForceMode.Impulse);
            hazard.gameObject.SetActive(false);
        }

ForceMode.Impulse ger en kraftig stöt på en gång i stället för en jämn kraft. Prova olika värden på Jump Force i Inspector tills hoppet känns lagom.

Spelet är nu klart att testa. Rullar bollen över kanten faller den ner i tomma intet. Vill du ändra på det kan du lägga till ett skript som laddar om scenen med SceneManager när bollen hamnar under golvet.

Skapa faror
Farorna ligger som platta rutor på golvet.
Skapa faror inställningar
Faran får ett eget material så att den syns tydligt.

Bygg spelet för webbläsaren med WebGL

När spelet fungerar i editorn är det dags att bygga en version som andra kan spela. I Unity 6 heter plattformen Web och den använder WebGL för grafiken, samma teknik som ersatte Web Player.

  1. Öppna File > Build Profiles och välj Web bland plattformarna. Saknas den lägger du till modulen Web Build Support via Unity Hub.
  2. Klicka på Switch Platform och vänta medan Unity ställer om projektet.
  3. Se till att din scen finns med i scenlistan.
  4. Klicka på Build And Run och välj en tom mapp. Unity bygger spelet, startar en tillfällig lokal webbserver och öppnar spelet i webbläsaren.

Bygget hamnar i en mapp med en undermapp som heter Build. Där finns bland annat en .wasm-fil och en .data-fil. Enligt Unitys dokumentation om webbyggen kan spelet vägra att starta om du öppnar det direkt från hårddisken, eftersom webbläsare begränsar lokala filadresser. Ladda därför upp mappen till en webbserver eller till Unity Play. På Unity Play måste byggen vara mindre än 1 GB.

Vanliga problem och lösningar

Bollen rör sig inte

Fältet Move Action är tomt eller så saknas skriptet på Player. Titta efter röda felmeddelanden i Console.

Föremålen räknas inte

Is Trigger saknas på föremålets collider eller så saknar bollen sin Rigidbody.

Fel om Input-klassen

Koden använder gamla Input medan projektet körs med Input System. Ändra koden eller justera Active Input Handling.

Webbversionen laddar inte

Spelet öppnades direkt från disken. Använd Build And Run eller en riktig webbserver.

Nästa steg

Med de här grunderna kan du bygga ut spelet på egen hand. Lägg till en timer, en vinsttext när alla föremål är insamlade eller ljud när bollen träffar en vägg. Unitys kurs Roll-a-Ball visar hur man lägger till fiender som jagar spelaren med AI Navigation.

Den som vill se Unity användas till mer avancerad grafik kan läsa om interior mapping i Unity. Vill du förstå grunderna i 3D-grafik passar en kort introduktion till 3D bra som nästa läsning.

Vanliga frågor om att skapa ett spel i Unity

Kostar Unity något?

Unity Personal är gratis för privatpersoner och företag med upp till 200 000 dollar i intäkter och finansiering. Den gränsen gäller sedan Unity 6 släpptes i oktober 2024.

Kan man skriva Unity-skript i Boo eller JavaScript i dag?

Nej. Unity slutade dokumentera Boo inför Unity 5 och började fasa ut UnityScript 2017. I dag skrivs alla skript i C#.

Vilken kodredigerare ska jag använda med Unity 6?

Visual Studio, Visual Studio Code och JetBrains Rider stöds officiellt. MonoDevelop följer inte med sedan Unity 2018.1.

Vad ersatte Unity Web Player?

Den ersattes av plattformen Web, som bygger spelet med WebGL och WebAssembly. Spelet körs då direkt i webbläsaren utan insticksprogram.

Behöver jag kunna programmera innan jag börjar?

Nej, men det hjälper att skriva av koden noggrant. C# skiljer på stora och små bokstäver och varje sats måste avslutas med semikolon.

Källor

Uppgifterna kontrollerades 20 oktober 2026.

Leave a Comment