Jump to content
Unity Insider Forum

Kind Objekt


Kojote

Recommended Posts

Grüße!

Ich habe ein kleines Problem mit dem Eltern-Kind-Verhältniss.

Vorgegeben ist ein GameObjekt was eine Komponente Image hat.

Des weiteren hat das GameObjekt ein KindObjekt, dieses hat auch eine Komponente Image.

Ich wollte nun gerne diese KindObjekte in einem Array zusammen fassen und aktivieren und deaktivieren.

Dazu nutze ich eine Schleife mit Array:

for (int i = 0; i < arraySpielPlatzhalter.Length; i++) {
            arraySpielImage[i] = arraySpielPlatzhalter[i].GetComponentInChildren<Image>();
            arraySpielImage[i].enabled = false;
} 

Problem ist nun, wenn ich das wie oben geschrieben mache, werden sowohl das Image des Elternobjekts, als auch des Kindobjekts deaktiviert.

Könnt ihr mir hier weiter helfen?

Vielen dank und einen schönen Feiertag! :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lösung gefunden. Wenn mehrere gleiche Komponenten zu finden sind, muss man differenzierter suchen:

arraySpielImage[i] = arraySpielPlatzhalter[i].transform.Find("Level").GetComponentInChildren<Image>()

"Level" - wäre der Name des Kindobjektes, welches die Komponente hat, die man ansprechen möchte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was meinst du mit cached?

Bei mir siehts nun so aus:

for (int i = 0; i < arraySpielPlatzhalter.Length; i++) {
            arraySpielPlatzhalterText[i] = arraySpielPlatzhalter[i].GetComponentInChildren<Text>();
            arraySpielPlatzhalterButton[i] = arraySpielPlatzhalter[i].GetComponent<Button>();
            arraySpielSternImage[i] = arraySpielPlatzhalter[i].transform.Find("Level Sterne Image").GetComponentInChildren<Image>();
            arraySpielButtonImage[i] = arraySpielPlatzhalter[i].GetComponent<Image>();
        }

Gibt es da noch eine bessere Möglichkeit, @Sascha?

Das ist wirklich Blödsinn, stimmt:

arraySpielSternImage[i] = arraySpielPlatzhalter[i].transform.Find("Level Sterne Image").GetComponentInChildren<Image>();
  
// ändern zu
  
arraySpielSternImage[i] = arraySpielPlatzhalter[i].transform.Find("Level Sterne Image").GetComponent<Image>();

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Keine Ahnung, was du da genau machst. Ist das in Start oder so (einmalig) oder in irgendeinem Update?

Jedenfalls fällt mir direkt was anderes auf. Wann immer du mehrere Arrays hast und die Elemente der Arrays mit demselben Index gehören zusammen, machste was falsch. Stattdessen solltest du eine Klasse oder ein Struct bauen und dann ein Array davon machen.

Also wird aus

public string[] personenNamen;
public int[] personenAlter;
public string[] personenAdressen;

das hier:

public struct Person
{
  public string name;
  public int alter;
  public string adresse;
}

public Person[] personen;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit der Struktur, das versteh ich jetzt nicht ganz, könntest du das genauer erklären?

Ich habe mehrere Gameobjekte, diese ziehe ich mir in den Inspector:

    public GameObject buttonSpielPlatzhalter1;
    public GameObject buttonSpielPlatzhalter2;
    public GameObject buttonSpielPlatzhalter3;
    public GameObject buttonSpielPlatzhalter4;
    public GameObject buttonSpielPlatzhalter5;
    public GameObject buttonSpielPlatzhalter6;
    public GameObject buttonSpielPlatzhalter7;
    public GameObject buttonSpielPlatzhalter8;
    public GameObject buttonSpielPlatzhalter9;
    public GameObject buttonSpielPlatzhalter10;
    public GameObject buttonSpielPlatzhalter11;
    public GameObject buttonSpielPlatzhalter12;
    public GameObject buttonSpielPlatzhalter13;
    public GameObject buttonSpielPlatzhalter14;
    public GameObject buttonSpielPlatzhalter15;

