using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using System.IO; using UnityEditorInternal; using System.Linq; using UnityEditor.AnimatedValues; namespace UnityEngine.UI { [CustomEditor(typeof(UXImage), true)] [CanEditMultipleObjects] public class UXImageEditor : Editor { private GameObject go; private SerializedProperty m_Color; private SerializedProperty m_RaycastTarget; protected SerializedProperty m_RaycastPadding; private SerializedProperty m_MaskAble; private SerializedProperty m_Sprite; private SerializedProperty m_Type; private SerializedProperty m_Material; private SerializedProperty m_sourceImage; private SerializedProperty m_ColorType; private SerializedProperty m_Direction; SerializedProperty m_UseSpriteMesh; SerializedProperty m_PreserveAspect; SerializedProperty m_FillCenter; SerializedProperty m_PixelsPerUnitMultiplier; SerializedProperty m_FillMethod; SerializedProperty m_FillOrigin; SerializedProperty m_FillAmount; SerializedProperty m_FillClockwise; SerializedProperty m_FlipMode; SerializedProperty m_FlipWithCopy; SerializedProperty m_FlipEdgeHorizontal; SerializedProperty m_FlipEdgeVertical; SerializedProperty m_FlipFillCenter; SerializedProperty m_GradientColor; GUIContent m_ClockwiseContent; GUIContent m_SpriteFlipContent; GUIContent m_FlipModeContent; GUIContent m_FlipEdgeContent; GUIContent m_FlipFillContent; private UXImage m_targetObject; private GameObject m_CloneObj; private string m_Origin_name; private Sprite m_Need_replace; private bool m_InitialHide; #if UNITY_2021_1_OR_NEWER private bool m_bIsDriven; #endif GUIContent m_SpriteContent; GUIContent m_PaddingContent; GUIContent m_LeftContent; GUIContent m_RightContent; GUIContent m_TopContent; GUIContent m_BottomContent; private GUIContent m_CorrectButtonContent; GUIContent m_SpriteTypeContent; AnimBool m_ShowType; protected AnimBool m_ShowNativeSize; AnimBool m_ShowSlicedOrTiled; AnimBool m_ShowSliced; AnimBool m_ShowTiled; AnimBool m_ShowFilled; static private bool m_ShowPadding = false; private class Styles { public static GUIContent text = EditorGUIUtility.TrTextContent("Fill Origin"); public static GUIContent[] OriginHorizontalStyle = { EditorGUIUtility.TrTextContent("Left"), EditorGUIUtility.TrTextContent("Right") }; public static GUIContent[] OriginVerticalStyle = { EditorGUIUtility.TrTextContent("Bottom"), EditorGUIUtility.TrTextContent("Top") }; public static GUIContent[] Origin90Style = { EditorGUIUtility.TrTextContent("BottomLeft"), EditorGUIUtility.TrTextContent("TopLeft"), EditorGUIUtility.TrTextContent("TopRight"), EditorGUIUtility.TrTextContent("BottomRight") }; public static GUIContent[] Origin180Style = { EditorGUIUtility.TrTextContent("Bottom"), EditorGUIUtility.TrTextContent("Left"), EditorGUIUtility.TrTextContent("Top"), EditorGUIUtility.TrTextContent("Right") }; public static GUIContent[] Origin360Style = { EditorGUIUtility.TrTextContent("Bottom"), EditorGUIUtility.TrTextContent("Right"), EditorGUIUtility.TrTextContent("Top"), EditorGUIUtility.TrTextContent("Left") }; } private void OnEnable() { Image image = target as Image; go = image.gameObject; UIEffectWrapDrawer.InitInspectorString(); m_Color = serializedObject.FindProperty("m_Color"); m_Sprite = serializedObject.FindProperty("m_Sprite"); m_Type = serializedObject.FindProperty("m_Type"); m_Material = serializedObject.FindProperty("m_Material"); m_RaycastTarget = serializedObject.FindProperty("m_RaycastTarget"); m_RaycastPadding = serializedObject.FindProperty("m_RaycastPadding"); m_sourceImage = serializedObject.FindProperty("m_Sprite"); m_MaskAble = serializedObject.FindProperty("m_Maskable"); //spriteContent = new GUIContent("Source Image"); m_targetObject = serializedObject.targetObject as UXImage; m_Origin_name = m_Sprite.objectReferenceValue?.name; m_Need_replace = Resources.Load("need_replace"); m_ColorType = serializedObject.FindProperty("m_ColorType"); m_GradientColor = serializedObject.FindProperty("m_GradientColor"); m_Direction = serializedObject.FindProperty("m_Direction"); m_UseSpriteMesh = serializedObject.FindProperty("m_UseSpriteMesh"); m_PreserveAspect = serializedObject.FindProperty("m_PreserveAspect"); m_FillCenter = serializedObject.FindProperty("m_FillCenter"); m_PixelsPerUnitMultiplier = serializedObject.FindProperty("m_PixelsPerUnitMultiplier"); m_FillMethod = serializedObject.FindProperty("m_FillMethod"); m_FillOrigin = serializedObject.FindProperty("m_FillOrigin"); m_FillClockwise = serializedObject.FindProperty("m_FillClockwise"); m_FillAmount = serializedObject.FindProperty("m_FillAmount"); m_FlipModeContent = new GUIContent("FlipMode"); m_FlipEdgeContent = new GUIContent("FlipEdge"); m_FlipFillContent = new GUIContent("FlipFill"); m_FlipMode = serializedObject.FindProperty("m_FlipMode"); m_FlipWithCopy = serializedObject.FindProperty("m_FlipWithCopy"); m_FlipEdgeHorizontal = serializedObject.FindProperty("m_FlipEdgeHorizontal"); m_FlipEdgeVertical = serializedObject.FindProperty("m_FlipEdgeVertical"); m_FlipFillCenter = serializedObject.FindProperty("m_FlipFillCenter"); #if UNITY_2021_1_OR_NEWER m_bIsDriven = false; #endif m_PaddingContent = EditorGUIUtility.TrTextContent("Raycast Padding"); m_LeftContent = EditorGUIUtility.TrTextContent("Left"); m_RightContent = EditorGUIUtility.TrTextContent("Right"); m_TopContent = EditorGUIUtility.TrTextContent("Top"); m_BottomContent = EditorGUIUtility.TrTextContent("Bottom"); m_CorrectButtonContent = EditorGUIUtility.TrTextContent("Set Native Size", "Sets the size to match the content."); m_SpriteTypeContent = EditorGUIUtility.TrTextContent("Image Type"); m_ClockwiseContent = EditorGUIUtility.TrTextContent("Clockwise"); m_SpriteContent = EditorGUIUtility.TrTextContent("Source Image"); m_ShowType = new AnimBool(m_Sprite.objectReferenceValue != null); m_ShowType.valueChanged.AddListener(Repaint); m_ShowNativeSize = new AnimBool(false); m_ShowNativeSize.valueChanged.AddListener(Repaint); var typeEnum = (Image.Type)m_Type.enumValueIndex; m_ShowSlicedOrTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); m_ShowSliced = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); m_ShowTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); m_ShowFilled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); m_ShowSlicedOrTiled.valueChanged.AddListener(Repaint); m_ShowSliced.valueChanged.AddListener(Repaint); m_ShowTiled.valueChanged.AddListener(Repaint); m_ShowFilled.valueChanged.AddListener(Repaint); } private void OnDisable() { if (m_CloneObj != null) { DestroyImmediate(m_CloneObj); } m_ShowType.valueChanged.RemoveListener(Repaint); m_ShowNativeSize.valueChanged.RemoveListener(Repaint); m_ShowSlicedOrTiled.valueChanged.RemoveListener(Repaint); m_ShowSliced.valueChanged.RemoveListener(Repaint); m_ShowTiled.valueChanged.RemoveListener(Repaint); m_ShowFilled.valueChanged.RemoveListener(Repaint); } public override void OnInspectorGUI() { EditorGUI.BeginChangeCheck(); serializedObject.Update(); serializedObject.ApplyModifiedProperties(); //base.OnInspectorGUI(); //CustomEditorGUILayout.PropertyField(sourceImage); //CustomEditorGUILayout.PropertyField(color); //CustomEditorGUILayout.PropertyField(material); //CustomEditorGUILayout.PropertyField(raycastTarget); //CustomEditorGUILayout.PropertyField(maskAble); serializedObject.Update(); Image image = target as Image; RectTransform rect = image.GetComponent(); #if UNITY_2021_1_OR_NEWER m_bIsDriven = (rect.drivenByObject as Slider)?.fillRect == rect; #endif SpriteGUI(); AppearanceControlsGUI(); RaycastControlsGUI(); MaskableControlsGUI(); //m_ShowType.target = m_Sprite.objectReferenceValue != null; //if (EditorGUILayout.BeginFadeGroup(m_ShowType.faded)) TypeGUI(); //EditorGUILayout.EndFadeGroup(); SetShowNativeSize(false); if (EditorGUILayout.BeginFadeGroup(m_ShowNativeSize.faded)) { EditorGUI.indentLevel++; if ((Image.Type)m_Type.enumValueIndex == Image.Type.Simple) EditorGUILayout.PropertyField(m_UseSpriteMesh); EditorGUILayout.PropertyField(m_PreserveAspect); EditorGUI.indentLevel--; } EditorGUILayout.EndFadeGroup(); NativeSizeButtonGUI(); FlipGUI(); serializedObject.ApplyModifiedProperties(); Rect effectWarpRect = EditorGUILayout.GetControlRect(); UIEffectWrapDrawer.Draw(effectWarpRect, go); } protected void SpriteGUI() { EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(m_Sprite, m_SpriteContent); if (EditorGUI.EndChangeCheck()) { var newSprite = m_Sprite.objectReferenceValue as Sprite; if (newSprite) { UXImage.Type oldType = (UXImage.Type)m_Type.enumValueIndex; if (newSprite.border.SqrMagnitude() > 0) { m_Type.enumValueIndex = (int)UXImage.Type.Sliced; } else if (oldType == UXImage.Type.Sliced) { m_Type.enumValueIndex = (int)UXImage.Type.Simple; } } } } protected void MaskableControlsGUI() { EditorGUILayout.PropertyField(m_MaskAble); } protected void AppearanceControlsGUI() { EditorGUI.BeginChangeCheck(); string[] labels = {"Solid_Color", "Gradient_Color" }; var type = (UXImage.ColorType)EnumPopupLayoutEx("ColorType", typeof(UXImage.ColorType), m_ColorType.intValue, labels); // EditorGUILayout.EnumPopup(EditorLocalization.GetLocalization("UXImage", "m_ColorType"), (UXImage.ColorType)m_ColorType.intValue); if (EditorGUI.EndChangeCheck()) { m_ColorType.intValue = (int)type; if ((int)type == 1 && m_Type.intValue != 0) { m_Type.intValue = 0; } if ((int)type == 1 && m_FlipMode.intValue != 0) { m_FlipMode.intValue = 0; } } GUILayout.BeginHorizontal(); GUILayout.Space(EditorGUIUtility.labelWidth); if (GUILayout.Button("UseUIColorConfig", EditorStyles.miniButton)) { //弹窗 if (type == UXImage.ColorType.Solid_Color) { // ColorChooseWindow.OpenWindow(); // ColorChooseWindow.r_window.target = (UXImage)target; } if (type == UXImage.ColorType.Gradient_Color) { // GradientChooseWindow.OpenWindow(); // GradientChooseWindow.r_window.target = (UXImage)target; } //m_Color.colorValue = UIColorChooseWindow.r_window.usecolor; //m_GradientColor. } GUILayout.EndHorizontal(); if (type == UXImage.ColorType.Solid_Color) { EditorGUILayout.PropertyField(m_Color); } else if (type == UXImage.ColorType.Gradient_Color) { EditorGUI.BeginChangeCheck(); string[] labels2 = {"Vertical", "Horizontal"}; var direction = (UXImage.GradientDirection)EnumPopupLayoutEx("m_Direction", typeof(UXImage.GradientDirection), m_Direction.intValue, labels2); if (EditorGUI.EndChangeCheck()) { m_Direction.intValue = (int)direction; } //EditorGUILayout.ColorField(m_Color); EditorGUILayout.PropertyField(m_GradientColor, new GUIContent("Gradient_Color")); } EditorGUILayout.PropertyField(m_Material); } protected void RaycastControlsGUI() { EditorGUILayout.PropertyField(m_RaycastTarget); float height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; if (m_ShowPadding) height += (EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing) * 4; var rect = EditorGUILayout.GetControlRect(true, height); if (m_RaycastPadding != null) { EditorGUI.BeginProperty(rect, m_PaddingContent, m_RaycastPadding); rect.height = EditorGUIUtility.singleLineHeight; using (var check = new EditorGUI.ChangeCheckScope()) { m_ShowPadding = EditorGUI.Foldout(rect, m_ShowPadding, m_PaddingContent, true); if (check.changed) { SceneView.RepaintAll(); } } if (m_ShowPadding) { using (var check = new EditorGUI.ChangeCheckScope()) { EditorGUI.indentLevel++; Vector4 newPadding = m_RaycastPadding.vector4Value; rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; newPadding.x = EditorGUI.FloatField(rect, m_LeftContent, newPadding.x); rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; newPadding.y = EditorGUI.FloatField(rect, m_BottomContent, newPadding.y); rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; newPadding.z = EditorGUI.FloatField(rect, m_RightContent, newPadding.z); rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; newPadding.w = EditorGUI.FloatField(rect, m_TopContent, newPadding.w); if (check.changed) { m_RaycastPadding.vector4Value = newPadding; } EditorGUI.indentLevel--; } } EditorGUI.EndProperty(); } } protected void TypeGUI() { EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(m_Type, m_SpriteTypeContent); if (EditorGUI.EndChangeCheck()) { if (m_Type.intValue != 0 && m_ColorType.intValue == 1) { m_ColorType.intValue = 0; } } ++EditorGUI.indentLevel; { Image.Type typeEnum = (Image.Type)m_Type.enumValueIndex; bool showSlicedOrTiled = (!m_Type.hasMultipleDifferentValues && (typeEnum == Image.Type.Sliced || typeEnum == Image.Type.Tiled)); if (showSlicedOrTiled && targets.Length > 1) showSlicedOrTiled = targets.Select(obj => obj as Image).All(img => img.hasBorder); m_ShowSlicedOrTiled.target = showSlicedOrTiled; m_ShowSliced.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); m_ShowTiled.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); m_ShowFilled.target = (!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); Image image = target as Image; if (EditorGUILayout.BeginFadeGroup(m_ShowSlicedOrTiled.faded)) { if (image.hasBorder) EditorGUILayout.PropertyField(m_FillCenter); EditorGUILayout.PropertyField(m_PixelsPerUnitMultiplier); } EditorGUILayout.EndFadeGroup(); if (EditorGUILayout.BeginFadeGroup(m_ShowSliced.faded)) { if (image.sprite != null && !image.hasBorder) EditorGUILayout.HelpBox("This Image doesn't have a border.", MessageType.Warning); } EditorGUILayout.EndFadeGroup(); if (EditorGUILayout.BeginFadeGroup(m_ShowTiled.faded)) { if (image.sprite != null && !image.hasBorder && (image.sprite.texture.wrapMode != TextureWrapMode.Repeat || image.sprite.packed)) EditorGUILayout.HelpBox("It looks like you want to tile a sprite with no border. It would be more efficient to modify the Sprite properties, clear the Packing tag and set the Wrap mode to Repeat.", MessageType.Warning); } EditorGUILayout.EndFadeGroup(); if (EditorGUILayout.BeginFadeGroup(m_ShowFilled.faded)) { EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(m_FillMethod); if (EditorGUI.EndChangeCheck()) { m_FillOrigin.intValue = 0; } var shapeRect = EditorGUILayout.GetControlRect(true); switch ((Image.FillMethod)m_FillMethod.enumValueIndex) { case Image.FillMethod.Horizontal: m_FillOrigin.intValue = EditorGUI.Popup(shapeRect, Styles.text, m_FillOrigin.intValue, Styles.OriginHorizontalStyle); break; case Image.FillMethod.Vertical: m_FillOrigin.intValue = EditorGUI.Popup(shapeRect, Styles.text, m_FillOrigin.intValue, Styles.OriginVerticalStyle); break; case Image.FillMethod.Radial90: m_FillOrigin.intValue = EditorGUI.Popup(shapeRect, Styles.text, m_FillOrigin.intValue, Styles.Origin90Style); break; case Image.FillMethod.Radial180: m_FillOrigin.intValue = EditorGUI.Popup(shapeRect, Styles.text, m_FillOrigin.intValue, Styles.Origin180Style); break; case Image.FillMethod.Radial360: m_FillOrigin.intValue = EditorGUI.Popup(shapeRect, Styles.text, m_FillOrigin.intValue, Styles.Origin360Style); break; } #if UNITY_2021_1_OR_NEWER if (m_bIsDriven) EditorGUILayout.HelpBox("The Fill amount property is driven by Slider.", MessageType.None); using (new EditorGUI.DisabledScope(m_bIsDriven)) { EditorGUILayout.PropertyField(m_FillAmount); } #else EditorGUILayout.PropertyField(m_FillAmount); #endif if ((Image.FillMethod)m_FillMethod.enumValueIndex > Image.FillMethod.Vertical) { EditorGUILayout.PropertyField(m_FillClockwise, m_ClockwiseContent); } } EditorGUILayout.EndFadeGroup(); } --EditorGUI.indentLevel; } private void FlipGUI() { EditorGUI.BeginChangeCheck(); //EditorGUILayout.PropertyField(m_gradientMode, m_SpriteGradientContent); UXImage.FlipMode flipmodeEnumOld = (UXImage.FlipMode)m_FlipMode.enumValueIndex; bool flipWithCopyOld = m_FlipWithCopy.boolValue; #if UNITY_2021_2_OR_NEWER UXImage.FlipEdgeVertical edgeVerticalOld = (UXImage.FlipEdgeVertical)(m_FlipEdgeVertical.enumValueFlag); #else UXImage.FlipEdgeVertical edgeVerticalOld = (UXImage.FlipEdgeVertical)(m_FlipEdgeVertical.enumValueIndex + 3); #endif UXImage.FlipEdgeHorizontal edgeHorizontalOld = (UXImage.FlipEdgeHorizontal)m_FlipEdgeHorizontal.enumValueIndex; string[] labels = { "None", "Horizontal", "Vertical", "FourCorner" }; EditorGUI.BeginChangeCheck(); m_FlipMode.intValue = EnumPopupLayoutEx(m_FlipModeContent.text, typeof(UXImage.FlipMode), m_FlipMode.intValue, labels); if (EditorGUI.EndChangeCheck()) { if (m_FlipMode.intValue != 0 && m_ColorType.intValue == 1) { m_ColorType.intValue = 0; } } //EditorGUILayout.PropertyField(m_FlipMode, m_FlipModeContent); UXImage.FlipMode flipmodeEnum = (UXImage.FlipMode)m_FlipMode.enumValueIndex; switch (flipmodeEnum) { case UXImage.FlipMode.Horziontal: ++EditorGUI.indentLevel; bool iscopy1 = m_FlipWithCopy.boolValue; m_FlipWithCopy.boolValue = EditorGUILayout.Toggle("Copy", m_FlipWithCopy.boolValue); if (iscopy1 == true && m_FlipWithCopy.boolValue == false) { if (m_FlipEdgeHorizontal.intValue == 0) { go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 4); } else if (m_FlipEdgeHorizontal.intValue == 2) { go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 4); } } if (m_FlipWithCopy.boolValue) { int last = m_FlipEdgeHorizontal.intValue; if (iscopy1 == false) { if (last == 0) { go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 2); } else if (last == 2) { go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 2); } } string[] labels2 = { "Left", "Middle", "Right" }; m_FlipEdgeHorizontal.intValue = EnumPopupLayoutEx(m_FlipEdgeContent.text, typeof(UXImage.FlipEdgeHorizontal), m_FlipEdgeHorizontal.intValue, labels2); //EditorGUILayout.PropertyField(m_FlipEdgeHorizontal, m_FlipEdgeContent); int now = m_FlipEdgeHorizontal.intValue; if (last != now) { if ((last == 0 && now == 1)) { go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 4); } else if ((last == 2 && now == 1)) { go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 4); } else if (last == 0 && now == 2 || (last == 1 && now == 2)) { go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 2); } else if ((last == 1 && now == 0) || (last == 2 && now == 0)) { go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 2); } } } --EditorGUI.indentLevel; break; case UXImage.FlipMode.Vertical: ++EditorGUI.indentLevel; bool iscopy = m_FlipWithCopy.boolValue; m_FlipWithCopy.boolValue = EditorGUILayout.Toggle("Copy", m_FlipWithCopy.boolValue); if (iscopy == true && m_FlipWithCopy.boolValue == false) { if (m_FlipEdgeVertical.intValue == 3) { go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 4); } else if (m_FlipEdgeVertical.intValue == 5) { go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 4); } } if (m_FlipWithCopy.boolValue) { int last = m_FlipEdgeVertical.intValue; if (iscopy == false) { if (last == 3) { go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 2); } else if (last == 5) { go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 2); } } string[] labels2 = { "Up", "Middle", "Down" }; m_FlipEdgeVertical.intValue = EnumPopupLayoutEx(m_FlipEdgeContent.text, typeof(UXImage.FlipEdgeVertical), m_FlipEdgeVertical.intValue, labels2); //EditorGUILayout.PropertyField(m_FlipEdgeVertical, m_FlipEdgeContent); int now = m_FlipEdgeVertical.intValue; if (last != now) { if ((last == 3 && now == 4)) { go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 4); } else if ((last == 5 && now == 4)) { go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 4); } else if (last == 3 && now == 5 || (last == 4 && now == 5)) { go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 2); } else if ((last == 4 && now == 3) || last == 5 && now == 3) { go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 2); } } } --EditorGUI.indentLevel; break; case UXImage.FlipMode.FourCorner: ++EditorGUI.indentLevel; int lastC = m_FlipFillCenter.intValue; string[] labels3 = { "LeftTop", "RightTop", "RightBottom", "LeftBottom" }; m_FlipFillCenter.intValue = EnumPopupLayoutEx(m_FlipFillContent.text, typeof(UXImage.FlipFillCenter), m_FlipFillCenter.intValue, labels3); //EditorGUILayout.PropertyField(m_FlipFillCenter, m_FlipFillContent); int nowC = m_FlipFillCenter.intValue; // if (lastC != nowC) // { // if(lastC==0&&nowC==1||(lastC==3&&nowC==2)){ // go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 2); // } // else if(lastC==0&& nowC==2){ // go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 2); // go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 2); // } // else if(lastC==0&& nowC==3 || (lastC==1&&nowC==2)){ // go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 2); // } // else if(lastC==1&&nowC==0||(lastC==2&&nowC==3)){ // go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 2); // } // else if(lastC==1&&nowC==3){ // go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 2); // go.transform.Translate(Vector3.down * go.GetComponent().rect.height / 2); // } // else if(lastC==2&&nowC==1||(lastC==3&&nowC==0)){ // go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 2); // } // else if(lastC==2&&nowC==0){ // go.transform.Translate(Vector3.left * go.GetComponent().rect.width / 2); // go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 2); // } // else if(lastC==3&&nowC==1){ // go.transform.Translate(Vector3.right * go.GetComponent().rect.width / 2); // go.transform.Translate(Vector3.up * go.GetComponent().rect.height / 2); // } // } --EditorGUI.indentLevel; break; default: break; } if (EditorGUI.EndChangeCheck()) { int OldWidthScaler = 1; int OldHeightScaler = 1; int NewWidthScaler = 1; int NewHeightScaler = 1; if (flipmodeEnumOld != flipmodeEnum) { m_FlipWithCopy.boolValue = false; } if (flipmodeEnumOld == UXImage.FlipMode.Horziontal) { GetSizeScaler(flipmodeEnumOld, flipWithCopyOld, (UXImage.FlipEdge)(int)edgeHorizontalOld, ref OldWidthScaler, ref OldHeightScaler); } if (flipmodeEnumOld == UXImage.FlipMode.Vertical) { GetSizeScaler(flipmodeEnumOld, flipWithCopyOld, (UXImage.FlipEdge)(int)edgeVerticalOld, ref OldWidthScaler, ref OldHeightScaler); } if (flipmodeEnumOld == UXImage.FlipMode.FourCorner) { GetSizeScaler(flipmodeEnumOld, flipWithCopyOld, UXImage.FlipEdge.None, ref OldWidthScaler, ref OldHeightScaler); } if (flipmodeEnum == UXImage.FlipMode.Horziontal) { #if UNITY_2021_2_OR_NEWER GetSizeScaler(flipmodeEnum, m_FlipWithCopy.boolValue, (UXImage.FlipEdge)(int)m_FlipEdgeHorizontal.enumValueFlag, ref NewWidthScaler, ref NewHeightScaler); #else GetSizeScaler(flipmodeEnum, m_FlipWithCopy.boolValue, (UXImage.FlipEdge)(int)m_FlipEdgeHorizontal.enumValueIndex, ref NewWidthScaler, ref NewHeightScaler); #endif } if (flipmodeEnum == UXImage.FlipMode.Vertical) { #if UNITY_2021_2_OR_NEWER GetSizeScaler(flipmodeEnum, m_FlipWithCopy.boolValue, (UXImage.FlipEdge)(int)m_FlipEdgeVertical.enumValueFlag, ref NewWidthScaler, ref NewHeightScaler); #else GetSizeScaler(flipmodeEnum, m_FlipWithCopy.boolValue, (UXImage.FlipEdge)(int)(m_FlipEdgeVertical.enumValueIndex + 3), ref NewWidthScaler, ref NewHeightScaler); #endif } if (flipmodeEnum == UXImage.FlipMode.FourCorner) { GetSizeScaler(flipmodeEnum, m_FlipWithCopy.boolValue, UXImage.FlipEdge.None, ref NewWidthScaler, ref NewHeightScaler); } UXImage image = target as UXImage; float width = image.rectTransform.rect.width * ((float)NewWidthScaler / OldWidthScaler); float height = image.rectTransform.rect.height * ((float)NewHeightScaler / OldHeightScaler); image.rectTransform.sizeDelta = new Vector2(width, height); serializedObject.ApplyModifiedProperties(); } } void GetSizeScaler(UXImage.FlipMode flipMode, bool flipWithCopy, UXImage.FlipEdge flipEdge, ref int widthScaler, ref int heightScaler) { if (flipMode == UXImage.FlipMode.FourCorner) { widthScaler = 2; heightScaler = 2; } if (flipMode == UXImage.FlipMode.Vertical) { if (flipWithCopy && flipEdge != UXImage.FlipEdge.VertMiddle) { widthScaler = 1; heightScaler = 2; } } if (flipMode == UXImage.FlipMode.Horziontal) { if (flipWithCopy && flipEdge != UXImage.FlipEdge.HorzMiddle) { widthScaler = 2; heightScaler = 1; } } } void SetShowNativeSize(bool instant) { Image.Type type = (Image.Type)m_Type.enumValueIndex; bool showNativeSize = (type == Image.Type.Simple || type == Image.Type.Filled) && m_Sprite.objectReferenceValue != null; if (instant) m_ShowNativeSize.value = showNativeSize; else m_ShowNativeSize.target = showNativeSize; } protected void NativeSizeButtonGUI() { if (EditorGUILayout.BeginFadeGroup(m_ShowNativeSize.faded)) { EditorGUILayout.BeginHorizontal(); { GUILayout.Space(EditorGUIUtility.labelWidth); if (GUILayout.Button(m_CorrectButtonContent, EditorStyles.miniButton)) { foreach (Graphic graphic in targets.Select(obj => obj as Graphic)) { Undo.RecordObject(graphic.rectTransform, "Set Native Size"); graphic.SetNativeSize(); EditorUtility.SetDirty(graphic); } } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndFadeGroup(); } public int EnumPopupLayoutEx(string label, Type type, int enumValueIndex, string[] labels) { int[] ints = (int[])Enum.GetValues(type); string[] strings = Enum.GetNames(type); if (labels.Length != ints.Length) { return EditorGUILayout.IntPopup(label, enumValueIndex, strings, ints); } else { return EditorGUILayout.IntPopup(label, enumValueIndex, labels, ints); } } } }