4531 Cheese Girl

Gör något som liknar:

Projektet Cheese Girl på GitHub

Mina bilder har jag hämtat från Dungeon Crawl 32x32 tills på OpenGameArt.org

Gör efter eget huvud eller ta hjälp av tipsen nedan. Nedan följer ett förslag på arbetsordning.

Förslag på utvecklingssteg med tips

  • nytt projekt som heter t.ex. Cheese Girl
  • Döp om scenen till LevelOneScene
  • Lägg till mappar för att få bra struktur: Sprites, Scripts, Prefabs
  • Hämta bilder från projektet. Mapp med bilder, men bara *.png

Ändra på bildernas egenskap pixel per unit

Markera en Sprite t.ex. Wall och gör följande. Ändra på bildens egenskap pixel per unit till 32. Bilderna har storleken 32 x 32 pixlar. Ändringen gör att bilderna tar upp en ruta som är 1 x 1 i spelmodellen. Det gör att det blir lättare att lägga ut väggar, gräs, m.m på ett enklare vis.

Upprepa för samtliga bilder.

Skapa GameObjects

Skapa följande GameObjects genom att dra in respektive Sprite på scenen: Wall, Sand, Grass, Player, Door, Troll, Chrystal

Gör prefabs av ovanstående GameObjects.

Vilka av GameObjects behöver collider 2d respektive rigidbody 2d?

lägg till ramen med hjälp av for-slingor

Kod för klassen Game på GitHub

Koden i korthet återfinns nedan.

// som ett fält - objektvariabel
[SerializeField] private GameObject wallPrefab;
// eller
public GameObject bulletPrefab;

Det översta sättet är bättre. Objektvariabeln wallPrefab är osynlig för andra. SerializeField gör att det går att sätt värdet i Unity-editorn.

// i metoden start
for (int x = 0; x < 10; x = x + 1)
{
  Instantiate(wallPrefab, new Vector2(x, 0), Quaternion.identity);
}

lägg till gräs och sand

Kod för klassen Game på GitHub

Lägg till gräs och sand på likande vis men med en for-slinga i en annan for-slinga, se nedan.

for (int x = 0; x < 10; x = x + 1)
{
  for (int y = 0; y < 4; y = y + 1)
  {
    Instantiate(sandPrefab, new Vector2(x, 0), Quaternion.identity);
  }
}

Sorting layer

Använd sorting layer för att bestämma vilket objekt som kommer närmast kameran, det vill säga vilket objekt som ligger överst.

Det kan göras i inspektorn men också från koden i klassen Game på följande vis:

sandPrefab.GetComponent<SpriteRenderer>().sortingOrder = 0;
crystalPrefab.GetComponent<SpriteRenderer>().sortingOrder = 2;
// samt övriga prefabs också

Lägre nummer kommer underst.

slumpmässig placering av Chystals

Klassen Game på GitHub

// slumptal 
Random.Range(-5, 5);

Player

Klassen Player på GitHub

Styr höger, vänster, upp och ner med lämpliga tangenter.

Ta bort gräs vid kollision.

private void OnCollisionEnter2D(Collision2D collision)
{
  if (collision.gameObject.name.StartsWith("Grass"))
  {
    Destroy(collision.gameObject);
  }
}

Ta bort Chrystal vid kollision.

Om Chrystals Collider sätts till trigger kan Player och Troll gå igenom den. Vi vill att Troll ska kunna gå igenom Chrystal. För Player spelar det ingen roll. Chrystal ska ju ändå tas bort då Player vidrör den.

Se nedanstående bild för att se hur man gör en collider till trigger.

Kollision med en trigger detekteras på följande vis. Utklipp från klassen Player finns nedan. Metoden heter OnTriggerEnter2D istället för OnCollision2D.

private void OnTriggerEnter2D(Collider2D collider)
{
  if (collider.gameObject.name.StartsWith("Crystal"))
  {
    Destroy(collider.gameObject);
  }
}

Räkna och visa poäng för plockade Chrystal.

Det har du gjort i spelet Crab. Kolla din kod om du har glömt hur man gör.

Öppna dörren när alla Chrystal är plockade.

Klassen Door på GitHub

Klassen Player på GitHub

Den viktigaste koden i Player:

private void OnTriggerEnter2D(Collider2D collider)
{

  if (collider.gameObject.name.StartsWith("Door"))
  {
    // get Door script object
    Door door = collider.gameObject.GetComponent<Door>();
    if (door.IsOpen)
    {
      Debug.Log("next level");
      // återanvänder samma scene för level 2 
      // - ingen ny scene
      game.NextLevel();
    }
  }
}

Dörren leder till level 2

För ledtråd se koden ovan.

game.NextLevel();

Jag har valt att återanvända samma Scene för level 2. Men det går också att göra en ny Scene för level 2. Valet är ditt.

Det som behöver göras för att komma till Level 2 om man återanvänder Scene:

  • stäng dörren
  • ta bort allt gräs
  • Lägg ut nytt gräs. Det är lättare att ta bort och lägga till än att försöka lägga till gräs där det saknas.
  • Slumpa ut Chrystals.
  • Lägg ett Troll bredvid varje Chrystal.

Troll

Klassen Troll på GitHub.

Se till att Trollet bar kan gå i gångarna där gräset är vägg och sanden är golv. Vilka GameObjects behöver colliders för att det ska fungera?

Varje Troll kan styras på t.ex. följande vis:

  • Gå framåt. Först åt höger.
  • Vid kollision slumpa ny riktning. Spara riktningen i en objektvariabel. Det utförs i metoden OnCollisionEnter2D. Antagligen behöver det göras i OnCollisionStay2D också.
  • Gå i den riktningen. Görs i metoden FixedUpdate.

Dörren öppnas när spelaren plockat samtliga Chrystals

Dörren leder till Level 3. Hitta på innehåll själv.

Idéer:

  • Kan plocka vapen som gör att Player kan skjuta Troll. Skjutna Troll ger också poäng.
  • Befinner sig i ett berg. Kan spränga gångar genom att lägga ut dynamit. Player dör om den står för nära dynamiten.
  • Kan plocka något som ger liv tillbaka.
  • Finns portal, t.ex. falsk dörr, som leder tillbaka till föregående bana. Retsamt.

Troll dödar spelaren.

// stoppa tiden
Time.timeScale

Update kommer att fortsätta anropas men inga GameObjects kommer att flytta sig eftersom tiden står still.

Kan starta om genom att t.ex. trycka Escape.

3 liv

Gör så att spelaren har tre liv innan den dör. Det vill säga kan gå emot Troll tre gånger innan det är Game Over.

Visa symbol för liv någon stans. Kan t.ex. vara en bild på spelaren som ligger ute på Wall.