Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

【Unity】uGUIのドロップダウンメニューをスクリプトから作る

$
0
0

myGIf.gif

Main.cs
static Dropdown GenDropdown(RectTransform parent)
    {
        Dropdown dropdown = new GameObject("dropdown").AddComponent<Dropdown>();
        RectTransform dropdownRC = dropdown.GetComponent<RectTransform>();
        dropdownRC.SetParent(parent);
        Util.SetAnchorPointZero(dropdownRC);

        dropdown.captionText = Util.AddTextRight(dropdownRC); // 選択中のテキストが選択される     
        {
            // dropdown.targetGraphicを設定してない場合、dropdown.captionTextの領域を開けばドロップダウンメニューが開く
            dropdown.targetGraphic = dropdown.gameObject.AddComponent<Image>(); // ドロップダウンメニューを開くための画像領域
            dropdown.targetGraphic.color = Color.green;
        }        

        RectTransform template = new GameObject("template").AddComponent<RectTransform>(); // 一覧表示される際のひな型(テンプレート)
        template.gameObject.SetActive(false);
        template.SetParent(dropdownRC);
        Util.SetAnchorPointZero(template);
        Toggle tog = Util.GenToggle(template, dropdownRC.sizeDelta.x);
        RectTransform togRC = tog.GetComponent<RectTransform>();
        togRC.localPosition = new Vector2(0, -dropdownRC.sizeDelta.y);
        Text text = Util.AddTextRight(togRC); // 一覧の表示されるテキスト

        dropdown.template = template;
        dropdown.itemText = text;

        return dropdown;
    }

    void Test()
    {
        Dropdown dropdown = GenDropdown(GameObject.Find("Canvas").GetComponent<RectTransform>());
        dropdown.options.Add(new Dropdown.OptionData { text = "AAA" });
        dropdown.options.Add(new Dropdown.OptionData { text = "BBB" });
        dropdown.options.Add(new Dropdown.OptionData { text = "CCC" });
        dropdown.onValueChanged.AddListener((data) => MyOnValueChanged(data));
    }

    static public void MyOnValueChanged(int listNum)
    {
        Debug.Log(listNum); // BBBを選択した場合、1が返される。dropdown.optionsのリストのインデックスが返される。
    }

    void Start()
    {
        Test();
    }
Util.cs
static public RectTransform SetAnchorPointZero(RectTransform rect)
    {
        // アンカーポイントを左上に合わせ、ローカル座標をリセットする。
        rect.anchorMin = Vector2.up;
        rect.anchorMax = Vector2.up;
        rect.pivot = Vector2.up;
        rect.localPosition = Vector3.zero;
        rect.rotation = Quaternion.identity;
        rect.localScale = Vector3.one;
        return rect;
    }

    static public Toggle GenToggle(RectTransform parent, float checkBoxSize = 50)
    {
        Toggle tog = new GameObject("togle").AddComponent<Toggle>();
        tog.isOn = true;
        Image background = new GameObject("background").AddComponent<Image>();
        Image checkmark = new GameObject("checkmark").AddComponent<Image>();

        RectTransform togRC = tog.GetComponent<RectTransform>();
        checkmark.rectTransform.SetParent(background.rectTransform);
        background.rectTransform.SetParent(togRC);

        togRC.sizeDelta = Vector2.one * checkBoxSize;
        background.rectTransform.sizeDelta = Vector2.one * checkBoxSize;
        checkmark.rectTransform.sizeDelta = Vector2.one * checkBoxSize * 0.8f;
        checkmark.color = Color.red;

        tog.graphic = checkmark;
        tog.targetGraphic = background;

        togRC.SetParent(parent);
        SetAnchorPointZero(togRC);

        return tog;
    }

    // あるRectTransformの右側に文字を付け加える
    static public Text AddTextRight(RectTransform rc, float offsetX_scale = 1.2f)
    {        
        Text text = new GameObject("text").AddComponent<Text>();
        text.font = Resources.Load<Font>("Font/mplus-1c-black");
        if (text.font == null)
            throw new Exception("フォントが見つかりません!");        
        text.fontSize = (int)(rc.sizeDelta.y * 0.7f); // 0.7倍までなら文字が描画される。
        text.horizontalOverflow = HorizontalWrapMode.Overflow;
        text.rectTransform.sizeDelta = new Vector2(100, rc.sizeDelta.y);
        text.rectTransform.SetParent(rc);
        SetAnchorPointZero(text.rectTransform).localPosition = new Vector2(rc.sizeDelta.x * offsetX_scale, 0);
        return text;
    }

Viewing all articles
Browse latest Browse all 9707

Trending Articles