Accesarea GameObjects copil al GameObject (Dezvoltarea jocurilor, Unitate, C#)

tmighty a intrebat.
a intrebat.

Am încercat deja foarte mult cu toate funcțiile „GetChildren” și altele similare, dar nu am găsit încă cum să fac acest lucru.

Am un GameObject numit „koffer”.am adăugat câteva alte GameObjects ca și copii ai acestuia.

Am adăugat un script la „koffer” în care încerc să recuperez copiii.În acest script am precizat această linie:

    string sThis = this.name; //just for testing. "sThis" becomes "koffer", so it looks perfectly fine.
    foreach (GameObject g in this.GetComponentsInChildren<GameObject>()) // doesn't retrieve anything. So obviously I'm not doing it correctly.

Cu toate acestea, acest lucru nu recuperează nimic.Nu este aceasta funcția corectă pentru un astfel de caz?

Există vreo funcție încorporată pentru a prelua aceste obecte de joc?

Am găsit mai multe funcții personalizate de acum câțiva ani și nu știu dacă mai sunt necesare sau dacă Unity a integrat vreo funcție în acest sens.

Ceea ce mă deranjează cu adevărat este că există atât de multe funcții personalizate care se ocupă de „Transform” în loc de „GameObject”. De ce ar avea cineva nevoie de Transform în loc de GameObject?

Vă mulțumesc.

Comentarii

  • GameObject nu este un Component, deci nu poate fi returnat de GetComponent sau alte aplicații asemănătoare. Motivul pentru care scripturile pe care le-ați găsit în scopul navigării copiilor folosesc Transform este că Transform este cea care gestionează relațiile părinte-copil pe care încercați să le navigați aici. GameObjects nu au părinți sau copii în mod direct, ci doar Transform doar componenta are. Acesta este motivul pentru care arborele de obiecte imbricate se numește „ierarhie de transformare”.  > Por DMGregory.
  • @DMGregory Cea mai bună explicație din toate timpurile! Perfect de înțeles. Mulțumesc!-  > Por tmighty.
2 răspunsuri
Charanor

GameObjects nu aveți copii per se. Când vorbim despre copii la un GameObject ne referim de fapt la copiii lui Transform componentă (pe care toți GameObjects au). Acest lucru înseamnă că trebuie să folosiți funcția Transform pentru a accesa copiii:

void Start() {
    // All GameObjects have a transform component built-in
    foreach(Transform child in this.transform) {
        GameObject obj = child.gameObject;

        // Do things with obj
    }
}

Motivul pentru care nu puteți utiliza GetComponentsInChildren<T>() pentru a obține copiii este pur și simplu pentru că aceasta nu este funcționalitatea acestei funcții. Funcția respectivă (așa cum spune și numele) este utilizată pentru a obține componente de la copii (nu copiii în sine). De exemplu (preluat din documentația Unity):

void Start()
{
    var hingeJoints = GetComponentsInChildren<HingeJoint>();
    foreach (HingeJoint joint in hingeJoints)
        joint.useSpring = false;
}

Cu toate acestea, cred că puteți din punct de vedere tehnic folosiți această funcție pentru a obține toți copiii:

void Start()
{
    // This only works because GameObjects always have the Transform component,
    // and there can only be 1 transform component per GameObject
    var transforms = GetComponentsInChildren<Transform>();
    foreach (Transform transform in transforms) {
        GameObject obj = transform.gameObject;

        // Do something with obj
    }
}

Justin Markwell

puteți utiliza transform.GetChild(0) puteți, de asemenea, să obțineți copii de copii transform.GetChild(0).GetChild(0)

sau puteți extrage o matrice a fiecărui copil și să lucrați cu ea.

    for (int i = 0; i < transform.childCount; i++)
    {
        //do stuff

    } 

sau

    foreach (Transform child in transform)
    {
        // do stuff
    }

Comentarii

  • Cu câteva secunde înainte de a vedea postarea ta am înnebunit de faptul că oamenii postează funcții care se ocupă de Transform. Acum și tu faci același lucru. Poți să-mi spui de ce? Eu vorbesc despre GameObject, iar tu te ocupi de Transform. De ce?  > Por tmighty.
  • Speram să aflu cum să trec prin copii folosind ceva de genul acesta: foreach (GameObject g in this.GetComponentsInChildren < GameObject >()). Am încercat atât de mult, dar nu am găsit încă o soluție funcțională.  > Por tmighty.
  • pentru că transform are acele metode precum transform.GetChild(0) și alte chestii. poți spune Gameobject go = child.gameObject sau transform.gameObject-.  > Por Justin Markwell.
  • De ce ar trebui să folosesc „GetChild(0)”? Nu pot să nu folosesc GetComponentsInChildren<GameObject>()?  > Por tmighty.
  • clasa Transform este de obicei modalitatea preferată. transform.gameObject ar fi cam același lucru ca și GetComponent<GameObject>(). dar și preluarea unui copil folosind transform.GetChild(0).gameobject.GetComponent<Animator>(); va funcționa, dar dacă încercați asta în celălalt mod, cel mai probabil veți avea o referință nulă dacă extrageți aceste informații din ceva dintr-un alt script fără o referință la go.-  > Por Justin Markwell.

Tags:,