Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací
Avatar
Petr Langer
Člen
Avatar
Petr Langer:21. srpna 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. srpna 15:52
Avatar
vosa53
Člen
Avatar
Odpovídá na Petr Langer
vosa53:21. srpna 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 21. srpna 16:34
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Petr Langer
Martin Petrovaj:21. srpna 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. srpna 16:43
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Langer
Člen
Avatar
Odpovídá na vosa53
Petr Langer:21. srpna 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  +1 21. srpna 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.