using System; using System.Linq; using UnityEditor; using UnityEngine; using VketCloudGUITools.Runtime; namespace VketCloudGUITools.Editor { [CanEditMultipleObjects] [CustomEditor(typeof(VCTransform))] public class VCTransformInspector : UnityEditor.Editor { private bool listeningForGuiChanges; private bool guiChanged; public override void OnInspectorGUI() { serializedObject.Update(); DrawProperties(); DrawWarnings(); } //各要素の描画 void DrawProperties() { EditorGUI.BeginChangeCheck(); //if (!CheckValues()) //{ // EditorGUILayout.HelpBox("RectTransformの値とVketCloudGUITransformの値が異なります。JSON出力時はVketCloudGUITransformの値が優先して使用されます。", MessageType.Warning); // if (GUILayout.Button("値のコピー : RectTransform -> VketCloudGUITransform")) // { // RectTransform2VketCloudGUITransform(); // } // if (GUILayout.Button("値のコピー : VketCloudGUITransform -> RectTransform")) // { // VketCloudGUITransform2RectTransform(); // } //} DrawDefaultInspector(); if (EditorGUI.EndChangeCheck()) { foreach (var v in targets) { Undo.RecordObject((v as VCTransform).GetComponent(), "Inspector"); var vketCloudGUITransform = v as VCTransform; vketCloudGUITransform.ApplyTransform(); } } } void DrawWarnings() { var allTransforms = targets.Cast().Select(vt => vt.transform).ToArray(); bool hasAnyNonScaleOne = allTransforms.Any(t => t.localScale != Vector3.one); if (hasAnyNonScaleOne) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.HelpBox("Scaleは(1,1,1)のみ対応しています。", MessageType.Warning, wide: true); if (GUILayout.Button("Fix", GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(true))) { Undo.RecordObjects(allTransforms.Cast().ToArray(), "Fix Transform Scale"); foreach (var target in targets.Cast().Select(vt => vt.transform)) { target.localScale = Vector3.one; } } EditorGUILayout.EndHorizontal(); } bool hasAnyRotate = allTransforms.Any(t => t.localRotation != Quaternion.identity); if (hasAnyRotate) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.HelpBox("Rotationは(0,0,0)のみ対応しています。", MessageType.Warning, wide: true); if (GUILayout.Button("Fix", GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(true))) { Undo.RecordObjects(allTransforms.Cast().ToArray(), "Fix Transform Rotation"); foreach (var target in targets.Cast().Select(vt => vt.transform)) { target.localRotation = Quaternion.identity; } } EditorGUILayout.EndHorizontal(); } } bool CheckValues() { foreach (var v in targets) { var vketCloudGUITransform = v as VCTransform; var rectTransform = vketCloudGUITransform.GetComponent(); var newPos = new Vector2Int((int)rectTransform.anchoredPosition.x, 0 - (int)rectTransform.anchoredPosition.y); if (vketCloudGUITransform.Pos != newPos) return false; var newSize = new Vector2Int((int)rectTransform.sizeDelta.x, (int)rectTransform.sizeDelta.y); if (vketCloudGUITransform.Size != newSize) return false; var newZ = (int)-rectTransform.localPosition.z; if (vketCloudGUITransform.Z != newZ) return false; var newPivot = new Vector2(rectTransform.pivot.x, 1f - rectTransform.pivot.y); if (vketCloudGUITransform.Pivot != newPivot) return false; AnchorType newAnchor = vketCloudGUITransform.Anchor; if (rectTransform.anchorMin != rectTransform.anchorMax) newAnchor = AnchorType.LT; else newAnchor = rectTransform.anchorMin.ToAnchorType(); if (vketCloudGUITransform.Anchor != newAnchor) return false; } return true; } void RectTransform2VketCloudGUITransform() { foreach (var v in targets) { var vketCloudGUITransform = v as VCTransform; vketCloudGUITransform.GatherTransform(); } } void VketCloudGUITransform2RectTransform() { foreach (var v in targets) { var vketCloudGUITransform = v as VCTransform; vketCloudGUITransform.ApplyTransform(); } } } }