Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Diskuze: C# a Unity - začátek GameManagera

C# .NET .NET (C# a Visual Basic) C# a Unity - začátek GameManagera American English version English version

Aktivity (3)
Avatar
Miroslav Mazal:7. září 18:06

Zdravím. Rozumím tomuto kódu na začátku hra správně? Řádky od public Board board po public GameObject blackPawn jsou tam proto, že vytvářejí okénka v Inspektoru pro vložení Prefabů. A ta instance GameManagera v GameManageru je tam proč? Ta souvislost mi ještě nějak uniká. Vždyť GameManager běží po spuštění programu nebo ne? Proč musí být ještě jeho instance probuzena v Awake?

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    public Board board;

    public GameObject whiteKing;
    public GameObject whiteQueen;
    public GameObject whiteBishop;
    public GameObject whiteKnight;
    public GameObject whiteRook;
    public GameObject whitePawn;

    public GameObject blackKing;
    public GameObject blackQueen;
    public GameObject blackBishop;
    public GameObject blackKnight;
    public GameObject blackRook;
    public GameObject blackPawn;

    private GameObject[,] pieces;
    private List<GameObject> movedPawns;

    private Player white;
    private Player black;
    public Player currentPlayer;
    public Player otherPlayer;

    void Awake()
    {
        instance = this;
    }

    void Start ()
    {
        pieces = new GameObject[8, 8];
        movedPawns = new List<GameObject>();

        white = new Player("white", true);
        black = new Player("black", false);

        currentPlayer = white;
        otherPlayer = black;

        InitialSetup();
    }

Zkusil jsem: Překládám si hodně anglických tutoriálů.

Chci docílit: Plně do hloubky porozumět každému řádku.

 
Odpovědět 7. září 18:06
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Miroslav Mazal
Martin Petrovaj:7. září 18:23

Z kódu, ktorý si nám sem postol toho veľa nevyčítame ani my - vidíme síce, že GameManager si uloží odkaz na svoju inštanciu ("sám na seba") do statickej, čiže triednej premennej (pravdepodobne teda nejde o žiadne "prebúdzanie" ako si to nazval), ale bez toho, aby sme videli ďalší kód tejto triedy nedokážem povedať, načo vlastne ten statický odkaz slúži. Hodilo by sa vidieť metódy, ktoré s premennou instance nejakým spôsobom pracujú.

Môj osobný predpoklad ale je, že sa pozeráme na implementáciu návrhového vzoru singleton a statický odkaz na inštanciu GameMakeru slúži na zabezpečenie toho, aby existovala / používala sa len jedna inštancia. Ale to je len môj "gut feeling", bez zvyšku kódu ti nič povedať neviem, ani to, či je môj predpoklad správny alebo nie.

Editováno 7. září 18:24
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 7. září 18:23
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Miroslav Mazal:7. září 18:38

Aha. Máš pravdu. Hledal jsem ve scriptech, jestli s tou instancí něco pracuje, jak jsi psal. V tom GameManageru už není o jeho instanci ani zmínka, proto jsem si říkal, že to má asi nějakou probouzecí funkci. Ale našel jsem ho v kódech ostatních scriptů (scriptů šachových figur apod.) Tak si to zkusím nastudovat, jak je tam použitý. Moc dík.

 
Nahoru Odpovědět 7. září 18:38
Avatar
Miroslav Mazal:7. září 18:42

Ale i tak, protože je instance umístěna v Awake, což je v překladu Probudit, tak mi to evokuje, že to má i něco s probuzením v programu....

 
Nahoru Odpovědět 7. září 18:42
Avatar
Miroslav Mazal:7. září 18:48

Je to singleton. Tak se jdu učit, co to je.....

 
Nahoru Odpovědět 7. září 18:48
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Miroslav Mazal
Martin Petrovaj:7. září 18:52

V terminológii, ktorú si zaviedlo Unity je Awake niečo ako udalosť v engine, podobne ako Start, Update, LateUpdate atď. Awake sa volá awake preto, že sa volá vtedy, keď sa "spúšta" alebo "prebúdza" celá hra, nie že by sa vo vnútri metódy Awake mali nejako "prebúdzať" iné objekty :-) Odporúčam prejsť si dodatočne ešte dokumentáciu.

Čiastočne si sa ale trafil, do Awake sa umiestňuje rôzny kód slúžiaci pre inicializáciu, ktorá je nutná na to, aby daný skript po zvyšok hry správne fungoval (teda, časť inicializačného kódu zvykne byť v Awake a čast v Start).

Nahoru Odpovědět 7. září 18:52
if (this.motto == "") { throw new NotImplementedException(); }
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 6 zpráv z 6.