Unity定制 Image、Text的对象生成

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

??

时间: 2024-08-05 08:44:14

Unity定制 Image、Text的对象生成的相关文章

Javascript 面向对象一:封装数据个方法,从原型对象生成实例

一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var Cat = { name : '', color : '' } 现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象. var cat1 = {}; // 创建一个空对象 cat1.name = "大毛"; // 按照原型对象的属性赋值 cat1.color = "黄色"; var cat2 = {}; cat2.n

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

咸蛋系列一●《模板模式构建随机对象生成》2 构思

随机对象生成可以说是随机数生成的一个延伸,在实际使用中,我们可能要生成的不是一个简简单单的数字,而是像数字.大小写字符.中文汉字.算数表达式等. 由于其实现相对简单,取各种随机对象的源码网上也比比皆是,因而貌似也没人做一个通用的.可扩展的随机对象生成. 博主要不是因为闲得蛋疼也是不会想到做这个东西的,好了,言归正传.分析随机对象生成,其要点无外乎三点: 1. 设置随机对象集: 2. 获取一个或多个随机对象: 3. 获取一个或多个不重复随机对象: 在这三点中,后两者算法皆固定,仅设置对象集不同,故

【Unity】使用RenderTexture为物体生成快照

版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:Jimm          邮箱:[email protected] RenderTexture的定义和作用 RenderTexture are textures that can be rendered to. RenderTexture(下文简称RTT)是可以被渲染的纹理,简称渲染纹理.一般来说,RTT可以应用在制作动态阴影,反射以及监视摄像机(车辆后视镜)等,另一方面可以应用到游戏截图,背景模糊等方面,用途十分广泛.以后这些技术都

PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as array 产生原因: +展开 -PHP $res = json_decode($res); $res['key']; //把 json_decode() 后的对象当作数组使用. 解决方法(2种):1.使用 json_decode($d, true).就是使json_decode 的第二个变量设置为 tru

C#开发Unity游戏教程之游戏对象的属性变量

C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性--变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象.上一章仅仅是简单的介绍了脚本中的变量,读者一定只是瘾,如今好了.作者将使用一整章的篇幅介绍变量与属性. Unity游戏对象的属性 在Unity中.游戏场景中游戏对象的属性,能够在Inspector视图里查看,想看哪个游戏对象的属性.就使用鼠标选中哪个游戏对象就可以. 比如,要查看游戏场景中Main Camer

只允许对象生成于堆内

只允许对象生成于堆内?怎么理解?肿么办? 假如,手头上有一个类Person,当你在程序中写下Person rn时, 编译器悄悄地做了两件事:调用constructor构造对象rn,而在弹栈时,调用destructor析构对象rn. 对象rn的构造和析构全部由编译器负责,这是栈的特性! 诸所周知,对象rn生成于栈内. 而我们现在的要求是什么?“只允许对象生成于堆内.”rn明显违背了我们的要求,也就意味着它应该被禁止. 那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构

C#开发Unity游戏教程之游戏对象的行为逻辑方法

C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑--方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要内容是变量,但是在章节的最后为了展示游戏效果,也用到了它.现在看来方法真的是无处不在,并且不可或缺.它甚至都可以影响游戏对象的行为逻辑!因此本章终于到了不得不介绍它的时候了. Unity游戏对象的行为逻辑 游戏场景中,有些游戏对象是静止的,例如,树木.山峰.石头等等.而另外一些游戏对象则是运动的,它

AOP代理对象生成

AOP(Aspect-OrientedProgramming,面向方面编程)是OOP(Object-Oriented Programing,面向对象编程)的良好补充与完善,后者侧重于解决 从上到下的存在明显层次逻辑关系的问题,而前者则侧重于由左至右的水平散布的无明显逻辑关系但具备相同行为的问题.AOP抽象的是相同的行为而非 关联的行为,用于提供通用服务支持,而非业务逻辑处理,其核心思想是"将应用程序中的商业逻辑同对其提供支持的通用服务进行分离. AOP植入有多种不同方式,主要分为以下三种方式: