通过切换激活和停用GameObjects - 增强现实

时间:2017-06-28 18:28:53

标签: c# unity3d augmented-reality artoolkit

我正在使用ArToolkit制作增强现实的应用程序。

这很简单。

我在切换阶段显示了一些元素。例如,我有3个元素

3 Elements

当我跑步时,会显示一个元素。如果我先点击toggle,则隐藏此元素并显示下一个元素。当我点击第二个toggle时,前一个元素隐藏,下一个元素显示。

换句话说,当我只运行时,会显示第一个元素(Cube)。当我点击第一个切换时,每个元素(立方体,esphere,cilinder)都显示:

第1步: Step1

第2步: step2

第3步: step3

这是我的等级:

hierarchy

内部ArControlador是标记。内部Canvas是切换。

但是,实际上我是以粗鲁的方式构建这个项目,用GameObject.Find获取每个元素。我希望以优雅的方式获取GameObjects,清洁代码并且它可以扩展。

我想以自动方式获取GameObjects,所以如果我有3个,5个,10个或20个元素,代码将完美运行。

我认为在Array的{​​{1}},GameObjects List的某些可能性中,创建一个GameObjects父亲并让所有孩子都像GameObject但我没有成功。

这是我的代码,它已经有效,但是以粗鲁的方式,FindGameObjectsWithTag每个GameObject并使用GameObject变量启用/禁用GameObjects,请参阅:

aux

那么,我如何以上述示例(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; } } } GameObjectsarray)或其他方式以智能方式获取list

1 个答案:

答案 0 :(得分:0)

循环转换层次结构。您已经将step1,step2,step3 ...对象分配给父级。

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));
    }
}