Java týden
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy.

Lekce 9 - Unity (C#) Android: Přestavba, bodáky

V minulé lekci, Unity (C#) Android: MenuPart, Eraser, pozadí 2, jsme vylepšili odstraňování překážek, detekci objektu a přidali levely.

Vítám vás u dalšího Unity3D tutoriálu, kde vytváříme vlastní hru pro Android. Dnes upravíme mapu, pohyb hráče a pozměníme i způsob, jakým se nám posouvají překážky.

Vylepšení particle systému

Nejdříve ale uděláme drobnou změnu v našem Particle Systému, který jsme si vytvořili pro rozbíjení stalagů. Oproti minule si nastavíme navíc ještě Start Color, kterou zvolíme modrou. Také Shape změníme na Sphere o radiusu 2. A abychom docílili hezčího efektu, aktivujeme Rotation over Lifetime, malou šipkou napravo zvolíme Random Between Two Constants a hodnoty nastavíme na -180180. Tím zajistíme, aby se nám particly trochu otáčely a nevypadaly tak staticky:

Nová překážka

Začneme úpravou mapy. Aby to hráč neměl tak jednoduché a trochu se u hraní zapotil, přetvoříme si strop, na který přidáme bodláky. Na konci článku zas máte základní grafiku ke stažení. Bodláky si naimportujeme do Unity.

Bodlákům dále přidáme collider. Můžeme si zvolit hodně colliderů, přes které to uděláme, ale nám postačí box collider2D. Roztáhneme ho, aby pokrýval celý sprite. Dále také nastavíme Tag na Wall. Vytvoříme si z toho prefab:

Nebudeme chtít, aby se s námi bodláky hýbaly podobně, jako se hýbe mapa. Nevypadalo by to moc hezky, protože by vlastně letěly s námi. Proto je budeme generovat podobně jako stalagy. Nejdříve si spiky třeba 30x nakopírujeme vedle sebe:

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

To prozatím stačí. Dále je budeme za Ereserem posouvat zpět za obrazovku, stejně jako pozadí, čímž docílíme nekonečného efektu, i když jich bude stále jen 30.

Úprava pohybu

Nyní si předěláme pohyb hráče. Když hrajeme, kamera i hráč jsou připoutány k sobě a hráč se stále nachází ve středu. To změníme a uděláme, aby se kamera nepohybovala ve směru osy Y, ale pouze po ose X. Docílíme toho tak, že kameru oddělíme od hráče. Také Ereser si oddělíme od hráče pro použití dále:

Skript kamery

Do kamery si přidáme skript CameraFollowPlayer, díky kterému bude kamera následovat hráče:

public Transform playerRef;
public bool withOffset;
public int offset;

bool error = false;

void Start()
{
    if (playerRef == null)
        error = true;
}

// Update is called once per frame
void Update()
{

    if (error)
        return;
    Vector3 pos = transform.position;
    Vector3 newPos = playerRef.position;

    if (withOffset)
        newPos.x += offset;


    newPos.z = pos.z;
    newPos.y = pos.y;
    transform.position = Vector3.Lerp(transform.position, newPos, 1f);
}

V tomto skriptu nás již nic nepřekvapí kromě funkce Lerp(). Tato funkce zajišťuje plynulý pohyb z bodu A do bodu B. Posledním parametrem říkáme, jak plynule se bude daný objekt posouvat. Jediné, na co nesmíme zapomenout po dodělání skriptu, je přiřadit hráče do proměnné playerRef.

Dále Ereser objektu přidáme také tento skript a za playerRef přiřadíme také Player. Offset nastavíme podle toho, jak vzadu máme Ereser na mapě posunutý na ose Y a odškrtneme WithOffset. V mém případě mám offset nastavený na -25. Ereseru dále také přidáme Rigidbody2D, na kterém nastavíme gravitaci na 0 fixneme úhly:

Skript Ereseru

Ereseru dále upravíme skript, aby posouval jak zdi, tak pozadí. Skript tedy bude vypadat následovně:

void OnTriggerEnter2D(Collider2D col)
{
    if(col.CompareTag("Stalag"))
    {
        if(col != null)
            Destroy(col.gameObject);
    }


    if(col.CompareTag("Wall") || col.CompareTag("Background"))
    {
        col.SendMessage("Move");
    }
}

Kontrolujeme zde, zda se Ereser setkal se zdí a nebo s pozadím, dle toho daný objekt posune.

Aby nám vše fungovalo jak má, přidáme Prefabu našich bodláku skript BGMover a trochu BGMover poupravíme, aby fungoval pro náš nový účel. Odmažeme náš TriggerEnter a přidáme tam tuto metodu:

public int count;

void Move()
{
    Bounds b = GetComponent<SpriteRenderer>().bounds;
    float sizeX = b.size.x;

    Vector3 pos = transform.position;
    pos.x += count * sizeX - 10;
    transform.position = pos;
}

Jelikož jsme skript ho původně používali pouze na pozadí, tak by nám nefungoval na naší novou překážku, která by se neposouvala o požadovaný kus. Tudíž si zavádíme novou proměnnou count, kterou velikost daného objektu budeme násobit. Tudíž na pozadí tuto hodnotu nastavíme na 2, jak bylo původně ve skriptu a pro spiky nastavíme 30, jelikož jsme si vytvořili 30 kopií spiků vedle sebe.

Hru můžeme spustit a vyzkoušet.

V příští lekci, Unity (C#) Android: Start, Skóre, PlayerPrefs, se podíváme na počítač skóre při zdolání překážky a také na počkání na startu, dokud hráč nezačne hrát.


 

Stáhnout

Staženo 17x (8.59 kB)

 

Předchozí článek
Unity (C#) Android: MenuPart, Eraser, pozadí 2
Všechny články v sekci
Tvorba 2D arkády pro Android v Unity
Článek pro vás napsal Jan Kubice
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (6)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!