由于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的话,会报错。可以把相关的接口自己移植过来。
来源:CSDN
作者:LazerYvTian
链接:https://blog.csdn.net/liulei199079/article/details/86552077