2016-10-12 2 views
2

Also, ich habe diese verrückte Idee, Enums auf Spielobjekte zu zeigen.Enum auf Spielobjekte zeigen?

Hier ist, was ich tun möchte:

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

Gibt es eine Möglichkeit, diese Arbeit zu machen? Oder ein Workaround?

Das könnte mit etwas anderem als einem Enum möglich sein, aber ich weiß es nicht, wenn es da ist und ich schaue im Web nach einer solchen Lösung.

+1

Verwenden Sie ein Schaltergehäuse. –

+0

Ich möchte nicht einen massiven Schalter, der leider eine Reihe von Fällen hält. – Alox

+0

Ich möchte, dass das funktioniert und sauber ist, auch wenn ich 500 Panels aktivieren musste. – Alox

Antwort

6

Dies würde Ihre Anforderung erfüllen, funktioniert für jede Menge Enum-Werte oder Panels.

// 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); 
    } 
} 
+0

@Alox war das wonach du gesucht hast? Wenn ja, markieren Sie die Antwort so, dass sie aus dem unbeantworteten Abschnitt entfernt wird. –

+0

Entschuldigung, ich war in einer Besprechung, es sieht so aus, als ob ich es suche, ich werde es ausprobieren, um sicher zu sein, aber einfach, indem ich mir den Code anschaue, sieht es wie eine großartige Antwort aus. – Alox

+1

Nur eine kleine Randnotiz, verwenden Sie nicht eine "foreach", um die Panels zu iterieren, wenn Sie etwas anderes als ein Array (eine Liste zum Beispiel) verwenden, verwenden Sie ein 'for' spart Garbage Collection (40 Bytes für den IEnumerator) Dies gibt Ihnen einen etwas höheren FPS und kostet nur 1 zusätzliche Codezeile. Ich habe es der Übersichtlichkeit halber nicht oben in mein Codebeispiel eingefügt. –

1

Ich weiß nicht, warum die Antwort von: @Paradox Forge falsch war, aber vielleicht wird dir das helfen.

System.Collections.Generic.Dictionary

die Wörterbuch-Klasse nicht viel Zeit haben, zu erklären, aber das ist, wie Sie es verwenden können. Dies wird einige Leistung kosten, aber hat wirklich schöne Lesbarkeit

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

Wenn Sie mehr über die Dictionary-Klasse wissen wollen, gehen Sie zu: Dictionary

+0

Danke! Ich habe nur von Wörterbüchern gehört, aber ich war nicht sicher, wie man sie benutzt, das ist auch eine mögliche Antwort auf meine Frage, aber ich kann leider keine zwei Antworten haben. – Alox