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;
}
