PostProcessEffectEditor.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Linq.Expressions;
  3. using UnityEngine.Rendering.PostProcessing;
  4. namespace UnityEditor.Rendering.PostProcessing
  5. {
  6. /// <summary>
  7. /// The class to inherit from when designing custom effect editors.
  8. /// </summary>
  9. /// <typeparam name="T">The effect type to create an editor for</typeparam>
  10. public class PostProcessEffectEditor<T> : PostProcessEffectBaseEditor
  11. where T : PostProcessEffectSettings
  12. {
  13. /// <summary>
  14. /// Find a serialized property using an expression instead of a string. This is safer as it
  15. /// helps avoiding typos and make code refactoring easier.
  16. /// </summary>
  17. /// <typeparam name="TValue">The serialized value type</typeparam>
  18. /// <param name="expr">The expression to parse to reach the property</param>
  19. /// <returns>A <see cref="SerializedProperty"/> or <c>null</c> if none was found</returns>
  20. /// <example>
  21. /// <code>
  22. /// [Serializable]
  23. /// public class MyEffect : PostProcessEffectSettings
  24. /// {
  25. /// public float myParameter = 1f;
  26. /// }
  27. ///
  28. /// [PostProcessEditor(typeof(MyEffect))]
  29. /// public class MyEffectEditor : PostProcessEffectEditor&lt;MyEffect&gt;
  30. /// {
  31. /// SerializedProperty m_MyParameter;
  32. ///
  33. /// public override void OnEnable()
  34. /// {
  35. /// m_MyParameter = FindProperty(x => x.myParameter);
  36. /// }
  37. /// }
  38. /// </code>
  39. /// </example>
  40. /// <remarks>
  41. /// If you're trying to retrieve a <see cref="SerializedParameterOverride"/>, you should
  42. /// use <seealso cref="FindParameterOverride{TValue}"/> instead.
  43. /// </remarks>
  44. /// <seealso cref="SerializedProperty"/>
  45. /// <seealso cref="FindParameterOverride{TValue}"/>
  46. protected SerializedProperty FindProperty<TValue>(Expression<Func<T, TValue>> expr)
  47. {
  48. return serializedObject.FindProperty(RuntimeUtilities.GetFieldPath(expr));
  49. }
  50. /// <summary>
  51. /// Find a serialized parameter override using an expression instead of a string. This is
  52. /// safer as it helps avoiding typos and make code refactoring easier.
  53. /// </summary>
  54. /// <typeparam name="TValue">The serialized value type</typeparam>
  55. /// <param name="expr">The expression to parse to reach the parameter override</param>
  56. /// <returns>A <see cref="SerializedParameterOverride"/> or <c>null</c> if none was
  57. /// found</returns>
  58. /// <example>
  59. /// <code>
  60. /// [Serializable]
  61. /// public class MyEffect : PostProcessEffectSettings
  62. /// {
  63. /// public FloatParameter myParameter = new FloatParameter { value = 1f };
  64. /// }
  65. ///
  66. /// [PostProcessEditor(typeof(MyEffect))]
  67. /// public class MyEffectEditor : PostProcessEffectEditor&lt;MyEffect&gt;
  68. /// {
  69. /// SerializedParameterOverride m_MyParameter;
  70. ///
  71. /// public override void OnEnable()
  72. /// {
  73. /// m_MyParameter = FindParameterOverride(x => x.myParameter);
  74. /// }
  75. /// }
  76. /// </code>
  77. /// </example>
  78. /// <seealso cref="SerializedParameterOverride"/>
  79. protected SerializedParameterOverride FindParameterOverride<TValue>(Expression<Func<T, TValue>> expr)
  80. {
  81. var property = serializedObject.FindProperty(RuntimeUtilities.GetFieldPath(expr));
  82. var attributes = RuntimeUtilities.GetMemberAttributes(expr);
  83. return new SerializedParameterOverride(property, attributes);
  84. }
  85. }
  86. }