An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
3.1 KiB

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEditor;
using System.Collections;
[CustomEditor(typeof(ComboBox))]
public class ComboBoxEditor : Editor
{
public override void OnInspectorGUI()
{
var comboBoxGO = target as ComboBox;
var allowUpdate = comboBoxGO.transform.Find("Button") != null;
if (allowUpdate)
comboBoxGO.UpdateGraphics();
EditorGUI.BeginChangeCheck();
DrawDefaultInspector();
if (EditorGUI.EndChangeCheck())
{
if (Application.isPlaying)
{
comboBoxGO.HideFirstItem = comboBoxGO.HideFirstItem;
comboBoxGO.Interactable = comboBoxGO.Interactable;
}
else
if (allowUpdate)
comboBoxGO.RefreshSelected();
}
}
}
public class ComboBoxMenuItem
{
[MenuItem("GameObject/UI/ComboBox")]
public static void CreateComboBox()
{
var canvas = Object.FindObjectOfType<Canvas>();
var canvasGO = canvas == null ? null : canvas.gameObject;
if (canvasGO == null)
{
canvasGO = new GameObject("Canvas");
canvas = canvasGO.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvasGO.AddComponent<CanvasScaler>();
canvasGO.AddComponent<GraphicRaycaster>();
}
var eventSystem = Object.FindObjectOfType<EventSystem>();
var eventSystemGO = eventSystem == null ? null : eventSystem.gameObject;
if (eventSystemGO == null)
{
eventSystemGO = new GameObject("EventSystem");
eventSystem = eventSystemGO.AddComponent<EventSystem>();
eventSystemGO.AddComponent<StandaloneInputModule>();
eventSystemGO.AddComponent<TouchInputModule>();
}
var comboBoxGO = new GameObject("ComboBox");
comboBoxGO.transform.SetParent(canvasGO.transform, false);
var rTransform = comboBoxGO.AddComponent<RectTransform>();
rTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 160);
rTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 30);
for (var i = 0; i < Selection.objects.Length; i++)
{
var selected = Selection.objects[i] as GameObject;
var hierarchyItem = selected.transform;
canvas = null;
while (hierarchyItem != null && (canvas = hierarchyItem.GetComponent<Canvas>()) == null)
hierarchyItem = hierarchyItem.parent;
if (canvas != null)
{
comboBoxGO.transform.SetParent(selected.transform, false);
break;
}
}
rTransform.anchoredPosition = Vector2.zero;
var comboBox = comboBoxGO.AddComponent<ComboBox>();
LoadAssets();
comboBox.Sprite_UISprite = Sprite_UISprite;
comboBox.Sprite_Background = Sprite_Background;
comboBox.CreateControl();
Selection.activeGameObject = comboBoxGO;
}
private static Sprite Sprite_UISprite;
private static Sprite Sprite_Background;
public static void LoadAssets()
{
while (Sprite_UISprite == null || Sprite_Background == null)
{
var sprites = Resources.FindObjectsOfTypeAll<Sprite>();
foreach (var sprite in sprites)
switch (sprite.name)
{
case "UISprite":
Sprite_UISprite = sprite;
break;
case "Background":
Sprite_Background = sprite;
break;
}
if (Sprite_UISprite == null || Sprite_Background == null)
AssetDatabase.LoadAllAssetsAtPath("Resources/unity_builtin_extra");
}
}
}