Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

27. diel - Unity (C #) Android: Koniec hry

V minulej lekcii, Unity (C #) Android: Návrat do menu , som sa zaoberal možnosťou kedy sa môže hráč ešte pred začiatkom hry vrátiť do menu.

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Dnešné tutoriál už naplní mnou dlho dávaný sľub, kedy som hovoril, že urobím koniec hry. Zároveň mi prišlo ako dobrý nápad vytvoriť tlačidlo, ktoré je voľne škálovateľné, teda bez deformácie alebo straty kvality.

Video

Nový PlayerMoveScript

Upravený PlayerMoveScript prináša detekciu smrti.

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

public class PlayerMoveScript : MonoBehaviour
{
    public LayerMask touchControlLayerMask;

    public GameObject StartGameButtonPanel;

    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;

    private bool died = false;

    // 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 (died)
        {
            Vector3 velDied = rigidbody2D.velocity;
            velDied.x = 0;
            rigidbody2D.velocity = velDied;
            return;
        }



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

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

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

        rigidbody2D.velocity = vel;


        print("Called start game 1");

        StartGameButtonPanel.SetActive(false);
    }

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

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

        rigidbody2D.velocity = vel;

        print("Called start game 2");

        StartGameButtonPanel.SetActive(false);
    }

    public void RestartGame()
    {
        Application.LoadLevel(Application.loadedLevel);
    }

    public void BackToMenu()
    {
        Application.LoadLevel("menu_4");
    }

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

    public void Died()
    {
        died = true;
    }
}

Upravený HealthScript

using UnityEngine;
using System.Collections;

public class HealthScript : MonoBehaviour {

    int health = 100;
    float initSize;

    bool dead = false;

    public Animator PlayerAnimator;
    private PlayerMoveScript playerMoveScript;

    public GameObject buttonsPanel;

    // Use this for initialization
    void Start ()
    {

        playerMoveScript = PlayerAnimator.GetComponent<PlayerMoveScript>();

        initSize = transform.localScale.x;
        health = 100;
        RefreshScore();
    }

    public int Hit(int damage)
    {
        if (dead)
            return 0;


        health -= damage;
        RefreshScore();

        if (health <= 0)
            Die();

        return health;
    }

    void Die()
    {
        PlayerAnimator.SetTrigger("DiedTrigger");
        dead = true;
        playerMoveScript.Died();
        buttonsPanel.SetActive(true);
    }

    void RefreshScore()
    {
        //transform.GetChild(0).guiText.text = "Health: " + health;

        Vector3 scale = transform.localScale;
        scale.x = initSize / 100 * health;
        transform.localScale = scale;
    }
}

Ako hra vyzerá teraz?

pridaná tlačidlá

Problémy?

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


 

 

Článok pre vás napísal vratislavino
Avatar
Ako sa ti páči článok?
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.
Predchádzajúci článok
Unity (C #) Android: Návrat do menu
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Miniatúra
Nasledujúci článok
Unity (C #) Android: Publikovanie na Google Play
Aktivity (1)

 

 

Komentáre

Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!