AudioClipPropertiesDrawer.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Text;
  5. using JetBrains.Annotations;
  6. using UnityEditor;
  7. using UnityEditor.Timeline;
  8. namespace UnityEngine.Timeline
  9. {
  10. [CustomPropertyDrawer(typeof(AudioClipProperties))]
  11. class AudioClipPropertiesDrawer : PropertyDrawer
  12. {
  13. [UsedImplicitly] // Also used by tests
  14. internal static class Styles
  15. {
  16. public const string VolumeControl = "AudioClipPropertiesDrawer.volume";
  17. const string k_Indent = " ";
  18. public const string valuesFormatter = "0.###";
  19. public static string mixedPropertiesInfo = L10n.Tr("The final {3} is {0}\n" +
  20. "Calculated from:\n" +
  21. k_Indent + "Clip: {1}\n" +
  22. k_Indent + "Track: {2}");
  23. public static string audioSourceContribution = L10n.Tr(k_Indent + "AudioSource: {0}");
  24. }
  25. static StringBuilder s_MixInfoBuilder = new StringBuilder();
  26. public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
  27. {
  28. var volumeProp = property.FindPropertyRelative("volume");
  29. GUI.SetNextControlName(Styles.VolumeControl);
  30. EditorGUI.Slider(position, volumeProp, 0.0f, 1.0f, AudioSourceInspector.Styles.volumeLabel);
  31. if (TimelineEditor.inspectedDirector == null)
  32. // Nothing more to do in asset mode
  33. return;
  34. var clip = SelectionManager.SelectedClips().FirstOrDefault(c => c.asset == property.serializedObject.targetObject);
  35. if (clip == null || clip.parentTrack == null)
  36. return;
  37. var clipVolume = volumeProp.floatValue;
  38. var trackVolume = new SerializedObject(clip.parentTrack).FindProperty("m_TrackProperties.volume").floatValue;
  39. var binding = TimelineEditor.inspectedDirector.GetGenericBinding(clip.parentTrack) as AudioSource;
  40. if (Math.Abs(clipVolume) < float.Epsilon &&
  41. Math.Abs(trackVolume) < float.Epsilon &&
  42. (binding == null || Math.Abs(binding.volume) < float.Epsilon))
  43. return;
  44. if (Math.Abs(clipVolume - 1) < float.Epsilon &&
  45. Math.Abs(trackVolume - 1) < float.Epsilon &&
  46. (binding == null || Math.Abs(binding.volume - 1) < float.Epsilon))
  47. return;
  48. s_MixInfoBuilder.Length = 0;
  49. var audioSourceVolume = binding == null ? 1.0f : binding.volume;
  50. s_MixInfoBuilder.AppendFormat(
  51. Styles.mixedPropertiesInfo,
  52. (clipVolume * trackVolume * audioSourceVolume).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  53. clipVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  54. trackVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  55. AudioSourceInspector.Styles.volumeLabel.text);
  56. if (binding != null)
  57. s_MixInfoBuilder.Append("\n")
  58. .AppendFormat(Styles.audioSourceContribution,
  59. audioSourceVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture));
  60. EditorGUILayout.Space();
  61. EditorGUILayout.HelpBox(new GUIContent(s_MixInfoBuilder.ToString()));
  62. }
  63. }
  64. }