Daraus mache ich mir dann:

private GameObject[] arraySpielPlatzhalter;

Und leite den Rest davon ab und suche mir die Komponenten zusammen.

Das würe ja mit einem Struktur ja nicht funktionieren, oder?

 

Achja, ich lade das alles einmal in der Start-Methode, danach nie wieder.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb Kojote:

Achja, ich lade das alles einmal in der Start-Methode, danach nie wieder.

Dann ist die heftige Anzahl an GetComponents und so weiter in Ordnung.

vor 12 Minuten schrieb Kojote:

Das würe ja mit einem Struktur ja nicht funktionieren, oder?

Na aber hallo geht das. Übertrage einfach mein Beispiel auf deine Situation.

public struct SpielPlatzhalter
{
  public string text;
  public Button button;
  // usw.
}

public SpielPlatzhalter[] spielPlatzhalter;
var sp = new SpielPlatzhalter();
sp.text = arraySpielPlatzhalter[i].GetComponentInChildren<Text>();
sp.button = arraySpielPlatzhalter[i].GetComponent<Button>();
sp.image = arraySpielPlatzhalter[i].transform.Find("Level Sterne Image").GetComponentInChildren<Image>();
sp.buttonImage = arraySpielPlatzhalter[i].GetComponent<Image>();
spielPlatzhalter[i] = sp;

Hier sieht man übrigend einen netten Grund, warum man seine Variablen englisch benennen sollte. Damit kann man Arrays vielbesser mit Pluralen markieren :)

public GamePlaceholder[] gamePlaceholders;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

public struct LevelButtonPlatzhalter {
        public GameObject arraySpielPlatzhalter; // GameObjecte der aktuellen 15 Auswahlfelder
        public Text arraySpielPlatzhalterText; // Texte der aktuellen 15 Auswahlfelder
        public Button arraySpielPlatzhalterButton; // Buttons der aktuellen 15 Auswahlfelder
        public int arraySpielPlatzhalterSperren; // Sperren der aktuellen 15 Auswahlfelder
        public int arraySpielPlatzhalterSternTyp; // Sterntypen der aktuellen 15 Auswahlfelder 
        public Image arraySpielSternImage; // Image für Stern der aktuellen 15 Auswahlfelder
        public Image arraySpielButtonImage; // Image für Button der aktuellen 15 Auswahlfelder
    }
    public LevelButtonPlatzhalter[] levelButton;

    private void Test () {
        levelButton = new LevelButtonPlatzhalter[15];
        levelButton[0].arraySpielPlatzhalterSperren = 1;
    }

Struktur war noch nie meine Stärke, hatte bisher nie einen sinnvollen Einsatz gesehen. Nutzen wir mal die Gunst der Stunde um dazu zu lernen.^^

Ich bin nun so weit:

   public struct LevelButtonPlatzhalter {
        public GameObject arraySpielPlatzhalter; 
        public Text arraySpielPlatzhalterText; 
        public Button arraySpielPlatzhalterButton; 
        public int arraySpielPlatzhalterSperren;
        public int arraySpielPlatzhalterSternTyp; 
        public Image arraySpielSternImage;
        public Image arraySpielButtonImage; 
    }
    public LevelButtonPlatzhalter[] levelButton;

    private void Test () {
        levelButton = new LevelButtonPlatzhalter[15];
        levelButton[0].arraySpielPlatzhalterSperren = 1;
    }

Wie verknüpfe ich das nun in der Awake Methode?

Ich erstelle ein Array mit 15 Feldern. Nun muss ich ja jedem Feld sein Objekt zuweisen.

vor 4 Minuten schrieb Helishcoffe:

