Enum указывает на игровые объекты?

Итак, у меня есть эта сумасшедшая идея иметь перечисления, указывающие на игровые объекты.

Вот что я хочу сделать:

/* These enums would hold gameobjects instead of ints */
enum exampleEnum{
    AddPanel,
    ListPanel
}

public class GUIManager : MonoBehaviour {
    void Start()
    {
        EnablePanel(exampleEnum.AddPanel);
    }

    void EnablePanel(GameObject panel)
    {
        panel.setActive(true);
    }
}

Есть ли способ сделать эту работу? Или обходной путь?

Это может быть возможно с чем-то другим, кроме перечисления, но я не знаю об этом, если есть, и я просматриваю веб-страницы для такого решения.

c#,unity3d,enums,gameobject,

2

Ответов: 2


6 голосов принято

Это удовлетворит ваше требование, работает для любого количества значений или панелей перечисления.

// Add this to each of your panels, the enum field can be integrated into your other behaviours as well
public class EnumPanel : MonoBehaviour 
{
    // configurable from the Editor, the unity way.
    public ExampleEnum Type;
}

// Assign all your panles in the editor (or use FindObjectsByType<EnumPanel> in Start())
public class GUIManager : MonoBehaviour 
{
    // configurable from the Editor, the unity way.
    public EnumPanel[] Panels;

    void Start()
    {
        // Optionally find it at runtime, if assigning it via the editor is too much maintenance.
        // Panels = FindObjectsByType<EnumPanel>();
        EnablePanel(ExampleEnum.AddPanel);
    }

    void EnablePanel(ExampleEnum panelType)
    {
        foreach(var panel in Panels)
        {
            if(panel.Type == panelType)
                EnablePanel(panel.gameObject);
        }
    }


    void EnablePanel(GameObject panel)
    {
        panel.setActive(true);
    }
}

1

Я не знаю, почему ответ от: @Paradox Forge был неправильным, но, возможно, это поможет вам.

System.Collections.Generic.Dictionary

У меня нет много времени, чтобы объяснить класс словаря, но вы можете его использовать. Это будет стоить некоторую производительность, но имеет действительно хорошую читаемость

    public class GUIManager : MonoBehaviour {
        public enum exampleEnum{
            AddPanel,
            ListPanel
        }

        //For readability you can also add "using System.Collections.Generic;" on the top of your script
        private System.Collections.Generic.Dictionary<exampleEnum,GameObject> exampleDictionary = new System.Collections.Generic.Dictionary<exampleEnum, GameObject>();

        private GameObject SomeGameObject;
        private GameObject SomeOtherGameObject;

        void Start()
        {
            //You have to add all the enums and objects you want to use inside your GUIManager.
            exampleDictionary.Add (exampleEnum.AddPanel, SomeGameObject); //Add panel will be linked to SomeGameObject
            exampleDictionary.Add (exampleEnum.ListPanel, SomeOtherGameObject); //List Panel will be linked to SomeOtherGameObject

            EnablePanel(exampleEnum.AddPanel);
        }

        void EnablePanel(exampleEnum examplePanel)
        {
            if (!exampleDictionary.ContainsKey (examplePanel)) //If the given panel does not exist inside the dictionary
                return; //Leave the method

            GameObject panelToEnable = exampleDictionary [examplePanel]; //Will return the GameObject linked to given panel
            panelToEnable.SetActive(true); //Enable the gameobject
        }
    }

Если вы хотите больше узнать о классе Dictionary, перейдите по ссылке : Словарь

C #, Unity3D, перечислений, геймобжекты,
Похожие вопросы