Avatar
Tomáš Slanina:16.12.2017 16:17

Zdravím, začal jsem dělat hru flappy bird abych se trošku natrénoval a všechno jde podle plánů ale při vytváření
textu Game Over se mi můj GameSetup script začal chovat trošku divně. Jelikož samozdřejmě nechci aby mi tam hned ze začátku hry stál text Game Over tak jsem do původní metody GameOver() vložil tento řádek gameover_text­.SetActive(tru­e); a v inspectoru deaktivoval daný text tak jsem po zavolání metody dostal do console jen řádek Game over (původně jsem ho tam měl když jsem nastavoval kolize) a text se neobjevil zdá se že se mu do toho nějak nechce :D Zde hodím třídy:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameSetup : MonoBehaviour {

        public GameObject gameover_text;
        public GameObject player;
        public GameObject ground;

        void Start () {
        Instantiate (player, new Vector3 (-12, 5, 0), Quaternion.identity);
                Instantiate (ground, new Vector3 (0, -9, 0), Quaternion.identity);
                Instantiate (ground, new Vector3 (0, 9, 0), Quaternion.identity);
        }

    public void GameOver()
    {
        gameover_text.SetActive(true); // zde aktivuji
        Debug.Log("Game Over");
    }
}

Volající třída:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCollisons : MonoBehaviour {

    public GameObject GS_handler;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.otherCollider.tag == "ScoreGate")
        {
            Physics2D.IgnoreCollision(gameObject.GetComponent<Collider2D>(), collision.otherCollider);
        }
        else
        {
            GS_handler.GetComponent<GameSetup>().GameOver(); //zde volám
        }
    }
}
Editováno 16.12.2017 16:20
 
Odpovědět 16.12.2017 16:17
Avatar
Mára
Člen
Avatar
Odpovídá na Tomáš Slanina
Mára:17.12.2017 7:13

Zkus se podívat, jestli jsi v Unity nevypnul Canvas, pod kterým je ten Text, v tom případě možná aktivuješ ten text, ale ten Canvas, kterého je dítětem / childem se neaktivuje - proto nejde vidět.
A ještě poradím jednu dobrou praktiku, a to uchovávání Vector3 - vlastně čehokoli, co se možná bude měnit v public proměnných, je to přehlednější.

 
Nahoru Odpovědět 17.12.2017 7:13
Avatar
Tomáš Slanina:17.12.2017 9:04

Canvas je aktivovaný proto mě právě taky zaujalo proč to nefunguje :) Snažím se uchovávat většinu nastavení v proměnných ale ty vectory jsem nechtěl uchovávat protože mi přišlo zbytečné přidávat další řádky kódu, kód je krátký a myslím že přehledný samozdřejmě že když tam budu dávat třídu o 90 řádcích tak to udělám přehlednější ale u tohoto ne...

 
Nahoru Odpovědět 17.12.2017 9:04
Avatar
Mára
Člen
Avatar
Odpovídá na Tomáš Slanina
Mára:17.12.2017 9:52

Zkus gameover_text brát jako Text a ne jako GameObject, nebo mě ještě tak napadá, že bys mohl zkusit aktivovat ten Canvas, který bys defaultně dal disabled, s tím, že jeho potomci by byli aktivovaní.
Pak bych ještě doporučil mrknout na tenhle kód, pokud bys to chtěl udělat postupně a ne naráz.

// fades in and out
    public IEnumerator AppearText(Text text)
    {
        StartCoroutine(FadeTextToFullAlpha(0.25f, text));

        if (!isFading)
        {
            isFading = true;
            yield return new WaitForSeconds(2f);
            isFading = false;
            StartCoroutine(FadeTextToZeroAlpha(0.25f, text));
        }
    }

    // fades in
    public IEnumerator FadeTextToFullAlpha(float t, Text i)
    {
        i.color = new Color(i.color.r, i.color.g, i.color.b, 0);
        while (i.color.a < 1.0f)
        {
            i.color = new Color(i.color.r, i.color.g, i.color.b, i.color.a + (Time.deltaTime / t));
            yield return null;
        }
    }

    // fades out
    public IEnumerator FadeTextToZeroAlpha(float t, Text i)
    {
        i.color = new Color(i.color.r, i.color.g, i.color.b, 1);
        while (i.color.a > 0.0f)
        {
            i.color = new Color(i.color.r, i.color.g, i.color.b, i.color.a - (Time.deltaTime / t));
            yield return null;
        }
    }
 
