Diskuze: [Unity 3D] Jak dostat metody z třídy získané přes MonoScript.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 6 zpráv z 6.
//= 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.
Pokud voláš čistě metodu GetComponent(), voláš ji na GameObject, ke kterému máš přiřazený tento script, je to stejné jako kdyby jsi napsal:
this.GetComponent<TvojeTrida>();
Aby jsi mohl volat metodu na skript, který je na jiném GameObjectu, nejprve si ho musíš uložit a pak z něj dostat skript:
GameObject target;
target.GetComponent<TvojeTrida>().OnDeath();
// nebo
TvojeTrida trida = target.GetComponent<TvojeTrida>();
trida.OnDeath();
Problém je v tom že ta "TvojeTrida" je nějaká třída... a já potřebuji zjistit jakou třídu tvoří proměnná typu MonoScript. Až budu mít referenci na tuto konkrétní třídu (jejíž typ je jiný, záleží na skriptu který v inspektoru přiřadím do veřejné proměnné) bude extrémně snadné na ní cokoliv volat. To co nazýváš <TvojeTrida> může být jakákoliv třída přiřazená v inspektoru... může to být cokoliv, třeba AsteroidController.cs nebo RocketController.cs problém je v tom že skript vlastně neví jaká třída to je a já nemůžu jednoduše napsat
GetComponent<SameClassAsInMonoScriptVariable>()
Už chápeš ? Problém není v tom dostat referenci na třídu, problém je v tom zjistit na jakou třídu mám dostat referenci.
Vyřešeno, použil jsem dědičnost. Třída targetController je nyní parrent všech ostatních controllerů což znamená že mohu napsat
GetComponent<targetController>()
...TargetCpntroller sice v daném objektu nebude ale za to tu bude jeho child což je pro získání reference dostačující.
Jasně... No, jestli jsou skripty AsteroidController a RocketController součástí prefabu, můžeš si vytvořit další třídu a pojmenovat ji třeba HealthManager. Tu budeš hledat pomocí GetComponent(). Zde si můžeš ukládat stav životů atp. Taky na ni budeš volat metodu OnDeath(), kde pak GameObject zničíš, nebo TakeDamage() pokud střely/údery nezabijí Asteroid či Rocket na jeden úder.
Pak je tu další možnost, že si žádnou třídu vytvářet nebudeš, ale budeš zjišťovat, jestli GameObject má daný skript:
if (target.GetComponent<AsteroidManager>() == null)
{
// gameobject nemá skript AsteroiManager
}
else if(target.GetComponent<RocketController>() == null)
{
// nemá ani RocketController
}
else
{
// zasáhl jsi něco jiného
}
Zobrazeno 6 zpráv z 6.