2017-06-28 2 views
0

Ich mache eine Anwendung mit Augmented Reality mit ArToolkit.Aktivieren und Deaktivieren von GameObjects durch toggles - Augmented Reality

Es ist sehr einfach.

Ich zeige einige Elemente entsprechend der Toggle-Stufe. Beispiel Ich habe 3 Elemente

3 Elements

Wenn ich ausführen, wird ein Element angezeigt. Wenn ich zuerst auf toggle klicke, wird dieses Element ausgeblendet und das nächste Element angezeigt. Wenn ich in die zweite toggle klicke, wird das vorherige Element ausgeblendet und das nächste wird angezeigt.

Mit anderen Worten, wenn ich nur das erste Element (Cube) ausführen wird angezeigt. Wenn ich in der ersten Toggle klicken, wobei jedes Element (Würfel, esphere, cilinder) ist, anzeigen:

Schritt 1: Step1

Schritt 2: step2

Schritt 3: step3

Dies ist meine Hierarchie:

hierarchy

Innen ArControlador sind die Markierungen. Innerhalb Canvas sind die Umschalter.

Aber eigentlich baue ich dieses Projekt auf grobe Weise, jedes Element mit GameObject.Find bekommen. Ich möchte die GameObjects elegant gestalten, den Code sauber halten und skalierbar sein.

Ich möchte die GameObjects auf eine automatisierte Weise erhalten, also wenn ich 3, 5, 10 oder 20 Elemente habe, wird der Code perfekt laufen.

denke ich in einigen Möglichkeiten wie Array von GameObjects, List von GameObjects, einen GameObject Vater schaffen und alle Childs wie FindGameObjectsWithTag bekommen, aber ich habe nicht erfolgreich.

Dies ist mein Code, es funktioniert schon, aber in rohen Weise GameObject pro GameObject Geting und aktivieren/deaktivieren Sie die Gameobjects mit aux Variable finden Sie unter:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 
using System.Linq; 
using System.Collections.Generic; 
using System; 
using UnityEngine.SceneManagement; 

public class AlternaEntreOsPassos : MonoBehaviour 
{ 
    private UnityEngine.UI.Toggle[] toggles; 
    public int aux = 0; 

    public GameObject marker1, marker2, marker3; 

     void Awake() 
    { 
     //Find manually the objects 
     marker1 = GameObject.Find("Marcador1"); 
     marker2 = GameObject.Find("Marcador2"); 
     marker3 = GameObject.Find("Marcador3"); 
    } 


    void Start() 
    { 
     toggles = GetComponentsInChildren<UnityEngine.UI.Toggle>(); 


     if (toggles.Length > 0) 
     { 

      //2nd and 3rd false for not be displayed yet... 
      marker2.SetActive(false); 
      marker3.SetActive(false); 

      for (int i = 0; i < toggles.Length; i++) 
      { 

       int closureIndex = i;    
       toggles[closureIndex].interactable = false; 
       toggles[closureIndex].onValueChanged.AddListener((isOn) => 
       { 
        if (isOn == true) 
        { 
         aux++; 

         //Disabling the toggle that was clicked 
         toggles[closureIndex].interactable = false; 

         if (closureIndex < toggles.Length - 1) 
         { 
          //Activatin the next toggle 
          toggles[closureIndex + 1].interactable = true;       
         } 

         if (aux == 1) 
         { 
          //Desactivating the actual element and activating the next element 
          marker1.SetActive(false); 
          marker2.SetActive(true); 
         } 

         if (aux == 2) 
         { 
          //Desactivating the actual element and activating the next element 
          marker2.SetActive(false); 
          marker3.SetActive(true); 
         } 

         if (aux == 3) 
         { 
          marker3.SetActive(false); 
         } 

        } 
       } 
      ); 

      } 

      toggles[0].interactable = true; 
     }  
    } 
} 

Also, wie kann ich die GameObjects in intelligente bekommen wie die obigen Beispiele (array, list, tag) oder etwas anderes.

Antwort

0

Schleife über die Transformationshierarchie. Sie haben Ihre Objekte step1, step2, step3 ... schon einem Elternteil zugewiesen.

List<GameObject> steps = new List<GameObject>(); 

void Awake() { 
    GameObject parentObject = GameObject.Find("Steps"); 
    for(int i = 0; i < parentObject.transform.childCount; i++) { 
     steps.Add(parentObject.transform.GetChild(i)); 
    } 
} 
Verwandte Themen