Jump to content
Unity Insider Forum

Gameobject in gameObject finden


Recommended Posts

Hallo zusammen.

Ich habe mal wieder angefangen mit Unity zu arbeiten. Nun habe ich mehrere Buttons die alle den gleichen Script aufrufen. Jeder Button beinhaltet ein GameObject<Image>. Dieses Image möchte ich nun einem GameObject zuordnen ohne zu wissen wie es heißt. Also kann ich das nicht über GameObejct.Find machen. Ich komme da nicht auf eine Lösung.

Gruß und Danke
Jan

Link to post
Share on other sites

Ich habe Probleme deine Fragestellung zu verstehen. Ich schätze mal du möchtest sagen das jedes Gameobject ein Component Image hat oder? Was genau meinst du mit Image zuordnen? 

 

Ich versuche es mal trotzdem zu beantworten auch wenn ich die Frage nicht ganz verstanden habe :).

Wenn du einem  Script das auf einem anderen Gameobject liegt eine Componente übergeben möchtest kannst du das Feld im Script public setzten und dieses dann im Inspector mit dem gewünschten Gameobject füllen das die Componente hällt.

Link to post
Share on other sites

Hallo.

Ich habe folgende Objecte im Inspektor und an jedem der Buttons hängt der selbe Script.

grafik.png.84174adc949b2563a8e1885804d02ea1.png

Der Script sieht gekürzt so aus:

public class BauController : MonoBehaviour
{
    
    private GameObject goBildHolen;

    public void bildHolen()
    {
		goBildHolen = GameObject.Find("zu findendes GameObject");
    }
}

