Untiy插件组件编写【2】 – 组建界面绘制,NGUI按钮扩展

在Unity我们常常要写自己的组建。或者对某些已有的组建进行扩展或修改。这时我们就需要知道Unity绘制界面的相关知识。


在之前。我发过一个crv本地化Unity的多语言控件。里面有用到这些绘制界面的相关内容。感兴趣或者需要的朋友可以去看一下。本文最后有传送门。

好了。废话不多讲。我们开始正题。

初到新公司。按项目的要求。对NGUI的UIButton扩展了一下。效果如下

Unity插件编写,组件扩展

 

这里我们就可以选择图集。然后选择图片名字。而不用自己输入了。

那EButton脚本里的我就不多讲了。都是直接把NGUI的 UIButton脚本复制了一份。然后添加修改了些自己需要的功能。我们主要讲的是这个脚本的界面绘制的内容。

先上代码EButtonEditor.cs。如下:

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

[CustomEditor(typeof(EButton))]
public class EButtonEditor : Editor
{
    EButton mButton;
    UISprite mSprite;
    UILabel mLabel;
    Collider mCollider;
    public enum EButtonClickFunc
    {
        None,//点击无效
        Select,//点击选中
        Toggle//点击切换选中状态
    }

    /// <summary>
    /// Atlas selection callback.
    /// </summary>

    void OnSelectAtlas(Object obj)
    {
        if (mButton.uiSprite != null)
        {
            NGUIEditorTools.RegisterUndo("Atlas Selection", mButton.uiSprite);
            mButton.uiSprite.atlas = obj as UIAtlas;
        }
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        NGUIEditorTools.SetLabelWidth(80f);
        mButton = target as EButton;

        mSprite = EditorGUILayout.ObjectField("Sprite", mButton.uiSprite, typeof(UISprite), true) as UISprite;
        if (mButton.uiSprite != mSprite)
        {
            NGUIEditorTools.RegisterUndo("Image Button Change", mButton);
            mButton.uiSprite = mSprite;
            if (mSprite != null) mSprite.spriteName = mButton.normalSN;
        }
        if (mSprite != null)
        {
            ComponentSelector.Draw<UIAtlas>(mSprite.atlas, OnSelectAtlas, true);
            if (mSprite.atlas != null)
            {
                if (NGUIEditorTools.DrawHeader("SpritesAttribute", "SpritesAttribute", false, true))//绘制可收缩面板
                {
                    SerializedObject obj = new SerializedObject(mSprite);
                    obj.Update();
                    SerializedProperty atlas = obj.FindProperty("mAtlas");
                    NGUIEditorTools.DrawSpriteField("Normal", serializedObject, atlas, serializedObject.FindProperty("normalSN"), true);
                    NGUIEditorTools.DrawSpriteField("Pressed", serializedObject, atlas, serializedObject.FindProperty("pressedSN"), true);
                    NGUIEditorTools.DrawSpriteField("Disabled", serializedObject, atlas, serializedObject.FindProperty("disabledSN"), true);

                    //代理回调 NGUIEditorTools.DrawSpriteField("Pressed", mSprite.atlas, mButton.pressedSN, OnNormal);

                    NGUIEditorTools.DrawSpriteField("SelNormal", serializedObject, atlas, serializedObject.FindProperty("selNormllSN"), true);
                    NGUIEditorTools.DrawSpriteField("SelPressed", serializedObject, atlas, serializedObject.FindProperty("selPressedSN"), true);
                    NGUIEditorTools.DrawSpriteField("SelDisabled", serializedObject, atlas, serializedObject.FindProperty("selDisabledSN"), true);

                    //绘制输入框  NGUIEditorTools.DrawProperty("PressedSN", serializedObject, "pressedSN");


                    NGUIEditorTools.DrawProperty("Pixel Snap", serializedObject, "pixelSnap");
                    NGUIEditorTools.DrawProperty("EnableOnDisabledState", serializedObject, "enableOnDisabledState");
                    NGUIEditorTools.DrawProperty("Selectable", serializedObject, "selectable");
                }
            }
        }

        mLabel = EditorGUILayout.ObjectField("Label", mButton.uiLabel, typeof(UILabel), true) as UILabel;
        if (mButton.uiLabel != mLabel)
        {
            NGUIEditorTools.RegisterUndo("Image Button Change", mButton);
            mButton.uiLabel = mLabel;
            if (mLabel != null) mLabel.color = mButton.normalColor;
        }
        if (mLabel != null)
        {
            if (NGUIEditorTools.DrawHeader("LabelsAttribute", "LabelsAttribute", false, true))//绘制可收缩面板
            {
                NGUIEditorTools.DrawProperty("Normal", serializedObject, "normalColor", GUILayout.MinWidth(20f));//取色
                NGUIEditorTools.DrawProperty("Pressed", serializedObject, "pressedColor", GUILayout.MinWidth(20f));
                NGUIEditorTools.DrawProperty("Disabled", serializedObject, "disabledColor", GUILayout.MinWidth(20f));

                NGUIEditorTools.DrawProperty("SelNormal", serializedObject, "selNormalColor", GUILayout.MinWidth(20f));
                NGUIEditorTools.DrawProperty("SelPressed", serializedObject, "selPressedColor", GUILayout.MinWidth(20f));
                NGUIEditorTools.DrawProperty("SelDisabled", serializedObject, "selDisabledColor", GUILayout.MinWidth(20f));
            }

        }

        if (NGUIEditorTools.DrawHeader("MoreAttribute", "MoreAttribute", false, true))
        {
            mCollider = EditorGUILayout.ObjectField("Collider", mButton.uiCollider, typeof(Collider), true) as Collider;


            SerializedProperty sp = serializedObject.FindProperty("clickFunc");
            EButtonClickFunc ht = sp.boolValue ? EButtonClickFunc.Select : EButtonClickFunc.Toggle;
  
            EditorGUILayout.EnumPopup("ClickFunc", ht);
        }

        NGUIEditorTools.DrawProperty("GroupName", serializedObject, "groupName", GUILayout.MinWidth(20f));

        serializedObject.ApplyModifiedProperties();
    }
    /// <summary>
    /// 如果回调,则这里修改属性。回调参数为图片name
    /// </summary>
    /// <param name="spriteName"></param>
    void OnNormal(string spriteName)
    {
        mButton.normalSN = spriteName;
    }
}

如上。脚本里关键的地方我也写好了注释。相信大家一看就懂了。挺简单的。

 

非NGUI的用法:

笨方法。先下载个NGUI。然后把NGUIEditorTools里的相关接口拷贝出来。放到自己的脚本里就可以了。NGUI也是调用的Unity的api。

 

 

Unity插件制作【1】: http://www.bobsong.net/121.html

多语言组件:http://www.bobsong.net/132.html

本文链接:

https://www.bobsong.net/272.html
1 + 7 =
4 评论
    2014年12月03日 回复

    […] [CustomEditor(typeof(EButton))]:绑定使用该类。必须依赖EButton类。参考:bobsong.net/272.html […]

    2014年12月03日 回复

    […] [CustomEditor(typeof(EButton))]:绑定使用该类。必须依赖EButton类。参考:bobsong.net/272.html […]

    2015年10月09日 回复

    求EButton写法!

      2015年10月10日 回复

      @wbl喜多 加群吧。我发你