2016.4.14
昨天看到 雨凇的 Unity3D研究院之UGUI一个优化效率小技巧: http://www.xuanyusong.com/archives/4006
完好了他所说的代码:
using UnityEngine; using UnityEngine.UI; using System.Collections; using UnityEditor; using UnityEngine.EventSystems; /// <summary> /// 创建 Text、Image 的时候默认不选中 raycastTarget 等 /// </summary> public class OverrideCreateUIMenu { /// <summary> /// 第一次创建UI元素时。没有canvas、EventSystem全部要生成,Canvas作为父节点 /// 之后再空的位置上建UI元素会自己主动加入到Canvas下 /// 在非UI树下的GameObject上新建UI元素也会 自己主动加入到Canvas下(默认在UI树下) /// 加入到指定的UI元素下 /// </summary> [MenuItem("GameObject/UI/Image")] static void CreatImages() { var canvasObj = SecurityCheck(); if (!Selection.activeTransform) // 在根文件夹创建的, 自己主动移动到 Canvas下 { // Debug.Log("没有选择对象"); Image().transform.SetParent(canvasObj.transform); } else // (Selection.activeTransform) { if (!Selection.activeTransform.GetComponentInParent<Canvas>()) // 没有在UI树下 { Image().transform.SetParent(canvasObj.transform); } else { Image(); } } } private static GameObject Image() { GameObject go = new GameObject("x_Image", typeof(Image)); go.GetComponent<Image>().raycastTarget = false; go.transform.SetParent(Selection.activeTransform); Selection.activeGameObject = go; return go; } // 我们要设置默认字体 [MenuItem("GameObject/UI/Text")] static void CreatTexts() { var canvasObj = SecurityCheck(); if (!Selection.activeTransform) // 在根文件夹创建的。 自己主动移动到 Canvas下 { // Debug.Log("没有选择对象"); Text().transform.SetParent(canvasObj.transform); } else // (Selection.activeTransform) { if (!Selection.activeTransform.GetComponentInParent<Canvas>()) // 没有在UI树下 { Text().transform.SetParent(canvasObj.transform); } else { Text(); } } } private static GameObject Text() { GameObject go = new GameObject("x_Text", typeof(Text)); var text = go.GetComponent<Text>(); text.raycastTarget = false; text.font = AssetDatabase.LoadAssetAtPath<Font>("Assets/Arts/Fonts/zh_cn.TTF"); // 默认字体 go.transform.SetParent(Selection.activeTransform); Selection.activeGameObject = go; //go.AddComponent<Outline>(); // 默认加入 附加组件 return go; } // 假设第一次创建UI元素 可能没有 Canvas、EventSystem对象! private static GameObject SecurityCheck() { GameObject canvas; var cc = Object.FindObjectOfType<Canvas>(); if (!cc) { canvas = new GameObject("_Canvas", typeof(Canvas)); } else { canvas = cc.gameObject; } if (!Object.FindObjectOfType<EventSystem>()) { GameObject eventSystem = new GameObject("_EventSystem", typeof(EventSystem)); } return canvas; } }