Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Lekce 2 - Unity (C#) Android: Pohyb, grafika, particles

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Unity (C#) Android: Nastavení prostředí, jsme si Unity nastavili na Android." Druhá lekce se zabývá hráčem: pohybem, grafikou a particles.

Video

Vytvoření hráče

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

Přidávám skript, který je použit ve videu, pokud se vám ho nechce opisovat :)

using UnityEngine;
using System.Collections;

public class PlayerMoveScript : MonoBehaviour {

        float flapAmount = 10;
        public float speed = 150;
        Rigidbody2D rigid;
        bool android;

        // Use this for initialization
        void Start () {

                rigid = GetComponent<Rigidody2D>();
                if (Application.platform == RuntimePlatform.Android)
                        android = true;
                else
                        android = false;
        }

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

                Vector3 vel = rigid.velocity;
                print (vel);

                if (!android)
                {
                        if (Input.GetMouseButtonDown (0) || Input.GetKeyDown(KeyCode.Space))
                        {
                                vel = Flap(vel);
                        }
                }
                else
                {
                        if(Input.touches.Length > 0)
                        {
                                vel = Flap(vel);
                        }
                }

                vel.x = speed * Time.deltaTime; // plynulý pohyb dopředu

                rigid.velocity = vel; // upravenou hodnotu ve 'vel' uložíme zpět jako vlastnost rigidbody2D
        }

        Vector3 Flap(Vector3 v) // funkce, která se postará, aby nám fireball popolétl
        {
                v.y = flapAmount;
                return v;
        }

}

Jak hra vypadá teď?

Problémy?

Pokud máte nějaké otázky ohledně nastavování, neváhejte se zeptat v komentářích, nebo mi napsat do zpráv.

V příští lekci, Unity (C#) Android: Generování stalagů, se budeme věnovat tvoření mapy.


 

 

Článek pro vás napsal vratislavino
Avatar
Jak se ti líbí článek?
8 hlasů
Autor se věnuje programování v C#, především pak ve vývojovém prostředí Unity3D. Má asi pětileté zkušenosti s programováním a momentálně pracuje na připravované hře Azulgar: Beyond The Frontiers.
Předchozí článek
Unity (C#) Android: Nastavení prostředí
Všechny články v sekci
Programování her v Unity3D v C# .NET
Miniatura
Následující článek
Unity (C#) Android: Generování stalagů
Aktivity (5)

 

 

Komentáře

Avatar
Vojtěch Jelínek (Slepice1):9.7.2014 21:47

Pár otázek:

  1. Proč používáš Vector3 když rigigbody2D pracuje především s Vector2?
  2. Proč nepoužíváš AddForce funkci pro Flap?
  3. Nešlo by android input zpracovat takto:
if (Input.GetMouseButtonDown (0) || Input.GetKeyDown(KeyCode.Space) || Input.touches.Length > 0)
Editováno 9.7.2014 21:47
 
Odpovědět  +1 9.7.2014 21:47
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Vojtěch Jelínek (Slepice1)
vratislavino:10.7.2014 12:00

Ahoj,

  1. Vector3 používám ze zvyku. Samozřejmě se Vector2 bude chovat stejně a měl by brát méně paměti. Nicméně, třeba souřadnici Z ještě použijeme :)
  2. AddForce je jedno mnoha řešení. Je to stejné jako ptát se, proč někdo gravitaci přidává pomocí
velocity.y -= Physics.gravity * Time.deltaTime

a někdo prostě zaškrtne Use Gravity :)

  1. Pokud jde o jednoduchý tap, tvé řešení použít lze. Ale protože počítám s nějakými dalšími nápady od fanoušků, něchávám si mobilní ovládání odděleně, protože pokud budu chtít později pracovat například s možností Touch.phase, jenom by se to pletlo s ovládáním myši a podmínka by se musela dát tam. Mám to raději takhle odděleně, přijde mi to i přehlednější. :)

Ale děkuji za komentář :)

Odpovědět 10.7.2014 12:00
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Odpovídá na vratislavino
Vojtěch Jelínek (Slepice1):10.7.2014 14:30

