Skip to content

Instantly share code, notes, and snippets.

@AngryAnt
Created September 30, 2012 07:38
Show Gist options
  • Save AngryAnt/3806175 to your computer and use it in GitHub Desktop.
Save AngryAnt/3806175 to your computer and use it in GitHub Desktop.
Example code for "Building a menu of delegates and enums" blog post on AngryAnt.com
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Menu : MonoBehaviour
{
delegate void OnGUIImplementation();
public enum MenuState {Main,Settings,Credits};
public struct Settings
{
public bool m_ThisSetting, m_ThatSetting, m_TheOtherSetting;
};
static Vector2 m_StandardMenuSize = new Vector2 (200.0f, 300.0f);
static string m_LogoURL = "http://download.unity3d.com/images/top-menu/mm_unity_icon.png";
static Texture2D m_Logo = null;
private MenuState m_CurrentState = MenuState.Main;
private Dictionary m_Menus;
private Settings m_Settings;
void Awake ()
{
m_Menus = new Dictionary ();
m_Menus [MenuState.Main] = OnMainMenuGUI;
m_Menus [MenuState.Settings] = OnSettingsGUI;
m_Menus [MenuState.Credits] = OnCreditsGUI;
StartCoroutine (GetLogo ());
}
IEnumerator GetLogo ()
{
WWW www = new WWW (m_LogoURL);
yield return www;
if (www.error == null)
{
m_Logo = www.texture;
}
}
public void OnGUI ()
{
m_Menus [m_CurrentState] ();
}
static void BeginStandardMenu (string title)
{
GUILayout.BeginArea (new Rect ((Screen.width - m_StandardMenuSize.x) * 0.5f, (Screen.height - m_StandardMenuSize.y) * 0.5f, m_StandardMenuSize.x, m_StandardMenuSize.y));
GUILayout.BeginVertical (GUI.skin.GetStyle ("Box"));
GUILayout.Label (title, GUI.skin.GetStyle ("Box"));
}
static void EndStandardMenu ()
{
Color color;
GUILayout.BeginHorizontal ();
GUILayout.FlexibleSpace ();
color = GUI.color;
GUI.color = Color.grey;
GUILayout.Label ("My game version 2.4X");
GUI.color = color;
GUILayout.FlexibleSpace ();
GUILayout.EndHorizontal ();
GUILayout.EndVertical ();
GUILayout.EndArea ();
}
void OnMainMenuGUI ()
{
BeginStandardMenu ("Main menu");
if (m_Logo != null)
{
GUILayout.BeginHorizontal ();
GUILayout.FlexibleSpace ();
GUILayout.Label (m_Logo);
GUILayout.FlexibleSpace ();
GUILayout.EndHorizontal ();
}
if (GUILayout.Button ("New game"))
{
Application.LoadLevel ("Level one");
}
m_CurrentState = GUILayout.Button ("Settings") ? MenuState.Settings : m_CurrentState;
m_CurrentState = GUILayout.Button ("Credits") ? MenuState.Credits : m_CurrentState;
GUILayout.FlexibleSpace ();
EndStandardMenu ();
}
void OnSettingsGUI ()
{
BeginStandardMenu ("Settings");
m_Settings.m_ThisSetting = GUILayout.Toggle (m_Settings.m_ThisSetting, "This setting");
m_Settings.m_ThatSetting = GUILayout.Toggle (m_Settings.m_ThatSetting, "That setting");
m_Settings.m_TheOtherSetting = GUILayout.Toggle (m_Settings.m_TheOtherSetting, "The other setting", GUI.skin.GetStyle ("Button"));
GUILayout.FlexibleSpace ();
m_CurrentState = GUILayout.Button ("Main menu") ? MenuState.Main : m_CurrentState;
EndStandardMenu ();
}
void OnCreditsGUI ()
{
BeginStandardMenu ("Credits");
GUILayout.Label ("This game was created by some of the most awesomestest people on the planet. Having failed in their mission to Pluto, they started making games, which - as you can see - resulted in much joy and success!");
GUILayout.Space (20.0f);
GUILayout.BeginHorizontal ();
GUILayout.FlexibleSpace ();
GUILayout.Label ("The awesomestest people inc.");
GUILayout.EndHorizontal ();
GUILayout.FlexibleSpace ();
m_CurrentState = GUILayout.Button ("Main menu") ? MenuState.Main : m_CurrentState;
EndStandardMenu ();
}
}
m_Menus [MenuState.MyMenuState] = OnMyMenuGUI;
public void OnGUI ()
{
m_Menus [m_CurrentState] ();
}
m_CurrentState = GUILayout.Button ("Credits") ? MenuState.Credits : m_CurrentState;
@Rinzler13
Copy link

Can you update this to work with unity 4?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment