AK056/Packages/com.kybernetik.animancer/Editor/AnimancerSettingsGroup.cs
2025-05-09 15:40:34 +08:00

86 lines
3.8 KiB
C#

// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEngine;
namespace Animancer.Editor
{
/// <summary>[Editor-Only] A static reference to a persistent setting stored in <see cref="AnimancerSettings"/>.</summary>
/// https://kybernetik.com.au/animancer/api/Animancer.Editor/AnimancerSettingsGroup_1
public static class AnimancerSettingsGroup<T>
where T : AnimancerSettingsGroup, new()
{
/************************************************************************************************************************/
/// <summary>Gets or creates a <typeparamref name="T"/> in the <see cref="AnimancerSettings"/> asset.</summary>
public static T Instance
=> AnimancerSettings.GetOrCreateData<T>();
/************************************************************************************************************************/
}
/// <summary>Base class for groups of fields that can be serialized inside <see cref="AnimancerSettings"/>.</summary>
/// https://kybernetik.com.au/animancer/api/Animancer.Editor/AnimancerSettingsGroup
[Serializable, InternalSerializableType]
public abstract class AnimancerSettingsGroup : IComparable<AnimancerSettingsGroup>
{
/************************************************************************************************************************/
private int _DataIndex = -1;
private string _BasePropertyPath;
/************************************************************************************************************************/
/// <summary>The user-firendly name to display in the Inspector.</summary>
public abstract string DisplayName { get; }
/// <summary>The index to display this data at in the Inspector.</summary>
public abstract int Index { get; }
/************************************************************************************************************************/
/// <summary>Sets the index used to find <see cref="SerializedProperty"/> instances for this group.</summary>
internal void SetDataIndex(int index)
{
if (_DataIndex == index)
return;
_DataIndex = index;
_BasePropertyPath = null;
}
/************************************************************************************************************************/
/// <summary>Returns a <see cref="SerializedProperty"/> relative to the base of this group.</summary>
protected SerializedProperty GetSerializedProperty(string propertyPath)
=> AnimancerSettings.GetSerializedProperty(_DataIndex, ref _BasePropertyPath, propertyPath);
/************************************************************************************************************************/
/// <summary>
/// Draws a <see cref="EditorGUILayout.PropertyField(SerializedProperty, GUILayoutOption[])"/> for a
/// property in this group.
/// </summary>
protected SerializedProperty DoPropertyField(string propertyPath)
{
var property = GetSerializedProperty(propertyPath);
EditorGUILayout.PropertyField(property, true);
return property;
}
/************************************************************************************************************************/
/// <summary>Compares the <see cref="Index"/>.</summary>
public int CompareTo(AnimancerSettingsGroup other)
=> Index.CompareTo(other.Index);
/************************************************************************************************************************/
}
}
#endif