U dvojky jde spíš o to že tady to takový problém není ale, pokud by player collidoval s jinými objekty tak by to mohlo dělat problémy, http://gamedevelopment.tutsplus.com/…e--cms-21418 jedná se sice o 3D Unity ale podobné věci to může způsobovat i ve 2D.

 
Odpovědět 10.7.2014 14:30
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Vojtěch Jelínek (Slepice1)
vratislavino:10.7.2014 15:51

Nikdy jsem se s takovým problémem nesetkal :) když jsem programoval volleyball, tak jsem podle Z souřadnice měnil velikost míče a zároveň jsem díky tou porovnával, jestli to přeletělo síť. Pokud používáš při detekování kolize přes OverlapCircle depth (myslim, že je to 3. parametr), nemělo by to dělat problémy :)

Odpovědět 10.7.2014 15:51
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
tomasd49
Redaktor
Avatar
tomasd49:18.1.2015 19:06

hezký tutoriál i když v textové podobě by byl lepší :)
Když na začátku přidáváš pozadí do scény, má jako typ textury "texturu" nebo "Sprite(2D and UI)"? Když jsme ho měl defaultně jako texturu, tak mi nešel přidat do scény...

Editováno 18.1.2015 19:06
 
Odpovědět 18.1.2015 19:06
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na tomasd49
vratislavino:19.1.2015 0:31

Ahoj, díky :) už jsem na to někde odpovídal, Unity je víc klikací než písemný, proto mi přijde video lepší. Když jde o 2D prostředí, vše se staví na Spritech.
Když zakládáš projekt, je tam nastavení na 2D už při zakládání, to ti při importu udělá vždycky z obrázku sprite. Pokud nastavíš na 3D, bude se defaultně přidávat jako Texture, potom to půjde jen jako textura u materiálu (popř nějaký GUITexture), ale pokud chceš samotný obrázek, musíš to přehodit na Sprite :)

Odpovědět 19.1.2015 0:31
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
davidzita.wolf:11.2.2015 14:49

ahoj. Moho by si sem pridat tie textury na stiahutie. Alebo spravit tutorial ako spravit vlasnu texutru

 
Odpovědět 11.2.2015 14:49
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na davidzita.wolf
vratislavino:11.2.2015 15:32

Ahoj, už u prvního dílu v komentářích je odkaz na použitou grafiku :)
https://drive.google.com/…QmNKVlk/view

Odpovědět 11.2.2015 15:32
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Matěj Machotka:9.12.2015 19:37

Ahoj, od Unity 5.0 je potřeba v kódu vyměnit řádek:
Vector3 vel = rigidbody2D.ve­locity; ZA: Vector3 vel = GetComponent<Ri­gidbody>().ve­locity;
VS mi už nehlásí chyby, ale Unity hlásí:
MissingComponen­tException: There is no 'Rigidbody' attached to the "Player" game object, but a script is trying to access it. You probably need to add a Rigidbody to the game object "Player". Or your script needs to check if the component is attached before using it. UnityEngine.Ri­gidbody.get_ve­locity () (at C:/buildslave/u­nity/build/ar­tifacts/genera­ted/common/mo­dules/Dynamic­sBindings.gen­.cs:784)
PlayerMove1.Update () (at Assets/Scripts/Pla­yerMove1.cs:24)
Tušil by někdo proč?

Odpovědět  +1 9.12.2015 19:37
Hranice mezi šíleností a genialitou je malá, ale každý nápad se zdá být zezačátku šíleností.
Avatar
David
Člen
Avatar
David :9.12.2015 22:02

podle té chyby bych neřekl, že je problém v kodu, ale tím že jsi asi zapomněl na objekt, který se jmenuje Player dát komponentu Rigidbody a tím že ji v kodu využíváš tak vzniká chyba, ale nejsem si jistý

 
Odpovědět 9.12.2015 22:02
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Matěj Machotka
vratislavino:10.12.2015 19:05

