187 lines
8.1 KiB
C#
187 lines
8.1 KiB
C#
|
/// Credit Titinious (https://github.com/Titinious)
|
|||
|
/// Sourced from - https://github.com/Titinious/CurlyUI
|
|||
|
|
|||
|
using UnityEditor;
|
|||
|
|
|||
|
namespace UnityEngine.UI.Extensions
|
|||
|
{
|
|||
|
[CustomEditor(typeof(CUIGraphic), true)]
|
|||
|
public class CUIGraphicEditor : Editor {
|
|||
|
|
|||
|
protected static bool isCurveGpFold = false;
|
|||
|
|
|||
|
protected Vector3[] reuse_Vector3s = new Vector3[4];
|
|||
|
|
|||
|
public override void OnInspectorGUI()
|
|||
|
{
|
|||
|
CUIGraphic script = (CUIGraphic)this.target;
|
|||
|
|
|||
|
EditorGUILayout.HelpBox("CurlyUI (CUI) should work with most of the Unity UI. For Image, use CUIImage; for Text, use CUIText; and for others (e.g. RawImage), use CUIGraphic", MessageType.Info);
|
|||
|
|
|||
|
if (script.UIGraphic == null)
|
|||
|
{
|
|||
|
EditorGUILayout.HelpBox("CUI is an extension to Unity's UI. You must set Ui Graphic with a Unity Graphic component (e.g. Image, Text, RawImage)", MessageType.Error);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (script.UIGraphic is Image && script.GetType() != typeof(CUIImage))
|
|||
|
{
|
|||
|
EditorGUILayout.HelpBox("Although CUI components are generalized. It is recommended that for Image, use CUIImage", MessageType.Warning);
|
|||
|
}
|
|||
|
else if (script.UIGraphic is Text && script.GetType() != typeof(CUIText))
|
|||
|
{
|
|||
|
EditorGUILayout.HelpBox("Although CUI components are generalized. It is recommended that for Text, use CUIText", MessageType.Warning);
|
|||
|
}
|
|||
|
|
|||
|
EditorGUILayout.HelpBox("Now that CUI is ready, change the control points of the top and bottom bezier curves to curve/morph the UI. Improve resolution when the UI seems to look poorly when curved/morphed should help.", MessageType.Info);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DrawDefaultInspector();
|
|||
|
|
|||
|
// draw the editor that shows the position ratio of all control points from the two bezier curves
|
|||
|
isCurveGpFold = EditorGUILayout.Foldout(isCurveGpFold, "Curves Position Ratios");
|
|||
|
if (isCurveGpFold)
|
|||
|
{
|
|||
|
EditorGUI.indentLevel++;
|
|||
|
EditorGUILayout.LabelField("Top Curve");
|
|||
|
EditorGUI.indentLevel++;
|
|||
|
Vector3[] controlPoints = script.RefCurvesControlRatioPoints[1].array;
|
|||
|
|
|||
|
EditorGUI.BeginChangeCheck();
|
|||
|
for (int p = 0; p < controlPoints.Length; p++)
|
|||
|
{
|
|||
|
reuse_Vector3s[p] = EditorGUILayout.Vector3Field(string.Format("Control Points {0}", p + 1), controlPoints[p]);
|
|||
|
}
|
|||
|
|
|||
|
if (EditorGUI.EndChangeCheck())
|
|||
|
{
|
|||
|
Undo.RecordObject(script, "Change Ratio Points");
|
|||
|
EditorUtility.SetDirty(script);
|
|||
|
|
|||
|
System.Array.Copy(reuse_Vector3s, script.RefCurvesControlRatioPoints[1].array, controlPoints.Length);
|
|||
|
script.UpdateCurveControlPointPositions();
|
|||
|
}
|
|||
|
EditorGUI.indentLevel--;
|
|||
|
EditorGUILayout.LabelField("Bottom Curve");
|
|||
|
EditorGUI.indentLevel++;
|
|||
|
controlPoints = script.RefCurvesControlRatioPoints[0].array;
|
|||
|
|
|||
|
EditorGUI.BeginChangeCheck();
|
|||
|
for (int p = 0; p < controlPoints.Length; p++)
|
|||
|
{
|
|||
|
reuse_Vector3s[p] = EditorGUILayout.Vector3Field(string.Format("Control Points {0}", p + 1), controlPoints[p]);
|
|||
|
}
|
|||
|
|
|||
|
if (EditorGUI.EndChangeCheck())
|
|||
|
{
|
|||
|
Undo.RecordObject(script, "Change Ratio Points");
|
|||
|
EditorUtility.SetDirty(script);
|
|||
|
|
|||
|
System.Array.Copy(reuse_Vector3s, controlPoints, controlPoints.Length);
|
|||
|
script.UpdateCurveControlPointPositions();
|
|||
|
}
|
|||
|
EditorGUI.indentLevel--;
|
|||
|
EditorGUI.indentLevel--;
|
|||
|
}
|
|||
|
|
|||
|
EditorGUILayout.Space();
|
|||
|
if (GUILayout.Button("Fit Bezier curves to rect transform"))
|
|||
|
{
|
|||
|
Undo.RecordObject(script, "Fit to Rect Transform");
|
|||
|
Undo.RecordObject(script.RefCurves[0], "Fit to Rect Transform");
|
|||
|
Undo.RecordObject(script.RefCurves[1], "Fit to Rect Transform");
|
|||
|
EditorUtility.SetDirty(script);
|
|||
|
|
|||
|
script.FixTextToRectTrans();
|
|||
|
|
|||
|
script.Refresh();
|
|||
|
}
|
|||
|
|
|||
|
EditorGUILayout.Space();
|
|||
|
|
|||
|
// disable group to prevent allowing the reference be used when there is no reference CUI
|
|||
|
EditorGUI.BeginDisabledGroup(script.RefCUIGraphic == null);
|
|||
|
|
|||
|
if (GUILayout.Button("Reference CUI component for curves"))
|
|||
|
{
|
|||
|
Undo.RecordObject(script, "Reference CUI");
|
|||
|
Undo.RecordObject(script.RefCurves[0], "Reference CUI");
|
|||
|
Undo.RecordObject(script.RefCurves[1], "Reference CUI");
|
|||
|
EditorUtility.SetDirty(script);
|
|||
|
|
|||
|
script.ReferenceCUIForBCurves();
|
|||
|
|
|||
|
script.Refresh();
|
|||
|
}
|
|||
|
|
|||
|
EditorGUILayout.HelpBox("Auto set the curves' control points by referencing another CUI. You need to set Ref CUI Graphic (e.g. CUIImage) first.", MessageType.Info);
|
|||
|
|
|||
|
EditorGUI.EndDisabledGroup();
|
|||
|
}
|
|||
|
|
|||
|
protected virtual void OnSceneGUI()
|
|||
|
{
|
|||
|
// for CUITextEditor, allow using scene UI to change the control points of the bezier curves
|
|||
|
|
|||
|
CUIGraphic script = (CUIGraphic)this.target;
|
|||
|
|
|||
|
script.ReportSet();
|
|||
|
|
|||
|
for (int c = 0; c < script.RefCurves.Length; c++)
|
|||
|
{
|
|||
|
|
|||
|
CUIBezierCurve curve = script.RefCurves[c];
|
|||
|
|
|||
|
if (curve.ControlPoints != null)
|
|||
|
{
|
|||
|
|
|||
|
Vector3[] controlPoints = curve.ControlPoints;
|
|||
|
|
|||
|
Transform handleTransform = curve.transform;
|
|||
|
Quaternion handleRotation = curve.transform.rotation;
|
|||
|
|
|||
|
for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
|
|||
|
{
|
|||
|
EditorGUI.BeginChangeCheck();
|
|||
|
Handles.Label(handleTransform.TransformPoint(controlPoints[p]), string.Format("Control Point {0}", p + 1));
|
|||
|
Vector3 newPt = Handles.DoPositionHandle(handleTransform.TransformPoint(controlPoints[p]), handleRotation);
|
|||
|
if (EditorGUI.EndChangeCheck())
|
|||
|
{
|
|||
|
|
|||
|
Undo.RecordObject(curve, "Move Point");
|
|||
|
Undo.RecordObject(script, "Move Point");
|
|||
|
EditorUtility.SetDirty(curve);
|
|||
|
controlPoints[p] = handleTransform.InverseTransformPoint(newPt);
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Handles.color = Color.gray;
|
|||
|
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[0]), handleTransform.TransformPoint(controlPoints[1]));
|
|||
|
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[1]), handleTransform.TransformPoint(controlPoints[2]));
|
|||
|
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[2]), handleTransform.TransformPoint(controlPoints[3]));
|
|||
|
|
|||
|
int sampleSize = 10;
|
|||
|
|
|||
|
Handles.color = Color.white;
|
|||
|
for (int s = 0; s < sampleSize; s++)
|
|||
|
{
|
|||
|
Handles.DrawLine(handleTransform.TransformPoint(curve.GetPoint((float)s / sampleSize)), handleTransform.TransformPoint(curve.GetPoint((float)(s + 1) / sampleSize)));
|
|||
|
}
|
|||
|
|
|||
|
curve.EDITOR_ControlPoints = controlPoints;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (script.RefCurves != null)
|
|||
|
{
|
|||
|
Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[0]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[0]));
|
|||
|
Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[3]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[3]));
|
|||
|
}
|
|||
|
|
|||
|
script.Refresh();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|