public void initButton(int btnXLocation, int btnYLocation, String btnText, String btnToolTip, Nullable <Color> btnBackgroundColor = null, Nullable <Color> btnTextColor = null, Nullable <Color> backbtnBackgroundColor = null, Nullable <Color> backbtnTextColor = null)
        {
            Transform menu = UnityEngine.Object.Instantiate <Transform>(QuickMenuStuff.GetQuickMenuInstance().transform.Find("CameraMenu"), QuickMenuStuff.GetQuickMenuInstance().transform);

            menuName  = "CustomMenu" + btnQMLoc + "_" + btnXLocation + "_" + btnYLocation;
            menu.name = menuName;

            mainButton = new QMSingleButton(btnQMLoc, btnXLocation, btnYLocation, btnText, delegate() { QuickMenuStuff.ShowQuickmenuPage(menuName); }, btnToolTip, btnBackgroundColor, btnTextColor);

            IEnumerator enumerator = menu.transform.GetEnumerator();

            while (enumerator.MoveNext())
            {
                object    obj     = enumerator.Current;
                Transform btnEnum = (Transform)obj;
                if (btnEnum != null)
                {
                    UnityEngine.Object.Destroy(btnEnum.gameObject);
                }
            }

            if (backbtnTextColor == null)
            {
                backbtnTextColor = Color.yellow;
            }
            backButton = new QMSingleButton(this, 4, 2, "Back", delegate() { QuickMenuStuff.ShowQuickmenuPage(btnQMLoc); }, "Go Back", backbtnBackgroundColor, backbtnTextColor);
        }
        private void initButton(int btnXLocation, int btnYLocation, String btnText, UnityAction btnAction, String btnToolTip, Nullable <Color> btnBackgroundColor = null, Nullable <Color> btnTextColor = null)
        {
            Transform btnTemplate = null;

            btnTemplate = QuickMenuStuff.GetQuickMenuInstance().transform.Find("ShortcutMenu/WorldsButton");

            button = UnityEngine.Object.Instantiate <GameObject>(btnTemplate.gameObject, QuickMenuStuff.GetQuickMenuInstance().transform.Find(btnQMLoc), true);

            initShift[0] = -1;
            initShift[1] = 0;
            setLocation(btnXLocation, btnYLocation);
            setButtonText(btnText);
            setToolTip(btnToolTip);
            setAction(btnAction);

            if (btnBackgroundColor != null)
            {
                setBackgroundColor((Color)btnBackgroundColor);
            }
            if (btnTextColor != null)
            {
                setTextColor((Color)btnTextColor);
            }

            setActive(true);
        }
        private void initButton(int btnXLocation, int btnYLocation, String btnTextOn, UnityAction btnActionOn, String btnTextOff, UnityAction btnActionOff, String btnToolTip, Nullable <Color> btnBackgroundColor = null, Nullable <Color> btnTextColor = null)
        {
            Transform btnTemplate = null;

            btnTemplate = QuickMenuStuff.GetQuickMenuInstance().transform.Find("UserInteractMenu/BlockButton");

            button = UnityEngine.Object.Instantiate <GameObject>(btnTemplate.gameObject, QuickMenuStuff.GetQuickMenuInstance().transform.Find(btnQMLoc), true);

            btnOn  = button.transform.Find("Toggle_States_Visible/ON").gameObject;
            btnOff = button.transform.Find("Toggle_States_Visible/OFF").gameObject;

            initShift[0] = -4;
            initShift[1] = 0;
            setLocation(btnXLocation, btnYLocation);

            setOnText(btnTextOn);
            setOffText(btnTextOff);
            Text[] btnTextsOn = btnOn.GetComponentsInChildren <Text>();
            btnTextsOn[0].name = "Text_ON";
            btnTextsOn[1].name = "Text_OFF";
            Text[] btnTextsOff = btnOff.GetComponentsInChildren <Text>();
            btnTextsOff[0].name = "Text_ON";
            btnTextsOff[1].name = "Text_OFF";

            setToolTip(btnToolTip);
            button.transform.GetComponentInChildren <UiTooltip>().SetToolTipBasedOnToggle();

            setAction(btnActionOn, btnActionOff);
            btnOn.SetActive(false);
            btnOff.SetActive(true);

            if (btnBackgroundColor != null)
            {
                setBackgroundColor((Color)btnBackgroundColor);
            }

            if (btnTextColor != null)
            {
                setTextColor((Color)btnTextColor);
            }

            setActive(true);
        }
        public IEnumerator Start()
        {
            //Q_RUBYLogo is initially set as a QMSingleButton, so we want to instantiate
            //a new one with all of the properties that we want
            Q_RUBYLogo = new QMSingleButton(
                //BtnMenu -> this has 3 possible types, "ShortcutMenu", "UserInteractMenu" or a QMNestedButton (button that opens up to other buttons)
                //ShortcutMenu -> main quick menu with worlds/avatars
                //UserInteractMenu -> quick menu when selecting a player
                "ShortcutMenu",
                //The x and y coordinates of the button. 0,0 is considered one to the left of worlds button.
                //x -> positive moves you to the right
                //y -> positive moves you down
                5, -1,
                //The main text of the button
                "RUBY",
                //The action you want the button to do when it is pressed, delegate() { } is a must have
                delegate()
            {
                System.Diagnostics.Process.Start("https://www.vrchaven.com/");
                QuickMenuStuff.GetQuickMenuInstance().CloseMenu();
            },
                //The tooltip of the button (the text on top when hovering over the button)
                "Client by DubyaDude <3\nClicking here will open a browser to the website.",
                //First color is background color, second color is text color. If not filled in or set to null, default colors will stay
                Color.cyan, Color.white
                );
            //Now you have a new button!



            //This creates a custom sprite for the Q_RUBYLogo button
            Sprite logoSprite = new Sprite();

            using (WWW www = new WWW("https://www.vrchaven.com/img/logo.png"))
            {
                yield return(www);

                logoSprite = Sprite.Create(www.texture, new Rect(0, 0, www.texture.width, www.texture.height),
                                           new Vector2(0, 0));
            }

            Q_RUBYLogo.getGameObject().GetComponentInChildren <UnityEngine.UI.Image>().sprite = logoSprite;
            Material logoMaterial = new Material(Q_RUBYLogo.getGameObject().GetComponentInChildren <UnityEngine.UI.Image>().material);

            logoMaterial.shader = Shader.Find("Unlit/Transparent");
            Q_RUBYLogo.getGameObject().GetComponentInChildren <UnityEngine.UI.Image>().material = logoMaterial;


            //Q_Functions is initially set as a QMNestedButton, so we want to instantiate
            //a new one with all of the properties that we want
            Q_Functions = new QMNestedButton(
                //BtnMenu -> this has 3 possible types, "ShortcutMenu", "UserInteractMenu" or a QMNestedButton (button that opens up to other buttons)
                //ShortcutMenu -> main quick menu with worlds/avatars
                //UserInteractMenu -> quick menu when selecting a player
                "ShortcutMenu",
                //The x and y coordinates of the button. 0,0 is considered one to the left of worlds button.
                //x -> positive moves you to the right
                //y -> positive moves you down
                5, 2,
                //The main text of the nested button
                "Functions",
                //The tooltip of the button (the text on top when hovering over the button)
                "A little bit of extra stuff",
                //(Nested button) First color is background color, second color is text color. If not filled in or set to null, default colors will stay
                Color.cyan, Color.white,
                //(Back button in nested page) First color is background color, second color is text color. If not filled in or set to null, default colors will stay
                Color.cyan, Color.yellow
                );

            //Moves the back button one to the right for more room
            Q_Functions.getBackButton().setLocation(2, 0);


            //Q_F_Gain is initially set as a QMToggleButton, so we want to instantiate
            //a new one with all of the properties that we want
            Q_F_Gain = new QMToggleButton(
                //BtnMenu -> this has 3 possible types, "ShortcutMenu", "UserInteractMenu" or a QMNestedButton (button that opens up to other buttons)
                //ShortcutMenu -> main quick menu with worlds/avatars
                //UserInteractMenu -> quick menu when selecting a player
                Q_Functions,
                //The x and y coordinates of the button. 0,0 is considered one to the left of worlds button.
                //x -> positive moves you to the right
                //y -> positive moves you down
                1, 0,
                //The text for the 'on' position of the button
                "Max Gain",
                //The 'on' action of the button
                delegate()
            {
                Console.WriteLine("Max Gain");
            },
                //The text for the 'off' position of the button
                "Normal Gain",
                //The 'off' action of the button
                delegate()
            {
                Console.WriteLine("Normal Gain");
            },
                //The tooltip of the button (the text on top when hovering over the button)
                "Volume to the MAXIMUM!",
                //First color is background color, second color is text color. If not filled in or set to null, default colors will stay
                Color.cyan, Color.white
                );
        }