Guest User

GUISizer

a guest
Aug 11th, 2013
439
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Script GUISizer by Sergey Mohov (http://sergeymohov.com)
  3.  *
  4.  * Original idea for the resize algorithm by Simon Wittber (http://entitycrisis.blogspot.fr/)
  5.  *
  6.  * Feel free to reproduce this and use for any commercial or non-commercial projects.
  7.  *
  8.  * Although you don't have to, it would be nice of you to mention my name and link to my website
  9.  * if you decide to put this on the Wiki or expand.
  10.  *
  11.  * If you have questions, email me: sergey@sergeymohov.com
  12.  *
  13.  * */
  14.  
  15. using UnityEngine;
  16. using System.Collections;
  17. using System.Collections.Generic;
  18.  
  19. public static class GUISizer
  20. {
  21.     //get the screen resolution once, then adjust the GUI size to that resolution
  22.     public static float WIDTH = 960;
  23.     public static float HEIGHT = 600;
  24.    
  25.     //Get the button sizes
  26.     public const float SMALL_BUTTON_WIDTH = 100f;
  27.     public const float SMALL_BUTTON_HEIGHT = 50f;
  28.     public const float MEDIUM_BUTTON_WIDTH = 200f;
  29.     public const float MEDIUM_BUTTON_HEIGHT = 100f;
  30.     public const float LARGE_BUTTON_WIDTH = 300f;
  31.     public const float LARGE_BUTTON_HEIGHT = 100f;
  32.     public const float BUTTON_GAP = 10f;
  33.    
  34.     private static int fontSizeDefault = 12; //GUI skin's font size should be reset to its default value every time
  35.  
  36.     static List<Matrix4x4> stack = new List<Matrix4x4> ();
  37.    
  38.     //call this funtion in the beginning of OnGUI
  39.     static public void BeginGUI(PositionDef elementsPosition = PositionDef.middle)
  40.     {
  41.         stack.Add (GUI.matrix);
  42.         Matrix4x4 m = new Matrix4x4 ();
  43.         float w = (float)Screen.width;
  44.         float h = (float)Screen.height;
  45.         float aspect = w / h;
  46.         float scale = 1f;
  47.         Vector3 offset = Vector3.zero;
  48.        
  49.         if(aspect < (WIDTH/HEIGHT))
  50.         {
  51.             //screen is taller
  52.             switch(elementsPosition)
  53.             {
  54.                 case PositionDef.topLeft:
  55.                     scale = (Screen.width/WIDTH);
  56.                     break;
  57.                 case PositionDef.topMiddle:
  58.                     scale = (Screen.width/WIDTH);
  59.                     break;
  60.                 case PositionDef.topRight:
  61.                     scale = (Screen.width/WIDTH);
  62.                     break;
  63.                 case PositionDef.bottomLeft:
  64.                     scale = (Screen.width/WIDTH);
  65.                     offset.y += (Screen.height - (HEIGHT * scale));
  66.                     break;
  67.                 case PositionDef.bottomMiddle:
  68.                     scale = (Screen.width/WIDTH);
  69.                     offset.y += (Screen.height - (HEIGHT * scale));
  70.                     break;
  71.                 case PositionDef.bottomRight:
  72.                     scale = (Screen.width/WIDTH);
  73.                     offset.y += (Screen.height - (HEIGHT * scale));
  74.                     break;
  75.                 case PositionDef.left:
  76.                     scale = (Screen.width/WIDTH);
  77.                     offset.y += (Screen.height - (HEIGHT * scale)) * 0.5f;
  78.                     break;
  79.                 case PositionDef.right:
  80.                     scale = (Screen.width/WIDTH);
  81.                     offset.y += (Screen.height - (HEIGHT * scale)) * 0.5f;
  82.                     break;
  83.                 case PositionDef.middle:
  84.                     scale = (Screen.width/WIDTH);
  85.                     offset.y += (Screen.height - (HEIGHT * scale)) * 0.5f;
  86.                     break;
  87.                 default:
  88.                     scale = (Screen.width/WIDTH);
  89.                     offset.y += (Screen.height - (HEIGHT * scale)) * 0.5f;
  90.                     break;
  91.             }
  92.         }
  93.         else
  94.         {
  95.             //screen is wider
  96.             switch(elementsPosition)
  97.             {
  98.                 case PositionDef.topLeft:
  99.                     scale = (Screen.height / HEIGHT);
  100.                     break;
  101.                 case PositionDef.topMiddle:
  102.                     scale = (Screen.height / HEIGHT);
  103.                     offset.x += (Screen.width - (WIDTH * scale)) * 0.5f;
  104.                     break;
  105.                 case PositionDef.topRight:
  106.                     scale = (Screen.height / HEIGHT);
  107.                     offset.x += (Screen.width - (WIDTH * scale));
  108.                     break;
  109.                 case PositionDef.bottomLeft:
  110.                     scale = (Screen.height / HEIGHT);
  111.                     break;
  112.                 case PositionDef.bottomMiddle:
  113.                     scale = (Screen.height / HEIGHT);
  114.                     offset.x += (Screen.width - (WIDTH * scale)) * 0.5f;
  115.                     break;
  116.                 case PositionDef.bottomRight:
  117.                     scale = (Screen.height / HEIGHT);
  118.                     offset.x += (Screen.width - (WIDTH * scale));
  119.                     break;
  120.                 case PositionDef.left:
  121.                     scale = (Screen.height / HEIGHT);
  122.                     break;
  123.                 case PositionDef.right:
  124.                     scale = (Screen.height / HEIGHT);
  125.                     offset.x += (Screen.width - (WIDTH * scale));
  126.                     break;
  127.                 case PositionDef.middle:
  128.                     scale = (Screen.height / HEIGHT);
  129.                     offset.x += (Screen.width - (WIDTH * scale)) * 0.5f;
  130.                     break;
  131.                 default:
  132.                     scale = (Screen.height / HEIGHT);
  133.                     offset.x += (Screen.width - (WIDTH * scale)) * 0.5f;
  134.                     break;
  135.             }
  136.         }
  137.        
  138.         m.SetTRS(offset, Quaternion.identity, Vector3.one * scale);
  139.         GUI.matrix *= m;
  140.     }
  141.    
  142.     //call this function in the end of OnGUI
  143.     static public void EndGUI()
  144.     {
  145.         GUI.matrix = stack[stack.Count - 1];
  146.         stack.RemoveAt (stack.Count - 1);
  147.     }
  148.    
  149.     //enum that defines position presets
  150.     public enum PositionDef
  151.     {
  152.         topLeft,
  153.         topMiddle,
  154.         topRight,
  155.         bottomLeft,
  156.         bottomMiddle,
  157.         bottomRight,
  158.         left,
  159.         right,
  160.         middle
  161.     }
  162.    
  163.     //enum that defines size presets
  164.     public enum SizeDef
  165.     {
  166.         small,
  167.         medium,
  168.         big
  169.     }
  170.    
  171.     #region methods
  172.     //a method that converts GUIParams into a Rect
  173.     public static Rect MakeRect (GUIParams guiParams)
  174.     {
  175.         Rect rectangle = new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height);
  176.            
  177.         return rectangle;
  178.     }
  179.    
  180.     //draws a button and returns true if it was pressed
  181.     public static bool ButtonPressed(GUIParams guiParams)
  182.     {
  183.         GUI.skin.button.fontSize = (int)guiParams.fontSize;
  184.         if (GUI.Button(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text))
  185.         {
  186.             GUI.skin.button.fontSize = fontSizeDefault;
  187.             return true;
  188.         }
  189.         else
  190.         {
  191.             GUI.skin.button.fontSize = fontSizeDefault;
  192.             return false;
  193.         }
  194.     }
  195.    
  196.     //overload method that lets you make custom font sizes
  197.     public static bool ButtonPressed(GUIParams guiParams, int customFontSize)
  198.     {
  199.         GUI.skin.button.fontSize = customFontSize;
  200.         if (GUI.Button(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text))
  201.         {
  202.             GUI.skin.button.fontSize = fontSizeDefault;
  203.             return true;
  204.         }
  205.         else
  206.         {
  207.             GUI.skin.button.fontSize = fontSizeDefault;
  208.             return false;
  209.         }
  210.     }
  211.    
  212.     //draws a label
  213.     public static void MakeLabel(GUIParams guiParams, string additionalText = "")
  214.     {
  215.         GUI.skin.label.fontSize = (int)guiParams.fontSize;
  216.         GUI.Label(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text + additionalText);
  217.         GUI.skin.label.fontSize = fontSizeDefault;
  218.     }
  219.    
  220.     //overload method that lets you make custom font sizes
  221.     public static void MakeLabel(GUIParams guiParams, int customFontSize, string additionalText = "")
  222.     {
  223.         GUI.skin.label.fontSize = customFontSize;
  224.         GUI.Label(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text + additionalText);
  225.         GUI.skin.label.fontSize = fontSizeDefault;
  226.     }
  227.    
  228.     #endregion
  229.    
  230.     #region overload methods that let you define a custom style for your GUI element
  231.     //draws a button and returns true if it was pressed
  232.     public static bool ButtonPressed(GUIParams guiParams, GUIStyle style)
  233.     {
  234.         GUI.skin.button.fontSize = (int)guiParams.fontSize;
  235.         if (GUI.Button(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text, style))
  236.         {
  237.             GUI.skin.button.fontSize = fontSizeDefault;
  238.             return true;
  239.         }
  240.         else
  241.         {
  242.             GUI.skin.button.fontSize = fontSizeDefault;
  243.             return false;
  244.         }
  245.     }
  246.    
  247.     //overload method that lets you make custom font sizes
  248.     public static bool ButtonPressed(GUIParams guiParams, int customFontSize, GUIStyle style)
  249.     {
  250.         GUI.skin.button.fontSize = customFontSize;
  251.         if (GUI.Button(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text, style))
  252.         {
  253.             GUI.skin.button.fontSize = fontSizeDefault;
  254.             return true;
  255.         }
  256.         else
  257.         {
  258.             GUI.skin.button.fontSize = fontSizeDefault;
  259.             return false;
  260.         }
  261.     }
  262.    
  263.     //draws a label
  264.     public static void MakeLabel(GUIParams guiParams, GUIStyle style , string additionalText = "")
  265.     {
  266.         GUI.skin.label.fontSize = (int)guiParams.fontSize;
  267.         GUI.Label(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text + additionalText, style);
  268.         GUI.skin.label.fontSize = fontSizeDefault;
  269.     }
  270.    
  271.     //overload method that lets you make custom font sizes
  272.     public static void MakeLabel(GUIParams guiParams, int customFontSize, GUIStyle style , string additionalText = "")
  273.     {
  274.         GUI.skin.label.fontSize = customFontSize;
  275.         GUI.Label(new Rect(guiParams.x, guiParams.y, guiParams.width, guiParams.height), guiParams.text + additionalText, style);
  276.         GUI.skin.label.fontSize = fontSizeDefault;
  277.     }
  278.     #endregion
  279.    
  280.    
  281.     //struct for GUI elements
  282.     public struct GUIParams
  283.     {
  284.         //position of the button on screen
  285.         public float x;
  286.         public float y;
  287.        
  288.         //size of the button
  289.         public float width;
  290.         public float height;
  291.        
  292.         /*size of the font of the text written on the button, proportional to the length of the button
  293.         instead of writing 7 more constructors for custom font sizes, you can override the font in all methods that draw GUI elements*/
  294.         public float fontSize;
  295.        
  296.         public string text; //text written in the button
  297.        
  298.         #region Default style constructors
  299.         //default everything
  300.         public GUIParams(string guiText)
  301.         {
  302.             text = guiText;
  303.            
  304.             //size defaults to medium
  305.             Vector2 buttonSize = SetSize(SizeDef.medium);
  306.             width = buttonSize.x;
  307.             height = buttonSize.y;
  308.            
  309.             //position defaults to middle
  310.             Vector2 buttonPos = SetPosition(PositionDef.middle, width, height);
  311.             x = buttonPos.x;
  312.             y = buttonPos.y;
  313.            
  314.             fontSize = width/6;
  315.         }
  316.        
  317.         //specify all params manually
  318.         public GUIParams (float posX, float posY, float guiWidth, float guiHeight, string guiText)
  319.         {  
  320.             text = guiText;
  321.            
  322.             x = posX;
  323.             y = posY;
  324.            
  325.             width = guiWidth;
  326.             height = guiHeight;
  327.            
  328.             fontSize = width/6;
  329.         }
  330.        
  331.         //specify position manually, choose size from the list
  332.         public GUIParams (float posX, float posY, SizeDef size, string guiText)
  333.         {
  334.             text = guiText;
  335.            
  336.             Vector2 buttonSize = SetSize(size);
  337.             width = buttonSize.x;
  338.             height = buttonSize.y;
  339.            
  340.             x = posX;
  341.             y = posY;
  342.            
  343.             fontSize = width/6;
  344.         }
  345.        
  346.         //specify size manually, choose position from the list
  347.         public GUIParams (PositionDef position, float guiWidth, float guiHeight, string guiText)
  348.         {
  349.             text = guiText;
  350.            
  351.             width = guiWidth;
  352.             height = guiHeight;
  353.            
  354.             Vector2 buttonPos = SetPosition(position, width, height);
  355.             x = buttonPos.x;
  356.             y = buttonPos.y;
  357.            
  358.             fontSize = width/6;
  359.         }
  360.        
  361.         //choose size from the list, default position
  362.         public GUIParams (SizeDef size, string guiText)
  363.         {
  364.             text = guiText;
  365.            
  366.             Vector2 buttonSize = SetSize(size);
  367.             width = buttonSize.x;
  368.             height = buttonSize.y;
  369.            
  370.             //position defaults to middle
  371.             Vector2 buttonPos = SetPosition(PositionDef.middle, width, height);
  372.             x = buttonPos.x;
  373.             y = buttonPos.y;
  374.  
  375.            
  376.             fontSize = width/6;
  377.         }
  378.        
  379.         //choose position from the list, default size
  380.         public GUIParams (PositionDef position, string guiText)
  381.         {
  382.             text = guiText;
  383.            
  384.             //size defaults to medium
  385.             Vector2 buttonSize = SetSize(SizeDef.medium);
  386.             width = buttonSize.x;
  387.             height = buttonSize.y;
  388.            
  389.             Vector2 buttonPos = SetPosition(position, width, height);
  390.             x = buttonPos.x;
  391.             y = buttonPos.y;
  392.            
  393.             fontSize = width/6;
  394.         }
  395.        
  396.         //choose size and position from the list
  397.         public GUIParams (PositionDef position, SizeDef size, string guiText)
  398.         {
  399.             text = guiText;
  400.            
  401.             Vector2 buttonSize = SetSize(size);
  402.             width = buttonSize.x;
  403.             height = buttonSize.y;
  404.            
  405.             Vector2 buttonPos = SetPosition(position, width, height);
  406.             x = buttonPos.x;
  407.             y = buttonPos.y;
  408.                        
  409.             fontSize = width/6;
  410.         }
  411.         #endregion
  412.     }
  413.    
  414.     //button sizes can be set in this method
  415.     private static Vector2 SetSize(SizeDef size)
  416.     {
  417.         Vector2 finalSize;
  418.        
  419.         switch (size)
  420.         {
  421.             case SizeDef.small:
  422.                 finalSize = new Vector2(SMALL_BUTTON_WIDTH, SMALL_BUTTON_HEIGHT);
  423.                 break;
  424.            
  425.             case SizeDef.medium:
  426.                 finalSize = new Vector2(MEDIUM_BUTTON_WIDTH, MEDIUM_BUTTON_HEIGHT);
  427.                 break;
  428.            
  429.             case SizeDef.big:
  430.                 finalSize = new Vector2(LARGE_BUTTON_WIDTH, LARGE_BUTTON_HEIGHT);
  431.                 break;
  432.             default:
  433.                 Debug.LogError("Unknown button size, defaults to medium.");
  434.                 finalSize = new Vector2(MEDIUM_BUTTON_WIDTH, MEDIUM_BUTTON_HEIGHT);
  435.                 break;
  436.         }
  437.        
  438.         return finalSize;
  439.     }
  440.    
  441.     //button positions can be set in this method
  442.     private static Vector2 SetPosition(PositionDef position, float width, float height)
  443.     {
  444.         Vector2 finalPosition;
  445.            
  446.             switch (position)
  447.             {
  448.                 case PositionDef.topLeft:
  449.                     finalPosition = new Vector2(BUTTON_GAP, BUTTON_GAP);
  450.                     break;
  451.                
  452.                 case PositionDef.topMiddle:
  453.                     finalPosition = new Vector2(WIDTH/2-width/2, BUTTON_GAP);
  454.                     break;
  455.                
  456.                 case PositionDef.topRight:
  457.                     finalPosition = new Vector2(WIDTH-width-BUTTON_GAP, BUTTON_GAP);
  458.                     break;
  459.                
  460.                 case PositionDef.bottomLeft:
  461.                     finalPosition = new Vector2(BUTTON_GAP, HEIGHT-height-BUTTON_GAP);
  462.                     break;
  463.                
  464.                 case PositionDef.bottomMiddle:
  465.                     finalPosition = new Vector2(WIDTH/2-width/2, HEIGHT-height-BUTTON_GAP);
  466.                     break;
  467.                
  468.                 case PositionDef.bottomRight:
  469.                     finalPosition = new Vector2(WIDTH-width-BUTTON_GAP, HEIGHT-height-BUTTON_GAP);
  470.                     break;
  471.                
  472.                 case PositionDef.left:
  473.                     finalPosition = new Vector2(BUTTON_GAP, HEIGHT/2-height/2);
  474.                     break;
  475.                
  476.                 case PositionDef.right:
  477.                     finalPosition = new Vector2(WIDTH-width-BUTTON_GAP, HEIGHT/2-height/2);
  478.                     break;
  479.                
  480.                 case PositionDef.middle:
  481.                     finalPosition = new Vector2(WIDTH/2-width/2, HEIGHT/2-height/2);
  482.                     break;
  483.            
  484.                 default:
  485.                     finalPosition = new Vector2(WIDTH/2-width/2, HEIGHT/2-height/2);
  486.                     Debug.LogError("Undefined position, assigned to middle.");
  487.                     break;
  488.             }
  489.  
  490.         return finalPosition;
  491.     }
  492. }
RAW Paste Data