IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

25. diel - Unity (C #) Android: Vylepšenia pľuvanie ohňa

V predchádzajúcej lekcii, Unity (C #) Android - Publikovanie na Google Play , sme nahrali hru na Google Play store.

V minulej lekcii, Unity (C #) Android - Publikovanie na Google Play , som sa zaoberal štruktúrou pľuvanie ohňa a ako ho vlastne celý dať do kopy.

Dnešná tutoriál sa bude točiť opäť okolo pľuvanie ohňa a to najmä preto, že v komentároch na YouTube pristál nápad, ako aktivovať pľuvanie ohňa.

Video

Nový PlayerMoveScript

Upravený PlayerMoveScript prináša ovládanie a aktiváciu ohňa:

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

public class PlayerMoveScript : MonoBehaviour
{
    public LayerMask touchControlLayerMask;


    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))
            {
                if(RaycastingDragon(Input.mousePosition))
                    ActivateFire();


                vel = Flap(vel);
            }
        }
        else
        {
            if (Input.touches.Length > 0)
            {
                vel = Flap(vel);
            }
        }

        vel.x = speed * Time.deltaTime;

        rigidbody2D.velocity = vel;


        RotateMe(vel.y);
    }

    private bool RaycastingDragon(Vector3 mousePos)
    {
        Ray r = Camera.main.ScreenPointToRay(mousePos);
        RaycastHit2D hit = Physics2D.Raycast(r.origin, r.direction, Mathf.Infinity, touchControlLayerMask);

        if (hit.collider == null)
        {
            return false;
        }
        return true;
    }

    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);
    }

}

Ako hra vyzerá teraz?

Hra v C# .NET Unity 3D - Tvorba 2D arkády pre Android v Unity

Problémy?

Ak máte nejaké otázky, neváhajte sa opýtať v komentároch alebo mi napísať do správ.

V budúcej lekcii, Unity (C #) Android: Návrat do menu , pridáme ukončenie hry.


 

Predchádzajúci článok
Unity (C #) Android - Publikovanie na Google Play
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Preskočiť článok
(neodporúčame)
Unity (C #) Android: Návrat do menu
Článok pre vás napísal vratislavino
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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.
Aktivity