com.alicizax.kyrylokuzyk.pr.../Editor/TweenSettingsPropDrawer.cs
陈思海 de686b7cf8 init
2025-01-23 10:16:47 +08:00

142 lines
4.9 KiB
C#

using System;
using JetBrains.Annotations;
using PrimeTween;
using UnityEditor;
using UnityEngine;
using static UnityEditor.EditorGUI;
using static UnityEditor.EditorGUIUtility;
/// todo clear the custom ease curve when ease != Ease.Custom
[CustomPropertyDrawer(typeof(TweenSettings))]
internal class TweenSettingsPropDrawer : PropertyDrawer {
public override float GetPropertyHeight([NotNull] SerializedProperty property, GUIContent label) {
if (!property.isExpanded) {
return singleLineHeight;
}
return getPropHeight(property);
}
internal static float getPropHeight([NotNull] SerializedProperty property) {
var count = 1;
count++; // duration
count++; // ease
var easeIndex = property.FindPropertyRelative(nameof(TweenSettings.ease)).intValue;
if (easeIndex == (int)Ease.Custom) {
count++; // customEase
}
count++; // cycles
var cycles = property.FindPropertyRelative(nameof(TweenSettings.cycles)).intValue;
if (cycles != 0 && cycles != 1) {
count++; // cycleMode
}
count++; // startDelay
count++; // endDelay
count++; // useUnscaledTime
count++; // useFixedUpdate
var result = singleLineHeight * count + standardVerticalSpacing * (count - 1);
result += standardVerticalSpacing * 2; // extra spacing
return result;
}
public override void OnGUI(Rect position, [NotNull] SerializedProperty property, GUIContent label) {
var rect = new Rect(position) { height = singleLineHeight };
PropertyField(rect, property, label);
if (!property.isExpanded) {
return;
}
moveToNextLine(ref rect);
indentLevel++;
{ // duration
property.NextVisible(true);
DrawDuration(rect, property);
moveToNextLine(ref rect);
}
drawEaseTillEnd(property, ref rect);
indentLevel--;
}
internal static void DrawDuration(Rect rect, [NotNull] SerializedProperty property) {
if (GUI.enabled) {
ClampProperty(property, 1f);
}
PropertyField(rect, property);
}
internal static void ClampProperty(SerializedProperty prop, float defaultValue, float min = 0.01f, float max = float.MaxValue) {
prop.floatValue = prop.floatValue == 0f ? defaultValue : Mathf.Clamp(prop.floatValue, min, max);
}
internal static void drawEaseTillEnd([NotNull] SerializedProperty property, ref Rect rect) {
DrawEaseAndCycles(property, ref rect);
drawStartDelayTillEnd(ref rect, property);
}
internal static void DrawEaseAndCycles(SerializedProperty property, ref Rect rect, bool addSpace = true, bool draw = true) {
{ // ease
property.NextVisible(true);
if (draw) PropertyField(rect, property);
moveToNextLine(ref rect);
// customEase
bool isCustom = property.intValue == (int) Ease.Custom;
property.NextVisible(true);
if (isCustom) {
if (draw) PropertyField(rect, property);
moveToNextLine(ref rect);
}
}
if (addSpace) {
rect.y += standardVerticalSpacing * 2;
}
{ // cycles
var cycles = drawCycles(rect, property, draw);
moveToNextLine(ref rect);
{
// cycleMode
property.NextVisible(true);
if (cycles != 0 && cycles != 1) {
if (draw) PropertyField(rect, property);
moveToNextLine(ref rect);
}
}
}
}
internal static void drawStartDelayTillEnd(ref Rect rect, [NotNull] SerializedProperty property) {
{ // startDelay, endDelay
for (int _ = 0; _ < 2; _++) {
property.NextVisible(true);
if (property.floatValue < 0f) {
property.floatValue = 0f;
}
PropertyField(rect, property);
moveToNextLine(ref rect);
}
}
{ // useUnscaledTime
property.NextVisible(true);
PropertyField(rect, property);
moveToNextLine(ref rect);
}
{ // useFixedUpdate
property.NextVisible(true);
PropertyField(rect, property);
moveToNextLine(ref rect);
}
}
internal static int drawCycles(Rect rect, [NotNull] SerializedProperty property, bool draw = true) {
property.NextVisible(false);
if (property.intValue == 0) {
property.intValue = 1;
} else if (property.intValue < -1) {
property.intValue = -1;
}
if (draw) PropertyField(rect, property);
return property.intValue;
}
static void moveToNextLine(ref Rect rect) {
rect.y += singleLineHeight + standardVerticalSpacing;
}
}