IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Langer
Člen
Avatar
Petr Langer:21.8.2018 15:52

Mám takovouhle strukturu scény:

Player1
-textLabel
Player2
-textLabel

objekty Player1 a Player2 mají přiřazený stejný script, který najde textLabel a změní jeho hodnotu. Problém ale je, že text se změní jen u prvního objektu a u druhého zůstane nezměněný.
Můj kód:

void Start ()
{
GameObject textLabel = GameObject.Find ("textLabel");
textLabel.GetComponent<Text>().text = "Nový text";
}

Co dělám španě?

 
Odpovědět
21.8.2018 15:52
Avatar
vosa53
Člen
Avatar
Odpovídá na Petr Langer
vosa53:21.8.2018 16:34

Ono to GameObject.Find prohledává celou scénu (všechny aktivní), takže vždy vrátí jen jeden objekt. Pokud chceš jen child, tak pak by mělo fungovat transform.find. Nebo můžeš tu Text komponentu přiřadit přímo v inspektoru.

public class Script : MonoBehaviour
{
    [SerializeField]
    private Text _textLabelText;

        private void Start()
    {
        _textLabelText.text = "Nový text";
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
21.8.2018 16:34
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Petr Langer
Martin Petrovaj:21.8.2018 16:43

GameObject.Fin­d(string menoObjektu) funguje tak, že prechádza hierarchiu (štruktúru) scény, až kým nenájde gameobject s menom menoObjektu.

Čiže v tvojom prípade prechádza metóda hierarchiu scény, nájde Player1, pod ním child gameobject s menom textLabel - voilá, má svoj výsledok a vráti ti ten jeden gameobject, ďalej už nehľadá.

Neviem, čo s tými textLabelmi plánuješ robiť a ako chceš, aby sa ti to správalo, ale to, čo chceš použiť je pravdepodobne GetComponentIn­Children<Text>() v skripte, ktorý máš attachnutý ku hráčom. Tým sa úplne vyhneš medzikroku v podobe hľadania gameobjectov.

Mimochodom, hľadať gameobject (či dokonca viac gameobjectov, aj keď to sa ani nedá, ako si sám zistil) pomocou jeho mena je asi najhorší spôsob, aký môžeš využiť. Oveľa rýchlejšie je vyhľadávanie pomocou tagu (teda metódy FindWithTag pre jeden a FindGameObjec­tsWithTag pre viac objektov). Keď už, tak pre vyhľadávanie v child objektoch podľa mena je rýchlejší aj Transform.Find, ten aspoň neprehľadáva celú scénu, len potomkov tvojho objektu.

GameObject.Find
Diskusia ad Find vs FindWithTag
Transform.Find

Nahoru Odpovědět
21.8.2018 16:43
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Langer
Člen
Avatar
Odpovídá na vosa53
Petr Langer:21.8.2018 18:03

Díky, nakonec jsem použil transform.Find a už to funguje. Jen mě zarazilo, že to hledá jen v přímých potomcích, ale poradil jsem si.

 
Nahoru Odpovědět
21.8.2018 18:03
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 4 zpráv z 4.