我正在使用ArToolkit制作增强现实的应用程序。
这很简单。
我在切换阶段显示了一些元素。例如,我有3个元素
当我跑步时,会显示一个元素。如果我先点击toggle
,则隐藏此元素并显示下一个元素。当我点击第二个toggle
时,前一个元素隐藏,下一个元素显示。
换句话说,当我只运行时,会显示第一个元素(Cube)。当我点击第一个切换时,每个元素(立方体,esphere,cilinder)都显示:
这是我的等级:
内部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;
}
}
}
,GameObjects
,array
)或其他方式以智能方式获取list
。
答案 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));
}
}