| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- using System;
- using System.Linq.Expressions;
- using UnityEngine.Rendering.PostProcessing;
- namespace UnityEditor.Rendering.PostProcessing
- {
- /// <summary>
- /// The class to inherit from when designing custom effect editors.
- /// </summary>
- /// <typeparam name="T">The effect type to create an editor for</typeparam>
- public class PostProcessEffectEditor<T> : PostProcessEffectBaseEditor
- where T : PostProcessEffectSettings
- {
- /// <summary>
- /// Find a serialized property using an expression instead of a string. This is safer as it
- /// helps avoiding typos and make code refactoring easier.
- /// </summary>
- /// <typeparam name="TValue">The serialized value type</typeparam>
- /// <param name="expr">The expression to parse to reach the property</param>
- /// <returns>A <see cref="SerializedProperty"/> or <c>null</c> if none was found</returns>
- /// <example>
- /// <code>
- /// [Serializable]
- /// public class MyEffect : PostProcessEffectSettings
- /// {
- /// public float myParameter = 1f;
- /// }
- ///
- /// [PostProcessEditor(typeof(MyEffect))]
- /// public class MyEffectEditor : PostProcessEffectEditor<MyEffect>
- /// {
- /// SerializedProperty m_MyParameter;
- ///
- /// public override void OnEnable()
- /// {
- /// m_MyParameter = FindProperty(x => x.myParameter);
- /// }
- /// }
- /// </code>
- /// </example>
- /// <remarks>
- /// If you're trying to retrieve a <see cref="SerializedParameterOverride"/>, you should
- /// use <seealso cref="FindParameterOverride{TValue}"/> instead.
- /// </remarks>
- /// <seealso cref="SerializedProperty"/>
- /// <seealso cref="FindParameterOverride{TValue}"/>
- protected SerializedProperty FindProperty<TValue>(Expression<Func<T, TValue>> expr)
- {
- return serializedObject.FindProperty(RuntimeUtilities.GetFieldPath(expr));
- }
- /// <summary>
- /// Find a serialized parameter override using an expression instead of a string. This is
- /// safer as it helps avoiding typos and make code refactoring easier.
- /// </summary>
- /// <typeparam name="TValue">The serialized value type</typeparam>
- /// <param name="expr">The expression to parse to reach the parameter override</param>
- /// <returns>A <see cref="SerializedParameterOverride"/> or <c>null</c> if none was
- /// found</returns>
- /// <example>
- /// <code>
- /// [Serializable]
- /// public class MyEffect : PostProcessEffectSettings
- /// {
- /// public FloatParameter myParameter = new FloatParameter { value = 1f };
- /// }
- ///
- /// [PostProcessEditor(typeof(MyEffect))]
- /// public class MyEffectEditor : PostProcessEffectEditor<MyEffect>
- /// {
- /// SerializedParameterOverride m_MyParameter;
- ///
- /// public override void OnEnable()
- /// {
- /// m_MyParameter = FindParameterOverride(x => x.myParameter);
- /// }
- /// }
- /// </code>
- /// </example>
- /// <seealso cref="SerializedParameterOverride"/>
- protected SerializedParameterOverride FindParameterOverride<TValue>(Expression<Func<T, TValue>> expr)
- {
- var property = serializedObject.FindProperty(RuntimeUtilities.GetFieldPath(expr));
- var attributes = RuntimeUtilities.GetMemberAttributes(expr);
- return new SerializedParameterOverride(property, attributes);
- }
- }
- }
|