c# - 如何在检查器中创建游戏对象的动态“数组”
问题描述
我需要一些帮助。我有这个功能脚本可以通过下拉菜单启用/禁用游戏对象:
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);
}
推荐阅读
- java - javafx.fxml.LoadException 错误!有任何想法吗?
- c# - 设计datagridview,在第一行搜索
- rxjs - 如何使用 ngrx 将一个可观察数组投影到另一个数组?
- r - 如何结合条形图和点图与 ggplot2 同时进行数据可视化?
- c# - HttpClient.PostAsync 的字符编码问题
- python - Mako NameError,不评估循环
- python - NameError:名称“队列”未定义
- javascript - sessionStorage.token() 无论选择如何,都默认为最后一个值
- python - 将函数应用于数组
- python - TensorFlow 中 SparseCategoricalCrossentropy 的条件加权