C# týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Lekce 20 - Unity (C#) Android: Plivání ohně

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: Asynchronní načtení scény, jsem se zabýval asynchronním načtením scény, tudíž se eliminoval zásek před startem herní scény.

Dnešní tutoriál přinese novou funkcionalitu a tou je plivání ohně, které nám umožní ničit stalagy, než do nich narazíme. Zároveň jsem vytvořil omezení, že oheň můžete použít za hru pouze 5x.

Video

Nový PlayerMoveScript

Upravený PlayerMoveScript přináší ovládání a aktivaci ohně:

using UnityEngine.UI;
using UnityEngine;
using System.Collections;

public class PlayerMoveScript : MonoBehaviour
{

    public Text countOfFireText;

        float flapAmount = 10;
        public float speed = 150;

        bool android;

    bool started = false;

    private bool paused = false;
    private Quaternion pausedRotation;

    public GameObject pauseIndicator;

    Animator anim;

    private bool didFlap = false;

    private GameObject flame;

    private float fireLength = 2;
    private float currentFlameTime = 0;
    private bool currentlyFlaming = false;

    private int countOfFires = 5;


        // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();

        flame = transform.GetChild(0).gameObject;

        if (Application.platform == RuntimePlatform.Android)
            android = true;
        else
            android = false;
    }



        // Update is called once per frame
        void Update ()
        {
            if (currentlyFlaming)
            {
                if (currentFlameTime <= 0)
                {
                    currentFlameTime = 0;
                    DeactivateFire();
                }
                else
                {
                    currentFlameTime -= Time.deltaTime;
                }
            }




            if (Input.GetKeyDown(KeyCode.Escape))
        {
            paused = !paused;
            if (paused)
            {
                Time.timeScale = 0;
                //pauseIndicator.enabled = true;
                pauseIndicator.SetActive(true);
                pausedRotation = transform.rotation;
            }
            else
            {
                Time.timeScale = 1;
                //pauseIndicator.enabled = false;
                pauseIndicator.SetActive(false);
            }
        }

            if (paused)
            {

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

                transform.rotation = pausedRotation;
                return;
            }

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

            return;
        }


                Vector3 vel = rigidbody2D.velocity;


            if (didFlap)
            {
                didFlap = false;
                vel = Flap(vel);
            }

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

            if (Input.GetMouseButtonDown(1) || Input.GetKeyDown(KeyCode.LeftControl))
            {
                vel = Flap(vel);
                ActivateFire();
            }
        }
        else
        {
            if (Input.touches.Length > 0)
            {
                vel = Flap(vel);
            }
        }

                vel.x = speed * Time.deltaTime;

                rigidbody2D.velocity = vel;


        RotateMe(vel.y);
        }

    void StartGame()
    {
        started = true;
        rigidbody2D.gravityScale = 2.5f;

        Vector3 vel = rigidbody2D.velocity;
        vel = Flap(vel);

        rigidbody2D.velocity = vel;
    }

    void RotateMe(float y)
    {
        // -20, 10
        // -70, 0

        // 0 -70

        if(y >= 0)
        {
            transform.rotation = Quaternion.Euler(0, 0, 0);
        }
        else
        {
            float angle = Mathf.Lerp(0, -70, -y);
            transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angle), 0.05f);
        }
    }

    Vector3 Flap(Vector3 v)
    {
        anim.SetTrigger("DoFlap");
        v.y = flapAmount;
        return v;
    }

    void ActivateFire()
    {
        if (countOfFires <= 0)
            return;

        countOfFires--;
        countOfFireText.text = "Fire count avalible: " + countOfFires;
        currentlyFlaming = true;
        flame.SetActive(true);
        currentFlameTime = fireLength;
    }

    void DeactivateFire()
    {
        currentlyFlaming = false;
        flame.SetActive(false);
    }

}

Upravení StalagScriptu

using UnityEngine;
using System.Collections;

public class StalagScript : MonoBehaviour {

    public GameObject parts;

    void React()
    {
        //print("destroyed");
        Destroy(Instantiate(parts, transform.position, Quaternion.identity), 2);
        Destroy(gameObject);
    }

}

Vytvoření nového skriptu: FlameCollider

using UnityEngine;
using System.Collections;

public class FlameCollider : MonoBehaviour {
// psala mi velká spousta lidí, že jim nefungují kolize. V 95% případů je to dáno špatnou velikostí písmen v hlavičce této metody, dejte si na to pozor :)
    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.tag == "Stalag")
        {
            col.SendMessage("React");
        }
    }
}

Jak hra vypadá nyní?

Hra v C# .NET Unity 3D

Problémy?

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

V příští lekci, Unity (C#) Android: Vylepšení plivání ohně, změníme ovládání plivání ohně.


 

 

Článek pro vás napsal vratislavino
Avatar
Jak se ti líbí článek?
1 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: Asynchronní načtení scény
Všechny články v sekci
Programování her v Unity3D v C# .NET
Miniatura
Následující článek
Unity (C#) Android: Vylepšení plivání ohně
Aktivity (3)

 

 

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í!