NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Unity Engine a sfetovaný script (Unity)

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Mára
Člen
Avatar
Odpovídá na Neaktivní uživatel
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Mára
Člen
Avatar
Odpovídá na Neaktivní uživatel
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Mára
Člen
Avatar
Odpovídá na Neaktivní uživatel
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Mára
Člen
Avatar
Odpovídá na Neaktivní uživatel
Mára:17.12.2017 11:08

Aha :D jj pohoda

 
Nahoru Odpovědět
17.12.2017 11:08
Avatar
Odpovídá na Neaktivní uživatel
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
17.12.2017 11:26
Avatar
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel: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
Neaktivní uživatelský účet
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
18.12.2017 7:40
Avatar
Odpovídá na dez1nd
Neaktivní uživatel:16.5.2018 8:26

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

Nahoru Odpovědět
16.5.2018 8:26
Neaktivní uživatelský účet
Avatar
dez1nd
Člen
Avatar
Odpovídá na Neaktivní uživatel
dez1nd:16.5.2018 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.5.2018 8:59
Avatar
Odpovídá na dez1nd
Neaktivní uživatel:28.5.2018 21:32

Jasně tak to zas máš pravdu..

Nahoru Odpovědět
28.5.2018 21:32
Neaktivní uživatelský účet
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.