unity UGUI Image之扩展

      由于ngui对新版的unity的兼容性越来越不好了,现在逐步转向unity的亲儿子---ugui。尝试着搭了几个ui之后,发现image的图片操作不是太方便(例如 我想在slice模式下,按照比例去放大图片),我每次都算一边。

       用了ngui的我联想到能不能模仿者ngui UISprite的方式去扩展呢。哈哈,最终被我搞成了。先看效果

    

   用过ngui的朋友们是不是对这个界面很熟悉。

下面介绍扩展方式:

1:扩展Image

public class ExtImage : Image
{
}

2:构建width height,宽高比,缩放样式

    public UIWidget.AspectRatioSource keepAspectRatio = UIWidget.AspectRatioSource.Free;
    public float aspectRatio = 1f;
    private int mWidth;
    private int mHeight;

3:提供操作的方法

protected override void Awake()
    {
        base.Awake();
        UpdateSize();
    }
    public int Height
    {
        get
        {
            return mHeight;
        }
        set
        {
            value = Mathf.Max(2, value);
            if (mHeight != value && keepAspectRatio != UIWidget.AspectRatioSource.BasedOnWidth && rectTransform.IsCenterAnchor())
            {
                SetDimensions(mWidth, value);
            }
        }
    }
    public int Width
    {
        get
        {
            return mWidth;
        }
        set
        {
            value = Mathf.Max(2, value);
            if (mWidth != value && keepAspectRatio != UIWidget.AspectRatioSource.BasedOnHeight && rectTransform.IsCenterAnchor())
            {
                SetDimensions(value, mHeight);
            }
        }
    }
    public void SetDimensions(int w,int h)
    {
        if (mWidth != w || mHeight != h)
        {
            mWidth = w;
            mHeight = h;
            if (keepAspectRatio == UIWidget.AspectRatioSource.BasedOnHeight)
            {
                mWidth = Mathf.RoundToInt(mHeight * aspectRatio);
            }
            else if(keepAspectRatio == UIWidget.AspectRatioSource.BasedOnWidth)
            {
                mHeight = Mathf.RoundToInt(mWidth/aspectRatio);
            }
            else if(keepAspectRatio == UIWidget.AspectRatioSource.Free)
            {
                aspectRatio = mWidth / (float)mHeight;
            }
            rectTransform.sizeDelta = new Vector2(mWidth,mHeight);
            SetAllDirty();
        }

    }
    public override void SetNativeSize()
    {
        base.SetNativeSize();
        UpdateSize();
    }
    public void UpdateSize()
    {
        mWidth = (int)rectTransform.sizeDelta.x;
        mHeight = (int)rectTransform.sizeDelta.y;
        aspectRatio = mWidth * 1.0f / mHeight;
    }

4:模仿NGUI编写对ExtImage的编辑

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.UI;
using UnityEngine;
[CanEditMultipleObjects]
[CustomEditor(typeof(ExtImage), true)]
public class ExtImageInspector : ImageEditor
{
    protected override void OnEnable()
    {
        base.OnEnable();
    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        NGUIEditorTools.BeginContents();

        PrefabType prefabType = PrefabUtility.GetPrefabType(target);

        SerializedObject so = serializedObject;

        DrawDimensions(so, target as ExtImage, prefabType == PrefabType.Prefab);

        SerializedProperty ratio = so.FindProperty("aspectRatio");
        SerializedProperty aspect = so.FindProperty("keepAspectRatio");

        GUILayout.BeginHorizontal();
        {
            if (!aspect.hasMultipleDifferentValues && aspect.intValue == 0)
            {
                EditorGUI.BeginDisabledGroup(true);
                NGUIEditorTools.DrawProperty("Aspect", ratio, false, GUILayout.Width(130f));
                EditorGUI.EndDisabledGroup();
            }
            else
            {
                NGUIEditorTools.DrawProperty("Aspect", ratio, false, GUILayout.Width(130f));
            }
            NGUIEditorTools.DrawProperty("", aspect, false, GUILayout.MinWidth(20f));
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        {
            if(GUILayout.Button("UpdateSize"))
            {
                (target as ExtImage).UpdateSize();
            }
        }
        GUILayout.EndHorizontal();
        NGUIEditorTools.EndContents();
        serializedObject.ApplyModifiedProperties();
    }
    private void DrawDimensions(SerializedObject so,ExtImage extImage,bool isPrefab)
    {
        GUILayout.BeginHorizontal();
        {
            bool freezeSize = so.isEditingMultipleObjects;
            if(freezeSize)
            {
                EditorGUI.BeginDisabledGroup(true);
                NGUIEditorTools.DrawProperty("Size", so, "mWidth", GUILayout.MinWidth(100f));
                EditorGUI.EndDisabledGroup();
            }
            else
            {
                GUI.changed = false;
                int val = EditorGUILayout.IntField("Size", extImage.Width, GUILayout.MinWidth(100f));

                if(GUI.changed)
                {
                    NGUIEditorTools.RegisterUndo("Dimensions Change",extImage);
                    extImage.Width = val;
                }
            }

            NGUIEditorTools.SetLabelWidth(12f);

            if (freezeSize)
            {
                EditorGUI.BeginDisabledGroup(true);
                NGUIEditorTools.DrawProperty("x", so, "mHeight", GUILayout.MinWidth(100f));
                EditorGUI.EndDisabledGroup();
            }
            else
            {
                GUI.changed = false;
                int val = EditorGUILayout.IntField("x", extImage.Height, GUILayout.MinWidth(100f));

                if (GUI.changed)
                {
                    NGUIEditorTools.RegisterUndo("Dimensions Change", extImage);
                    extImage.Height = val;
                }
            }

            NGUIEditorTools.SetLabelWidth(80f);

            if(isPrefab)
            {
                GUILayout.Space(70f);
            }
            else
            {
                EditorGUI.BeginDisabledGroup(so.isEditingMultipleObjects);

                if (GUILayout.Button("Snap", GUILayout.Width(60f)))
                {
                    foreach (GameObject go in Selection.gameObjects)
                    {
                        extImage = go.GetComponent<ExtImage>();

                        if (extImage)
                        {
                            NGUIEditorTools.RegisterUndo("Snap Dimensions", extImage);
                            NGUIEditorTools.RegisterUndo("Snap Dimensions", extImage.transform);
                            extImage.SetNativeSize();
                        }
                    }
                }
                EditorGUI.EndDisabledGroup();
            }
        }
        GUILayout.EndHorizontal();
    }
}

以上有些使用的是ngui的接口,如果没导入ngui的话,会报错。可以把相关的接口自己移植过来。

猜你喜欢

转载自blog.csdn.net/liulei199079/article/details/86552077