Ahoj, David Endrych má pravdu, pravděpodobně jsi zapomněl na objekt Player přidat komponentu Rigidbody 2D.
Co se týče kódu, který jsi napsal (ohledně změny od Unity 5), rád bych jen dodal, že pokud je ta část s GetComponent v metodě Update, je to značné zpomalení. Takovou komponentu stačí získat jen jednou, proto je lepší si vytvořit proměnnou například Rigidbody2D rigid = null; už před metodou Start, to znamená, že to bude proměnná třídy, řekněme globální. Do metody Start pak stačí přidat řádek, který vytvořenou proměnnou naplní.
rigid = GetComponent<Ri­gidbody2D>();

Když video otevřeš na YouTube, uvidíš, jak to má vypadat, už se na to ptalo několik lidí :-)

Odpovědět 10.12.2015 19:05
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Matěj Machotka:13.12.2015 17:13

Díky za rady, chyba byla v kódu, zapomněl jsem na 2D a odkazoval jsem na GetComponent<Ri­gidbody>();
Teď mi Unity hlásí Assets/Scripts/Pla­yerMove1.cs(24,32): error CS1525: Unexpected symbol `<internal>'. Kód jsem celý přepsal, ale pořád stejný error. Přikládám zdroják, díky za jakoukoli pomoc.

using UnityEngine;
using System.Collections;

public class PlayerMoveScript : MonoBehaviour
{

    float flapAmount = 10;
    public float speed = 150;
    bool android;
    Rigidbody2D rigid = null;

    void Start()
    {
        // bool android
        if (Application.platform == RuntimePlatform.Android)
            android = true;
        else
            android = false;
    }

    void Update()
    {
        rigid = GetComponent<Rigidbody2D>(); //do rigid si ukladam Rigidbody2D
        Vector3 vel = rigid.velocity;


        if (!android)
        {
            if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))
            {
                vel = Flap(vel); //vel = Flap(Vector2 v)
            }
        }
        else
        {
            if (Input.touches.Length > 0)
            {
                vel = Flap(vel); //vel = Flap(Vector2 v)
            }
        }

        vel.x = speed * Time.deltaTime; // pohyb vpred

        rigid.velocity = vel; // vel ulozim do rigid
    }

    Vector3 Flap(Vector3 v) // flap o flapAmount
    {
        v.y = flapAmount;
        return v;
    }

}
Odpovědět 13.12.2015 17:13
Hranice mezi šíleností a genialitou je malá, ale každý nápad se zdá být zezačátku šíleností.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Matěj Machotka
vratislavino:13.12.2015 17:39

Ahoj, když přečteš chybu, zjistíš, že chyba je v souboru PlayerMove1.cs, takže pravděpodobně pracuješ se špatným souborem, Unity si překládá všechny skripty, projdi si Assets a smaž soubor PlayerMove1.cs

Odpovědět 13.12.2015 17:39
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Matěj Machotka:13.12.2015 19:18

Soubor jsem nenašel, tak jsem vymazal všechny scripty a vytvořil nový, jediný, se stejným kódem a jméno scriptu sedí s tím co je v componentu. Ale Unity mi stále píše stejnou chybu u scriptu který tam mám vložený. Assets/Scripts/Pla­yerMoveScript­.cs(22,32): error CS1525: Unexpected symbol `<internal>. Když chybu označím v VS tak se mi označí Rigidbody2D jak u deklarování proměnné:

Rigidbody2D rigid = null;

tak u:

rigid = GetComponent<Rigidbody2D>();

Moc díky za cokoli :)

Odpovědět 13.12.2015 19:18
Hranice mezi šíleností a genialitou je malá, ale každý nápad se zdá být zezačátku šíleností.
Avatar
Ladislav Gina:10.3.2016 22:31

Zdravím vás, tady všechny rad bych se vás tady zeptal všech. Chtěl bych si vytvořit svoji vlastní 2D hru. Problem je v tom ze Jsem zacatecnik a neumim psat v Jave, poradil by ste mi někdo prosim co se mam naučit.. jakej program stahnou, koukal jsem tutorialy v unity3D ze se to da vytvorim v tom programu. Možna moje požadavky jsou složite, jde mi o obycejnou skakačku, a nějake další vlastností aby uměla figurka. Prosim o radu.

 
Odpovědět 10.3.2016 22:31
Avatar
hhoker
Člen
Avatar
hhoker:9.8.2016 12:19