Ich möchte jetzt, wenn zB. der Button ButtonBaumenuBasis geklickt wurde, im Script das GameObject ImageButtonBaumenuBasis dem GameObject goBildHolen zuweien. Das geht ja zB. per GameObject.Find mit goBildHolen = GameObject.Find("ImageButtonBaumenuBasis". Aber was ist nun wenn der Button ButtonBaumenuFlugfeld geklickt wird. Dann möchte ich das GO ImageButtonBaumenuFlugfeld zuordnen. Ich müsste also iwie den String in der .Find-Anweisung ändern. Das man das per UI und public Variablen machen kann weiß ich. Das ist aber nicht was ich will. Deswegen frage ich mich ob es eine Möglichkeit gibt ein GO "unter" einem GO zu finden ohne, dass man dessen Namen kennt. ZB. über den Typ des GO (hier ja Image) oder so.

Gruß
Jan

Link to post
Share on other sites

Also ich versteh es noch immer nicht genau.

Aber egal.

Ich habe auch sowas, wie 1 Script für alles.

Da such ich einfach mit Automatischer Liste nach allen Child Komponenten.



public Button objButton;
Text[] textList;

textList = objButton.GetComponentsInChildren<Text>();
textList[0].text = objButton.name;
textList[0].fontSize = 24 * intFaktorAuflösungY;
textList[0].alignment = TextAnchor.MiddleCenter;
textList[1].text = strBenutzerTasteBeschriftung;
textList[1].fontSize = 22 * intFaktorAuflösungY;
textList[1].alignment = TextAnchor.MiddleCenter;
textList[2].text = strButtonWerkseinstellungBeschriftung;
textList[2].fontSize = 24 * intFaktorAuflösungY;
textList[2].alignment = TextAnchor.MiddleCenter;

Und zwar hab ich mein Parent Button, wie dein ButtonBaumenuBasis.

Und darin such ich einfach alle Text Komponenten in seinen Childs und füge es einer Dynamischen Liste hinzu.

Nun kann ich [0]-[2] also von Child 1-3 die Text Komponenten bearbeiten.

Kannst natürlich alle Komponenten suchen wie RectTransform etc.

 Für dich ist wohl text oder name interessant.

Die Richtung müsste eigentlich so gehen, aber wie gesagt, weiß noch immer nicht so genau wie du es brauchst.

Ah jetzt versteh ich erst dein goBildHolen lol.

Halb englisch halb deutsch. 

Naja Image ist ja eigentlich auch nur eine Komponente. Musst dann wohl nach Image statt Text suchen.

Viel glück

 

 

Link to post
Share on other sites
vor 23 Stunden schrieb yawahoo:

Hallo.

Ich habe folgende Objecte im Inspektor und an jedem der Buttons hängt der selbe Script.

grafik.png.84174adc949b2563a8e1885804d02ea1.png

Der Script sieht gekürzt so aus:




public class BauController : MonoBehaviour
{
    
    private GameObject goBildHolen;

    public void bildHolen()
    {
		goBildHolen = GameObject.Find("zu findendes GameObject");
    }
}

Ich möchte jetzt, wenn zB. der Button ButtonBaumenuBasis geklickt wurde, im Script das GameObject ImageButtonBaumenuBasis dem GameObject goBildHolen zuweien. Das geht ja zB. per GameObject.Find mit goBildHolen = GameObject.Find("ImageButtonBaumenuBasis". Aber was ist nun wenn der Button ButtonBaumenuFlugfeld geklickt wird. Dann möchte ich das GO ImageButtonBaumenuFlugfeld zuordnen. Ich müsste also iwie den String in der .Find-Anweisung ändern. Das man das per UI und public Variablen machen kann weiß ich. Das ist aber nicht was ich will. Deswegen frage ich mich ob es eine Möglichkeit gibt ein GO "unter" einem GO zu finden ohne, dass man dessen Namen kennt. ZB. über den Typ des GO (hier ja Image) oder so.

Gruß
Jan

Also so solltest du das nicht machen, denn das ist der falsche Weg. Die GameObject.Find ist nicht für solche Sachen gedacht. So wäre es richtiger

public class BauController : MonoBehaviour
{
    [SerializeField]
    Image icon;
  
    private GameObject goBildHolen;

    public void bildHolen()
    {
        goBildHolen = icon.gameObject;
    }
}

Jetzt kannst du den ImageComponent in das Feld Icon ziehen und damit arbeiten.
Man braucht hier nicht mal goBildHolen. Man kann allein mit icon.gameObject arbeiten.

Möchte man nicht selber reinziehen und es soll beim Start selbst finden lassen, dann geht es auch so

public class BauController : MonoBehaviour
{
    Image icon;
  
    private GameObject goBildHolen;
  
    void Awake()
    {
    	icon = GetComponentInChildren<Image>(); 
    }

    public void bildHolen()
    {
        goBildHolen = icon.gameObject;
    }
}

Wenn du jetzt wirklich kein Image in Script haben willst (warum auch immer) kannst du transform.Find("deinButtonMitImage").gameObject machen. Das würde aber bei dir nicht funktionieren, da du (warum auch immer XD), jedes mal anderen Namen hast.

Dein Button sollte ca. so aufgebaut sein:

Zitat

Button (mit Bezeichnung, ca. wie du das gemacht hast)
- Text (oder genauer wie, DescriptionText, NameText)
- Image (oder Icon, oder PreviewImage oder sowas).

Also etwas Allgemeiner halten.
Und nicht

Zitat

Button
- RaffenerieBeschreibungsText
- ImageBaumenuReffenerie

 

Link to post
Share on other sites

Anders: Ich habe das GameObkect GO_Baum. Dieses GO_Baum hat weitere, untergeordnete GameObjecte GO_Ast, GO_Blatt und GO_Knospe. Also im Inspector so:

GO_Baum
    GO_Ast
    GO_Blatt
    GO_Knospe

Wie kann ich jetzt einem GO_Temp das GO_Blatt zuordnen. GO_Temp = GameObejct.Find<"GO_Blatt">(); kenne ich, kann ich aber nicht nutzen. Gibt es noch andere Möglichkeiten?

Es geht einfach darum, dass ich ein Userinterface mit 3 Buttons habe. Die Image-Komponenten der Buttons nutze ich als Hintergrund. Um auf den Buttons dennoch eigene Bilder zuordnen zu können habe ich dem Button ein UI-Image untergeordnet. Und genau auf die Image-Komponente dieses UI-Image möchte ich zugreifen wenn der Nutzer einen der Buttons klickt. Und das ganze am besten ohne für jeden Button einen eigenen Script zu schreiben oder etwas über den Inspector "hin und her zu ziehen".

Wenn jetzt nicht weiß ich tatsächlich nicht mehr wie ich das erklären soll....

Gruß
Jan

Link to post
Share on other sites

Hast denn meine Lösung überhaupt mal probiert?

Da ich noch immer nicht 100% nachvollziehen kann was du brauchst.

Ich nehme einfach mal an, das du ein UI Sprite in deiner Sammlung hast und diese einfach einen Button als Hintergrundbild setzen möchtest.

Hab meine Lösung auf Image mal umgeschrieben.

Das müsste sowas sein, was du suchst.

using UnityEngine;
using UnityEngine.UI;

public class test : MonoBehaviour
{
    public GameObject gameObject1;
    public Sprite image1;

    Image[] imageList;

    // Start is called before the first frame update
    void Start()
    {
        imageList = GetComponentsInChildren<Image>();
        imageList[0].sprite = image1;
        imageList[1].sprite = image1;
        imageList[2].sprite = image1;
    }

    // Update is called once per frame
    void Update()
    {

    }
}

Wie du siehst, schreibe ich alle Image Komponenten der Childs Button vom übergeordneten Gameobject in eine Dynamische Image Liste.

Dadurch erhält man eine Liste von 3 also 0-2 für die 3 Buttons.

Das Image das ich dann zuweise, hab ich vorher den Script zugewiesen.

Und beim Start, werden die Hintergrundbilder der 3 Button durch das Image ersetzt.

Das ist nun ein weg von vielen. Du musst das nur noch für dich passend machen.

Hoffe hilft dir weiter.

Viel Glück

 

Bild.jpg

Link to post
Share on other sites
Am 9.4.2021 um 00:08 schrieb Sir_Mathew:

Hast denn meine Lösung überhaupt mal probiert?

...
...
...

Hallo.

So wie Du es hier vorgeschlagen hast funktioniert es. Ist zwar iwie ein "komischer" Weg. Aber das Ergebniss zählt.

Danke

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...