首页 > 解决方案 > 如何在检查器中创建游戏对象的动态“数组”

问题描述

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

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

}

标签: c#unity3d

解决方案


首先,您不需要在 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);
}

推荐阅读