Du brauchst doch gar nicht alle GameObjects in einzelne Variablen packen.

Stell dein arraySpielPlatzhalter doch direkt auf public, dann kannste deine Objekte direkt im Inspector in das Array ziehen

Ich hole mir über den Inspector ja die Gameobjekte (alles andere ist privat), ich spalte mir das nur gern in einzelbe Arrays in Gruppen auf, das ich nicht jedes mal mit GetComponent arbeiten muss. Hab mal gelesen, so ist es Resourcenschonender. Zudem wird der Quelltext besser lesbar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube langsam versteh ichs:

public struct LevelButtonPlatzhalter {
        public GameObject arraySpielPlatzhalter;
        public Text arraySpielPlatzhalterText; 
        public Button arraySpielPlatzhalterButton;
        public int arraySpielPlatzhalterSperren; 
        public int arraySpielPlatzhalterSternTyp;  
        public Image arraySpielSternImage; 
        public Image arraySpielButtonImage; 
    }
    public LevelButtonPlatzhalter[] levelButton;

private void Test () {
        levelButton = new LevelButtonPlatzhalter[15];
        levelButton[0].arraySpielPlatzhalter = buttonSpielPlatzhalter1;
        levelButton[1].arraySpielPlatzhalter = buttonSpielPlatzhalter2;
        levelButton[2].arraySpielPlatzhalter = buttonSpielPlatzhalter3;
        levelButton[3].arraySpielPlatzhalter = buttonSpielPlatzhalter4;
        levelButton[4].arraySpielPlatzhalter = buttonSpielPlatzhalter5;
        levelButton[5].arraySpielPlatzhalter = buttonSpielPlatzhalter6;
        levelButton[6].arraySpielPlatzhalter = buttonSpielPlatzhalter7;
        levelButton[7].arraySpielPlatzhalter = buttonSpielPlatzhalter8;
        levelButton[8].arraySpielPlatzhalter = buttonSpielPlatzhalter9;
        levelButton[9].arraySpielPlatzhalter = buttonSpielPlatzhalter10;
        levelButton[10].arraySpielPlatzhalter = buttonSpielPlatzhalter11;
        levelButton[11].arraySpielPlatzhalter = buttonSpielPlatzhalter12;
        levelButton[12].arraySpielPlatzhalter = buttonSpielPlatzhalter13;
        levelButton[13].arraySpielPlatzhalter = buttonSpielPlatzhalter14;
        levelButton[14].arraySpielPlatzhalter = buttonSpielPlatzhalter15;
        for (int i = 0; i < levelButton.Length; i++) {
            levelButton[i].arraySpielPlatzhalterText = levelButton[i].arraySpielPlatzhalter.GetComponentInChildren<Text>();
            levelButton[i].arraySpielPlatzhalterButton = levelButton[i].arraySpielPlatzhalter.GetComponent<Button>();
            levelButton[i].arraySpielSternImage = levelButton[i].arraySpielPlatzhalter.transform.Find("Level Sterne Image").GetComponent<Image>();
            levelButton[i].arraySpielButtonImage = levelButton[i].arraySpielPlatzhalter.GetComponent<Image>();
        }
    }

Wäre das so korrekt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach du dickes Ei.

Wie immer die Grundregel: Wenn du mehr als zwei Variablen hast, die bis auf die Nummer am Ende gleich heißen, hast du was falsch gemacht.

Mach aus

Typ buttonSpielPlatzhalter1;
Typ buttonSpielPlatzhalter2;
Typ buttonSpielPlatzhalter3;

bitte

Typ[] buttonSpielPlatzhalters;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, sehr interessant, dass wusste ich gar nicht, dass ich auch so Elemente in den Inspector schieben kann. Die Info ist echt genial, jetzt kann ich im Inspector endlich mal richtig aufräumen, ist gleich alles viel übersichtlicher!

Mal abgesehen davon, wäre der Rest korrekt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...