Ahoj, jsem začátečník, proto budou moje otázky trochu vlažné. Jakým způsobem mohu hru pustit pokud nemám k dispozici telefon s androidem? Ve visual studiu mám Android emulator, ale nevím jak pustím .apk soubor. A lze udělat tu samou hru se stejným kódem i pro iOS? Díky

 
Odpovědět 9.8.2016 12:19
Avatar
John Sníh
Člen
Avatar
John Sníh:21.8.2016 16:00

Nevim proč, ale když jsem to nahrál do mobilu tak dotyk na obrazovku nefungoval. koule ubec nereagovala. A To jsem opsal přesně podle tvého kódu + s opravou Vector3 vel = GetComponent<Ri­gidbody2D> ().velocity;
A v počítači zase nereagovala myš :-(

 
Odpovědět 21.8.2016 16:00
Avatar
John Sníh
Člen
Avatar
Odpovídá na Ladislav Gina
John Sníh:21.8.2016 19:06

Ladislav Gina: Pokud Ti mohu poradit ze svých začátečnických zkušeností tak se nauč tady ze stránek základy java kodu a zaklady OOP java. java je nejvyžívanější programovací jazyk. Určitě než přejdeš na Unity což je nejlepší možnost pro vyvíjení her na android se tyhle základy nauč.

 
Odpovědět 21.8.2016 19:06
Avatar
John Sníh
Člen
Avatar
John Sníh:22.8.2016 15:27

Dobrý už to funguje :-)

 
Odpovědět 22.8.2016 15:27
Avatar
Viktor Abel
Člen
Avatar
Odpovídá na Matěj Machotka
Viktor Abel:28.1.2017 22:34

Zkus smazat cely projekt v unity a vytvořit nový a vše napsat úplně znova. Mě to po výměně příkazu "Vector3 vel = rigidbody2D.ve­locity;" za "Vector3 vel = GetComponent<Ri­gidbody2D>().ve­locity;" jede úplně v pohodě... Měl jsem akorát problém že (Vector3 vel = GetComponent<Ri­gidbody2D>().ve­locity;) tento řádek jsem vložil přes ctrl+c z webu a ve visualu studiu ok, ale v unity to psalo v náhledu "Vector3 vel = GetComponent<Ri-gidbody2D>().ve­locity;" Dlouho jsem to řešil a pak jsem to Rigidbody2D přepsal ve visualu ručne a už je to bez pomlčky i v unity :)

 
Odpovědět 28.1.2017 22:34
Avatar
Adam Bouček
Člen
Avatar
Adam Bouček:17. března 17:22

Zdravím, mám tento problém s Visual Studiem. Nevím, jestli je to verzí nebo čím. Děkuji za pomoc.

 
Odpovědět 17. března 17:22
Avatar
Michal Jančula:21. srpna 10:48

Zdravím, chci se zeptat jestli by mi někdo poradil, jak udělat jednoduše aby postava kterou mám skočila max 2 krát a pak musela dopadnout znova na zem než bude moci zase skákat.

 
Odpovědět 21. srpna 10:48
Avatar
Tomaso7
Člen
Avatar
Odpovídá na Michal Jančula
Tomaso7:21. srpna 13:09

Budeš mít někde proměnnou ve které bude kolikrát postava skočila a když dopadne na zem, tak se vynuluje. Viz. pseudokód.

int jumpsCount = 0;
int maxJumps = 2

void getInput()
{
        if(Input.KeyPressDown(KeyCode.Space) && jumpsCount < maxJumps)
                jump();
}

void jump()
{
        //jump code..
        jumpsCount++;
}

Pak už záleží, jak a kde detekuješ kolizi se zemí, kde tu proměnnou budeš nulovat.

Editováno 21. srpna 13:09
 
Odpovědět 21. srpna 13:09
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.

Zobrazeno 23 zpráv z 23.