Kind van een GameObject of het script dat is aangesloten op Child GameObject via Script

Ik weet dat dit een beetje een stomme vraag is, maar hoe zou ik het kind (een kubus) van een gamebobject via script verwijzen (het script is bevestigd aan het gameobject). (het equivalent aan zoiets als Getcomponent)


Antwoord 1, Autoriteit 100%

Vinden van Child GameObject by Index :

U kunt het eerste kind van een gameObject krijgen met de GetChildfunctie.

GameObject originalGameObject = GameObject.Find("MainObj");
GameObject child = originalGameObject.transform.GetChild(0).gameObject;

U kunt andere kinderen krijgen door indexnummer van het kind-gameObject zoals 1,2,3, aan de GetChildFUNCTION.

en als het een kind van een kind in de originele gameobject is? zou ik gewoon
moet het herhalen of zou het gewoon de NTH One Down

zijn

U vindt het kind eerst, zoek dan het kind van dat kind uit de referentie.

Laten we zeggen dat dit OriginalGameObject / Prefab Hiërarchie is:

  • OriginalGameObject
  • child1
  • child2
  • child3
    • childofchild3

Zoals u de OriginalGameObjectkunt zien, is de ouder van child1, child2EN child3. Kindofchild3 is het kind van child3.

Laten we zeggen dat u wilt openen van de childsen u hebt alleen verwijzing naar OriginalGameObject, wat de ouder GameObject is:

//Instantiate Prefab
GameObject originalGameObject  = Instantiate(prefab);
//To find `child1` which is the first index(0)
GameObject child1 = originalGameObject.transform.GetChild(0).gameObject;
//To find `child2` which is the second index(1)
GameObject child2 = originalGameObject.transform.GetChild(1).gameObject;
//To find `child3` which is the third index(2)
GameObject child3 = originalGameObject.transform.GetChild(2).gameObject;

De index start vanaf 0zodat het echte indexnummer index-1net als arrays is.

Nu, om de referentie van childOfChild3te krijgen, is het kind van child3, maar u hebt alleen verwijzing naar OriginalGameObjectWat is de ouder GameObject :

Allereerst, ontvang de referentie van child3Verkrijg dan childOfChild3van.

GameObject mychild = originalGameObject.transform.GetChild(2).gameObject;
GameObject childOfChild3 = mychild.transform.GetChild(0).gameObject;

Finding [ALL] Kind GameObject per index met lus :

om door het hele kind van OriginalGameObject te lussen:

GameObject originalGameObject = Instantiate(prefab);
for (int i = 0; i < originalGameObject.transform.childCount; i++)
{
    GameObject child = originalGameObject.transform.GetChild(i).gameObject;
    //Do something with child
}

U kunt ook kind bij naam vinden met de transform.FindChildFunctie. Ik zou het niet aanraden dat je dat kunt doen. Het lijkt traag en zal conflicteren wanneer meerdere kinderen de dezelfde naam delen. Daarom gebruik je GetChild.

Kinder GameObject zoeken op naam:

GameObject child1 = originalGameObject.transform.FindChild("child1").gameObject;
GameObject child2 = originalGameObject.transform.FindChild("child2").gameObject;
GameObject child3 = originalGameObject.transform.FindChild("child3").gameObject;

Om childOfChild3te vinden, kun je dat eenvoudig doen met de ‘/‘, net zoals je doet met een bestandsdirectory. U geeft de parent/childop en vervolgens de naam. De ouder van childOfChild3is child3. We gebruiken dus childOfChild3/child3in de functie FindChild.

GameObject childOfChild3 = originalGameObject.transform.FindChild("child3/childOfChild3").gameObject;

Scripts/componenten vinden die zijn gekoppeld aan een onderliggende GameObject:

Als je alleen het script wilt dat aan het onderliggende GameObject is gekoppeld, gebruik dan GetComponentInChildren:

MyScript childScript = originalGameObject.GetComponentInChildren<MyScript>();

Als er meer dan één kind is met hetzelfde script en u wilt gewoon allescripts eraan koppelen, gebruik dan GetComponentsInChildren:

MyScript[] childScripts = originalGameObject.GetComponentsInChildren<MyScript>();
for (int i = 0; i < childScripts.Length; i++)
{
    MyScript myChildScript = childScripts[i];
    //Do something with myChildScript
}

Antwoord 2, autoriteit 4%

gameObject.transform.childrenbevat alle directe kinderen van een bepaald GameObject. Je kunt het herhalen en het gewenste kind vinden. Bijvoorbeeld op naam;

for(int i = 0; i < gameObject.transform.childCount;)
{
    if(gameObject.transform.children[i].name == "someName")
    {
        // do what you need with it
    }
}

Er zijn een paar manieren om te herhalen. U kunt een enumerable gebruiken, zoals aangegeven in deze documenten, of FindChild.

Normaal gesproken wil je kinderen herhalen als je een aantal andere criteria hebt, zoals een kind willen vinden dat een specifiek type Component heeft, in plaats van alleen op naam.


Antwoord 3

Ik vind deze zeer korte methode slechts 2 regels,
mijn spelershiërarchie is als volgt:

-Speler

  1. Hoofd
  2. BulletPos

Code:

Transform[] ObjectChildrens;
ObjectChildrens = gameObject.GetComponentsInChildren<Transform>();
GameObject Head = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "Head").gameObject;
GameObject BulletPos = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "BulletPos").gameObject;
GameObject LifeProgresBar = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "LifeProgresBar").gameObject.GetComponent<Text>().text = "100";
CapsuleCollider2D cc = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "HeadPlace").gameObject.GetComponent<CapsuleCollider2D>();

Antwoord 4

Je zou een openbare variabele kunnen hebben in het bovenliggende gameObject.

public Tranform childGameObject;

en wijs uw kind gameObject eraan toe.

Op deze manier vermijd je verborgen afhankelijkheden. Evenals uw kind kan de kubus zich in een andere ouder en een andere ouder bevinden.

Other episodes