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

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Konstruktor se volá při vytváření objektu, což v Unity tuším už když ho hodíš do scény, zatímco Start se volá až ve chvíli, kdy se inicialuzuje při spuštění hry. Pokud nemáš konkrétní důvod to cpát do konstruktoru, tak bych ty věci nastavoval ve Start().
Mně to sice funguje, ale nejsem si jistý, jestli to správně chápu. A
proto mám v sobě takovou nejistotu a jistý zmatek. Nejde mi jen o funkčnost,
ale abych to fakt pochopil. Co jsem to teda udělal podle toho popisu nahoře?
Start jsem totiž nepoužil. Vytvořil jsem script třídy Kostka, který jsem
připojil k prázdnému GameObject KostkaA.
A takhle jsem ho hodil do GameManagera
public class GameManager : MonoBehaviour {
public Kostka kostkaA;
public Kostka kostkaB;
public Kostka kostkaC;
public Kostka kostkaD;
public Kostka kostkaE;
A až pak je Start. Klidně teď můžu volat metody z KostkaA.
Funkčnost je tady https://www.youtube.com/watch?…
Stisknutím Scape vždy vyberu číslo nebo znak (jako u kostky).
Poradi kodu ma smysl jen uvnitr funkci, pokud prehodis poradi funkce a treba ty kostky, na funkcnost to nema vliv, jestli narazis na tohle.
Keď si píšeš vlastný kód pre Unity a bavíme sa o tomto, potrebujeme rozlišovať dva druhy tried - tie, ktoré sú odvodené od MonoBehaviour a tie, ktoré nie sú.
MonoBehaviour-derived: nepoužívaš konštruktor vôbec, ak potrebuješ niečo nainicializovať, tak do Awake a Start. Konštruktory týchto tried sa správajú nanajvýš zvláštne a nenapadne mi z hlavy situácia, kde by sa to dalo rozumne využiť. Určite to nie je štandardné ani prehľadné.
Ostatné: tu sa už jedná o bežné C# triedy. V Unity Editore sa vo forme komponentov (ako napr. MonoBehaviour skripty, ktoré sa dajú priradiť ku gameobjectom) nevyskytujú, len ich používaš vo svojom ostatnom kóde. Keďže ide o "normálne" triedy, pri vytváraní ich inicializuješ klasicky cez konštruktor.
Aby si lepšie pochopil, čo za čiernu mágiu robí Unity s konštruktormi
pri MonoBehaviours, skús si založiť prázdny projekt a trochu
poexperimentovať - vypisuj do konzoly keď sa zavolá konštruktor, Start,
Awake; skúšaj, čo sa dá a čo nie… Najlepšie je vždy si to vyskúšať a
uvidieť sám
Takže já jsem dělal tu první variantu? Díky přiřazení scriptu ke GameObjectu, kde se odečítá float, mohu příkazem SetActive vypnout GameObject a tím onen script, a ten pak neběží donekonečna a nezatěžuje počítač.
Mohu to tedy takto použít na ten Časovač? Ale jinak raději ne? Já ty prázdné GameObjecty se scriptem(komponentem) mám v Hierarchii, a tím se asi aktivují a tak nemusí být ve Start či Awake. Je to správně?Protože mne to funguje i když ve Start ani Awake nejsou.Mám je v GameManageru nad tím.
Nebude to tým, že samotné kocky nijako špeciálne inicializovať nepotrebuješ (teda Kocka nepotrebuje konštruktor, Start ani Awake) a tým, že v GameManageri si tie kocky potiahol do daných polí v editore?
Pokiaľ si nejaký objekt získaš tým, že ho v editore potiahneš do public premennej napr. GameManagera, tak už ho nepotrebuješ nejako získavať v Awake / Start. Pokiaľ by si ale chcel / potreboval kocky vyhľadať a v GameManageri uložiť z kódu, pravdepodobne by si to robil v Awake / Start v GameManageri.
Takže když to shrnu. Všechny scripty v Unity se píší odvozením z MonoBehaviour. Ale nemám používat metodu vytvoření prázdného GameObjectu a přiřazení Scriptu jako komponentu a nahrazovat tak klasický konstruktor. Je to tak?
Aha ne. Buď budu používat konstruktory v MonoBehaviour a inicializovat je přes Start Awake, anebo bez MonoBehaviour klasickými konstruktory C#. Ale všechny tutoriály pro Unity jsou asi v MonoBehaviour, aspoň, co jsem zatím viděl např. šachy.
Skúsim radšej od začiatku:
To by sme mali skripty-komponenty odvodené od MonoBehaviour. Teraz ku triedam, ktoré z MonoBehaviour nededia:
A poznámka na záver:
Super. Moc díky. Večer budu studovat.
Ahoj. První půlku jsem věděl, ale tu druhou studuji. Vytisknul jsem si všechny scripty Šachů z tutoriálu https://www.raywenderlich.com/…e-with-unity a snažím se pochopit, jak jsou propojené. Až když jsi mi to rozepsal, tak jsem si všiml, že opravdu některé scripty nejsou v přímo v MonoBehaviouru. Pochopil jsem to takto:
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();
}
Snad jsem to všechno pochopil. I díky tobě. Asi je to tak, že z pohledu tebe, jako zkušeného programátora v C# je možná někdy lepší jiný postup. Ale ten, který je neflexibilní, je brán jako návod na oficiálních stránkách Unity. To samé mi řekl jeden C# programátor, že Unity opustil, protože dělají věci prý nějak "divně".
Moc díky za takový pracný rozbor. Nikdy bych spoustě věcí nerozuměl, kdyby jsme to tak nerozpitvali.
Zobrazeno 13 zpráv z 13.