Skip to content

Instantly share code, notes, and snippets.

@AngryAnt
Created September 30, 2012 07:38
Show Gist options
  • Select an option

  • Save AngryAnt/3806175 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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