using UnityEngine; using System; using System.Collections; using System.Globalization; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine.EventSystems; namespace UI.Dates { public static class DatePicker_Instantiation { private static Dictionary m_CachedResources = new Dictionary(StringComparer.OrdinalIgnoreCase); public static void FixInstanceTransform(RectTransform baseTransform, RectTransform instanceTransform) { //instanceTransform.localScale = baseTransform.localScale; instanceTransform.localScale = Vector3.one; instanceTransform.anchoredPosition = baseTransform.anchoredPosition; instanceTransform.sizeDelta = baseTransform.sizeDelta; instanceTransform.anchoredPosition3D = new Vector3(baseTransform.anchoredPosition3D.x, baseTransform.anchoredPosition3D.y, 0); instanceTransform.localPosition = Vector3.zero; instanceTransform.localRotation = new Quaternion(); } public static GameObject InstantiatePrefab(string name, bool playMode = false, bool generateUndo = true, Transform parent = null) { var prefab = DatePicker_Instantiation.LoadResource("Prefabs/" + name); if (prefab == null) { throw new UnityException(String.Format("Could not find prefab '{0}'!", name)); } #if UNITY_EDITOR if(!playMode) parent = UnityEditor.Selection.activeTransform; #endif var gameObject = GameObject.Instantiate(prefab) as GameObject; gameObject.name = name; if (parent == null || !(parent is RectTransform)) { parent = GetCanvasTransform(); } gameObject.transform.SetParent(parent); var transform = (RectTransform)gameObject.transform; var prefabTransform = (RectTransform)prefab.transform; FixInstanceTransform(prefabTransform, transform); // Override the prefab's visible date with today's date var datePicker = gameObject.GetComponent(); if(datePicker != null) datePicker.VisibleDate = DateTime.Today; #if UNITY_EDITOR if (generateUndo) { UnityEditor.Undo.RegisterCreatedObjectUndo(gameObject, "Created " + name); } #endif return gameObject; } public static Transform GetCanvasTransform() { Canvas canvas = null; #if UNITY_EDITOR // Attempt to locate a canvas object parented to the currently selected object if (!Application.isPlaying && UnityEditor.Selection.activeGameObject != null) { canvas = FindParentOfType(UnityEditor.Selection.activeGameObject); //canvas = UnityEditor.Selection.activeTransform.GetComponentInParent(); } #endif if (canvas == null) { // Attempt to find a canvas anywhere canvas = UnityEngine.Object.FindObjectOfType(); if (canvas != null) return canvas.transform; } // if we reach this point, we haven't been able to locate a canvas // ...So I guess we'd better create one GameObject canvasGameObject = new GameObject("Canvas"); canvasGameObject.layer = LayerMask.NameToLayer("UI"); canvas = canvasGameObject.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvasGameObject.AddComponent(); canvasGameObject.AddComponent(); #if UNITY_EDITOR UnityEditor.Undo.RegisterCreatedObjectUndo(canvasGameObject, "Create Canvas"); #endif var eventSystem = UnityEngine.Object.FindObjectOfType(); if (eventSystem == null) { GameObject eventSystemGameObject = new GameObject("EventSystem"); eventSystem = eventSystemGameObject.AddComponent(); eventSystemGameObject.AddComponent(); #if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 eventSystemGameObject.AddComponent(); #endif #if UNITY_EDITOR UnityEditor.Undo.RegisterCreatedObjectUndo(eventSystemGameObject, "Create EventSystem"); #endif } return canvas.transform; } public static T FindParentOfType(GameObject childObject) where T : UnityEngine.Object { Transform t = childObject.transform; while (t.parent != null) { var component = t.parent.GetComponent(); if (component != null) return component; t = t.parent.transform; } // We didn't find anything return null; } public static T LoadResource(string path, bool ignoreCache = false) where T : UnityEngine.Object { UnityEngine.Object resource = null; if (!ignoreCache) { // include the type name in the cache path, so that if we try to cache two different objects that share the same path, we can still access them both var cachePath = String.Format("{0}|{1}", typeof(T).Name, path); if (!m_CachedResources.TryGetValue(cachePath, out resource)) { resource = Resources.Load(path); if (resource != null) { m_CachedResources.Add(cachePath, resource); } } } else { resource = Resources.Load(path); } return resource as T; } } }