Перечисление, указывающее на gameobjects?
Итак, у меня есть эта сумасшедшая идея, чтобы перечисления указывали на gameobjects.
Вот что я хочу сделать:
/* 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);
}
}
Есть ли какой-нибудь способ заставить это работать? Или обходной путь?
Это может быть возможно с чем-то иным, чем перечисление, но я не знаю, есть ли оно, и я ищу в интернете такое решение.
2 ответа:
Это удовлетворило бы ваше требование, работает для любого количества значений перечисления или панелей.
// 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); } }
Я не знаю, почему ответ от: @ Paradox Forge был неправильным, но, возможно, это поможет вам.
У меня нет много времени, чтобы объяснить класс словаря, но вот как вы можете его использовать. Это будет стоить некоторой производительности, но имеет действительно хорошую читаемостьСистема.Коллекции.Родовой.Словарь
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, перейдите по ссылке: Dictionary