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.

- 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.
- ProjektetInstallera Unity 6, skapa ett nytt 3D-projekt och spara scenen.
- ArenanBygg golv och väggar av färdiga 3D-objekt.
- SpelarenGe en sfär fysik och styr den med ett C#-skript.
- Kameran och ljusetVinkla kameran, låt den följa bollen och ljussätt arenan.
- Föremål och poängSamla kuber och visa poängen med TextMeshPro.
- 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.
- Öppna Unity Hub och välj Projects följt av New project.
- Välj mallen Universal 3D. Den ger ett tomt 3D-projekt där Universal Render Pipeline redan är inställd.
- Skriv ett namn som MittForstaSpel och välj en mapp för projektet.
- Tryck på Create project och vänta medan Unity skapar projektet.

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.

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.

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.
- 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.
- Sätt Scale på golvet till 2, 1, 2 så att arenan blir 20 gånger 20 enheter.
- 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.
- 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.
- 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.

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.

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.
- Skapa en mapp som heter Scripts i Assets.
- Högerklicka i mappen och välj Create > Scripting > MonoBehaviour Script. Ge filen namnet PlayerController.
- Dra skriptet till Player i Hierarchy.
- 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.


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.

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.

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.

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.
- Aktivera Is Trigger på kubens Box Collider så att bollen passerar igenom föremålet i stället för att studsa mot det.
- Skapa ett skript som heter Pickup med koden nedan och lägg det på kuben.
- Dra kuben från Hierarchy till mappen Assets. Den blir då en prefab, en mall som du kan återanvända.
- 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.

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.
- 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.
- Unity skapar en Canvas med texten i. Döp textobjektet till ScoreText.
- 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.


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.
- 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.
- Högerklicka i Project-fönstret och skapa ett Material med en stark färg. Dra materialet till quaden så att faran syns tydligt.
- Skapa skriptet Hazard med koden nedan och lägg det på quaden.
- 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.


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.
- Öppna File > Build Profiles och välj Web bland plattformarna. Saknas den lägger du till modulen Web Build Support via Unity Hub.
- Klicka på Switch Platform och vänta medan Unity ställer om projektet.
- Se till att din scen finns med i scenlistan.
- 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
- Unity Learn: 3D Beginner Game, Roll-a-Ball
- Unity Manual: Integrated development environment (IDE) support
- Unity Manual: Create scripts
- Unity Manual: Input
- Input System: Project-Wide Actions
- Unity UI 2.0: changelog med TextMeshPro
- Unity Scripting API: Rigidbody
- Unity Manual: Build Profiles
- Unity Manual: Web Build settings
- Unity Manual: Build your Web application
- Unity: prisuppdateringar och Unity Personal
- Unity Blog: Documentation, Unity scripting languages and you, 3 september 2014
- Unity Blog: UnityScript’s long ride off into the sunset, augusti 2017
- Unity 2018.1.0f1 release notes
- MCV: Unity to end Web Player support, 9 oktober 2015
Uppgifterna kontrollerades 20 oktober 2026.

