如何在检查器中创建游戏对象的动态"数组"



我需要一些帮助。我有这个功能脚本可以通过下拉菜单启用/禁用游戏对象:

public class DROPDOWNOPT : MonoBehaviour
{

public Dropdown MenuDesplegable;
public GameObject GameObject1;
public GameObject GameObject2;
public GameObject GameObject3;

void Update()
{
switch(MenuDesplegable.value)
{
case 0:
GameObject1.SetActive(false);
GameObject2.SetActive(false);
GameObject3.SetActive(false);
break;

case 1:
GameObject1.SetActive(true);
GameObject2.SetActive(false);
GameObject3.SetActive(false);
break;

case 2:
GameObject2.SetActive(true);
GameObject1.SetActive(false);
GameObject3.SetActive(false);

break;

case 3:
GameObject3.SetActive(true);
GameObject2.SetActive(false);
GameObject1.SetActive(false);

break;

}

}

}

但该脚本只适用于特定数量的游戏对象。我需要在检查器中创建一个游戏对象列表,在那里我可以添加/附加所需数量的游戏对象。

这是我的尝试:

namespace Assets
{
class DynamicListOBJ : MonoBehaviour
{
public Dropdown MenuDesplegable;

[SerializeField]
private GameObject[] dynamicList;
private GameObject[] instanciatedObjects;

private void Start()
{
Fill();
}

public void Fill()
{
instanciatedObjects = new GameObject[dynamicList.Length];
for (int i = 0; i < dynamicList.Length; i++)
{
instanciatedObjects[i] = Instantiate(dynamicList[i]) as GameObject;
}
}

private void Update()
{
switch (MenuDesplegable.value)
{
case 0:
instanciatedObjects[i1].SetActive(true);
instanciatedObjects[i2].SetActive(false);
instanciatedObjects[i3].SetActive(false);
break;
case 1:
instanciatedObjects[i1].SetActive(false);
instanciatedObjects[i2].SetActive(true);
instanciatedObjects[i3].SetActive(false);
break;
case 3:
instanciatedObjects[i1].SetActive(false);
instanciatedObjects[i2].SetActive(false);
instanciatedObjects[i3].SetActive(true);
break;

}

}

}

}

我的问题是更新功能中的内容。我不知道如何引用和启用/禁用列表中的游戏对象。

能给我一些指导吗?。PD:我只需要同时激活一个游戏对象。PD1:在开始时,所有游戏对象都处于非活动状态。

已解决,解决方案:

using UnityEngine;
using UnityEngine.UI;
namespace Assets
{
class DynamicListOBJ : MonoBehaviour
{
public Dropdown MenuDesplegable;
//public GameObject ContentContainer; //used to set where the instantiated objects are added.
[SerializeField]
private GameObject[] dynamicList;
private GameObject[] instantiatedObjects;
private void Start()
{
Fill();
}
public void Fill()
{
instantiatedObjects = new GameObject[dynamicList.Length];
for (int i = 0; i < dynamicList.Length; i++)
{
instantiatedObjects[i] = (dynamicList[i]) as GameObject;
//instantiatedObjects[i] = Instantiate(dynamicList[i]) as GameObject;  //this create a instantiate clone
//instantiatedObjects[i].transform.parent = ContentContainer.transform;
//instantiatedObjects[i].transform.localScale = dynamicList[i].transform.localScale;
}
}
void DisableObjects()
{
foreach (GameObject o in instantiatedObjects)
{
o.SetActive(false);
}
}
public void DropdownValueChanged(int value)
{
DisableObjects();
instantiatedObjects[value].SetActive(true);
}

}
}

首先,您不需要在Update中执行此操作,因为只有当Dropdown值更改时,它才会更改。因此,首先我们将把我们的函数添加到Unity中的Dropdown中,并选择Dynamic int(Onvaluechanged,当你选择Unity的Dropdown时,你可以看到它(。

然后你可以使用这样的值:

void DisableObjects()
{
foreach (GameObject o in instanciatedObjects)
{
o.SetActive(false);
}
}
public void DropdownValueChanged(int value)
{
DisableObjects();
instanciatedObjects[value].SetActive(true);
}

最新更新