【问题标题】:How to create a dynamic "array" of gameobjects in inspector如何在检查器中创建游戏对象的动态“数组”
【发布时间】:2020-09-19 23:41:53
【问题描述】:

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

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

}

【问题讨论】:

  • 您像数组一样引用它们。只是 for 循环它们
  • 你好,你能再解释一下吗?我自己创建了第一个脚本,但第二个我遵循了一些示例,但我不完全了解如何创建语法

标签: c# unity3d


【解决方案1】:

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

【讨论】:

  • 您好,感谢您的回答。我添加了你的两个函数,我将: instanciatedObjects[index].SetActive(true); 更改为 instanciatedObjects[value].SetActive(true); 它似乎有效(实例化的对象正在启用/禁用)。但我的 Fill() 函数仍然存在问题。它创建的“克隆”游戏对象是在我的面板容器之外创建的,因此它们不会显示在屏幕中。
  • 实例化时必须给出坐标。喜欢Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity); [docs.unity3d.com/ScriptReference/Object.Instantiate.html]
  • 谢谢,现在解决了,我把你的解决方案加到主帖里了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2022-07-27
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2020-11-20
相关资源
最近更新 更多