Unity3d开发(十六) 重写UGUI组件

width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=2080045857&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Fandroid-game%2F1521.html&dpc=1" style="font-size: 14px; font-weight: bold; border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; line-height: 16px;">


文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。  

原文链接:http://blog.csdn.net/fansongy/article/details/52683181







作为Unity3d新版本的UI系统,UGUI以其易用性,逐渐被多数团队所接纳。但随着应用的深入,团队中总有需要自定义一套UI系统的需求。所幸UGUI是一个开源项目,可以在Unity3d的官方的Bitbucket代码库中找到源码。有了源码当然我们可以采用一劳永逸的办法,重编DLL库,并替换掉Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll,实现重写。但我还是不太推荐这样,因为一旦如此做,就无法跟随Unity3d版本升级了。因此本文主要介绍如何通过子类实现重写.

整体思路

首先推荐去官网下载一份代码。总体上看来大概分为以下几个部分:

  • UnityEngine.UI/UI/Core/DefaultControls是创建具体控件的层级与属性设置。
  • UnityEditor.UI/UI/MenuOptions是具体创建控件的包装方法。
  • UnityEditor.UI/UIUnityEngine.UI/UI/Core这两部分是对应的控件实现。

因此整体上重写的思路为:

  1. 为每个控件包装一个子类
  2. 创建时更改创建的脚本设置
  3. 重定向点击菜单按钮的生成

更改文字组件

下面以Text为例,重写一个组件。首先要创建一个子类:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class MyText :  Text
{

}

弄个空的就好了。

然后更改MenuOption类,由于这个类是Inner的,没有办法重写。所以我就将源码复制了一份。由于Unity会优先编译DLL后编译代码,所以复写public static 的菜单注册函数也不会有问题。

最后创建一个DefaultControls的复写类,将源码中创建Text的逻辑复制出来。

public class MenuOptionOverwrite
{
    //...
    [MenuItem("GameObject/UI/Text", false, 2000)]
    static public void AddText(MenuCommand menuCommand)
    {
        GameObject go = DefaultControlsOverwrite.CreateText(GetStandardResources());
        PlaceUIElementRoot(go, menuCommand);
    }
    //...
}

public static class DefaultControlsOverwrite 
{
    //...
    public static GameObject CreateText(DefaultControls.Resources resources)
    {
        GameObject obj2 = CreateUIElementRoot("Text", s_ThickElementSize);
        Text lbl = obj2.AddComponent();
        lbl.text = "New Text";
        SetDefaultTextValues(lbl);

        lbl.raycastTarget = false;
        return obj2;
    }
    //...
}

经过这样更改在Hierarchy中创建UI组件时,就会直接创建名为MyText的组件。至于直接把DefaultControls里面的代码复制出来,有利有弊,直接复制出来改起来比较方便,但如果Unity3d升级之后,代码更改可能会遗漏。反过来,先调用DefaultControls的接口,回头再将脚本换掉也可以,但这样就涉及到组件的赋值,写起来可能会特别傻 其中利弊大家自己衡量吧

创建效果

Unity3d开发(十六) 重写UGUI组件_第1张图片

右键创建Text就直接是这个效果,而且可以自定义属性,比如这里我们就默认将Raycast勾掉啦

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它... 

你可能感兴趣的:(Unity3d,Unity3d,开发杂谈,Unity3d)