Nahoru Odpovědět 17.12.2017 9:52
Avatar
Tomáš Slanina:17.12.2017 10:18

Už jsem asi našel problém.. Není to scriptem ale editorem v editoru je to vidět ale ve hře ne trošku jsem si s tím zkoušel pohrát ale nic :(

 
Nahoru Odpovědět 17.12.2017 10:18
Avatar
Mára
Člen
Avatar
Odpovídá na Tomáš Slanina
Mára:17.12.2017 10:20

Aha tak to mě napadá asi jen podívat se, v jaké vrstvě se to vykresluje - jestli se například background nevykreslí "nad" tím textem.

 
Nahoru Odpovědět 17.12.2017 10:20
Avatar
Tomáš Slanina:17.12.2017 10:31

To mě taky napadlo jen nevím kde to mám hledat :D

 
Nahoru Odpovědět 17.12.2017 10:31
Avatar
Tomáš Slanina:17.12.2017 10:39

Vyřešeno bylo to špatným nastavením na screen space - camera ale i tak díky za pomoc :D

 
Nahoru Odpovědět 17.12.2017 10:39
Avatar
Mára
Člen
Avatar
Odpovídá na Tomáš Slanina
Mára:17.12.2017 11:08

Aha :D jj pohoda

 
Nahoru Odpovědět  +1 17.12.2017 11:08
Avatar
Odpovídá na Tomáš Slanina
Idontknowwhatimdoing:17.12.2017 11:26

Učíš sa z originálnych tutoriálov ? Vedel by si mi vysvetliť podrobne čo znamená Rigidbody,Ray­Cast,BoxColli­der,Transform? Lebo po anglicky tomu nerozumiem uplne

 
Nahoru Odpovědět  -2 17.12.2017 11:26
Avatar
Tomáš Slanina:17.12.2017 13:58

Nejde říct o to že bych se učil já hledám cokoliv co by šlo použít v Manuálu (https://docs.unity3d.com/…l/index.html)... Rigidbody je třída na veškerou fyziku (gravitace, pohyby), s raycasty neumím ale jdou použít na vypočítávání vzdálenosti vzdušnou čarou, Boxcollider je collider což je třída co se stará o kolize a podobně (jde použít třeba na detekci kolizí) collider je jednoduše hranice objektu takže collider nemůže projít colliderem, transform se stará o pozice v prostoru rotaci a velikost :)

 
Nahoru Odpovědět 17.12.2017 13:58
Avatar
Tomáš Slanina:17.12.2017 14:07

Tak teď mi to zas hlásí že je GameScriptHandler inactive ale je active tak.. :D

 
Nahoru Odpovědět 17.12.2017 14:07
Avatar
dez1nd
Člen
Avatar
dez1nd:18.12.2017 7:40

collider nemůže projít colliderem = při nastavení collideru na trigger to není pravda
Raycast = paprsek(přímka) z bodu do určitého směru na určitou vzdálenost
Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycas­tLayers, QueryTriggerIn­teraction queryTriggerIn­teraction = QueryTriggerIn­teraction.Use­Global); , jako počáteční bod si můžeš představit hlaveň zbraně a jako směr udat kam zbraň míří takže Vector3.Forward, tato přímka sebou nese informace o objektu na který zrovna míříš (vzdálenost, veškeré public vlastnosti a metody a případný bod na objektu kam dopadá paprsek = třeba pro informace kde zobrazit díru po kulce)

Editováno 18.12.2017 7:41
 
Nahoru Odpovědět  +2 18.12.2017 7:40
Avatar
Odpovídá na dez1nd
Tomáš Slanina:16. května 8:26

Jasně ale nebudu začátečníkovi vysvětlovat jak funguje trigger :D

 
Nahoru Odpovědět 16. května 8:26
Avatar
dez1nd
Člen
Avatar
Odpovídá na Tomáš Slanina
dez1nd:16. května 8:59

To je podle mě chyba :) Jednou na to může doplatit, až se bude pídit po tom. Proč mu proboha GameObject nekoliduje s jiným když oba mají collider :)

 
Nahoru Odpovědět 16. května 8:59
Avatar
Odpovídá na dez1nd
Tomáš Slanina:28. května 21:32

Jasně tak to zas máš pravdu..

 
Nahoru Odpovědět 28. května 21:32
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 16 zpráv z 16.