SerializedProperty Extensions
Запись свойств в редакторе одной строкой — и доступ к настоящему полю C#, которое свойство показывает в инспекторе.
Быстрый старт
| До — Unity API | После — FastTools |
|---|---|
| |
Запись значений
| До — Unity API | После — FastTools |
|---|---|
| |
| |
| |
Поддерживаемые типы
| Значения | Сеттеры |
|---|---|
| Числа | SetInt, SetUint, SetLong, SetUlong, SetFloat, SetDouble |
| Текст, bool и хэш | SetString, SetBool, SetHash128 |
| Векторы | SetVector2, SetVector2Int, SetVector3, SetVector3Int, SetVector4, SetQuaternion |
| Области | SetRect, SetRectInt, SetBounds, SetBoundsInt |
| Типы Unity | SetColor, SetGradient, SetAnimationCurve |
| Идентификаторы объектов | SetEntityId |
У каждого есть перегрузка SetValue: SetValue(42) вызывает SetInt, поэтому тип аргумента должен совпадать с типом поля.
Перечисления, массивы и ссылки
| Unity | FastTools |
|---|---|
enumValueIndex = 1 | SetEnumIndex(1) |
enumValueFlag = flags | SetEnumFlag(flags) |
arraySize = 5 | SetArraySize(5) |
arraySize += n | AddArraySize(n = 1) |
arraySize -= n | RemoveArraySize(n = 1) |
managedReferenceValue = value | SetManagedReference(value) |
objectReferenceValue = value | SetObjectReference(value) |
boxedValue = value | SetBoxed(value) |
exposedReferenceValue = value | SetExposedReference(value) |
Update() и Apply…()
| Unity | FastTools |
|---|---|
serializedObject.Update() | Update() |
serializedObject.UpdateIfRequiredOrScript() | UpdateIfRequiredOrScript() |
serializedObject.ApplyModifiedProperties() | ApplyModifiedProperties() |
serializedObject.ApplyModifiedPropertiesWithoutUndo() | ApplyModifiedPropertiesWithoutUndo() |
Методы вызываются прямо на свойстве и, как все сеттеры, возвращают его.
Поле C# из инспектора
Три метода находят поле C#, которое свойство показывает в инспекторе: его тип, само поле и объект, в котором оно лежит.
public class AbilityBook : MonoBehaviour
{
[SerializeField]
private List<Ability> _abilities = new() { new Ability() };
[SerializeReference]
private IAbilityEffect _effect = new BurnEffect();
}
[Serializable]
public class Ability { public string Name = "Fireball"; }
[Serializable]
public class BurnEffect : IAbilityEffect { public float Damage = 5f; }
| Путь свойства | GetPropertyType() | GetFieldInfo() | GetDeclaringInstance() |
|---|---|---|---|
_abilities | List<Ability> | AbilityBook._abilities | экземпляр AbilityBook |
_abilities[0] | Ability | AbilityBook._abilities | экземпляр AbilityBook |
_abilities[0].Name | string | Ability.Name | Ability с индексом 0 |
_effect | IAbilityEffect | AbilityBook._effect | экземпляр AbilityBook |
_effect.Damage | float | BurnEffect.Damage | экземпляр BurnEffect |
- если поле не найдено,
GetPropertyType()иGetFieldInfo()возвращаютnull, аGetDeclaringInstance()— только когда не найден объект-владелец; - методы читают только первый целевой объект и только применённые значения.
Если владелец поля — структура, GetDeclaringInstance() возвращает её boxed-копию. Изменения такой копии не попадают в оригинал; записывайте значения через SerializedProperty.
Имя поля и проверки для отрисовки
| Путь свойства | GetMemberName() | IsArrayElement() | HasFoldout() |
|---|---|---|---|
_abilities[0] | "_abilities" | true | true |
_abilities[0].Name | "Name" | false | false |
_effect | "_effect" | false | false |
HasFoldout() возвращает true для обычного составного поля с видимыми вложенными полями, поэтому может не совпадать с инспектором: у поля [SerializeReference] инспектор рисует foldout, а метод возвращает false; свои PropertyDrawer метод не учитывает.
Persistent()
Persistent() возвращает копию свойства на собственном SerializedObject: её можно использовать позже, например в EditorApplication.delayCall.
| До — Unity API | После — FastTools |
|---|---|
| |
- копия принадлежит вызывающему коду: освободите её вместе с её
serializedObject; - неприменённые записи исходного свойства в копию не попадают;
- если свойства на объектах нет, метод возвращает
null.
var independent = manaCost.Persistent();
if (independent == null) return;
EditorApplication.delayCall += () =>
{
using (independent.serializedObject)
using (independent)
independent.Update().SetIntAndApply(42);
};
Пример в пакете
В EditorTools кнопка Halve cooldown, +5 MP записывает два свойства через SetFloat и SetIntAndApply.