Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AudioTrackInspector.cs 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. using UnityEngine.Playables;
  9. #if !UNITY_2020_2_OR_NEWER
  10. using L10n = UnityEditor.Timeline.L10n;
  11. #endif
  12. namespace UnityEngine.Timeline
  13. {
  14. [CustomEditor(typeof(AudioTrack))]
  15. [CanEditMultipleObjects]
  16. class AudioTrackInspector : TrackAssetInspector
  17. {
  18. [UsedImplicitly] // Also used by tests
  19. internal static class Styles
  20. {
  21. public const string VolumeControl = "AudioTrackInspector.volume";
  22. public const string StereoPanControl = "AudioTrackInspector.stereoPan";
  23. public const string SpatialBlendControl = "AudioTrackInspector.spatialBlend";
  24. const string k_Indent = " ";
  25. public const string valuesFormatter = "0.###";
  26. public const string mixInfoSectionSeparator = "\n\n";
  27. public static string mixedPropertiesInfo = L10n.Tr("The final {3} is {0}\n") +
  28. L10n.Tr("Calculated from:\n") +
  29. k_Indent + L10n.Tr("Track: {1}\n") +
  30. k_Indent + L10n.Tr("AudioSource: {2}");
  31. }
  32. static StringBuilder s_MixInfoBuilder = new StringBuilder();
  33. SerializedProperty m_VolumeProperty;
  34. SerializedProperty m_StereoPanProperty;
  35. SerializedProperty m_SpatialBlendProperty;
  36. PlayableDirector m_Director;
  37. public override void OnEnable()
  38. {
  39. base.OnEnable();
  40. if (((AudioTrack)target).timelineAsset == TimelineEditor.inspectedAsset)
  41. m_Director = TimelineEditor.inspectedDirector;
  42. m_VolumeProperty = serializedObject.FindProperty("m_TrackProperties.volume");
  43. m_StereoPanProperty = serializedObject.FindProperty("m_TrackProperties.stereoPan");
  44. m_SpatialBlendProperty = serializedObject.FindProperty("m_TrackProperties.spatialBlend");
  45. }
  46. protected override void DrawTrackProperties()
  47. {
  48. // Volume
  49. GUI.SetNextControlName(Styles.VolumeControl);
  50. EditorGUILayout.Slider(m_VolumeProperty, 0.0f, 1.0f, AudioSourceInspector.Styles.volumeLabel);
  51. EditorGUILayout.Space();
  52. // Stereo Pan
  53. GUI.SetNextControlName(Styles.StereoPanControl);
  54. EditorGUIUtility.sliderLabels.SetLabels(AudioSourceInspector.Styles.panLeftLabel, AudioSourceInspector.Styles.panRightLabel);
  55. EditorGUILayout.Slider(m_StereoPanProperty, -1.0f, 1.0f, AudioSourceInspector.Styles.panStereoLabel);
  56. EditorGUIUtility.sliderLabels.SetLabels(null, null);
  57. EditorGUILayout.Space();
  58. // Spatial Blend
  59. using (new EditorGUI.DisabledScope(ShouldDisableSpatialBlend()))
  60. {
  61. GUI.SetNextControlName(Styles.SpatialBlendControl);
  62. EditorGUIUtility.sliderLabels.SetLabels(AudioSourceInspector.Styles.spatialLeftLabel, AudioSourceInspector.Styles.spatialRightLabel);
  63. EditorGUILayout.Slider(m_SpatialBlendProperty, 0.0f, 1.0f, AudioSourceInspector.Styles.spatialBlendLabel);
  64. EditorGUIUtility.sliderLabels.SetLabels(null, null);
  65. }
  66. DrawMixInfoSection();
  67. }
  68. void DrawMixInfoSection()
  69. {
  70. if (m_Director == null || targets.Length > 1)
  71. return;
  72. var binding = m_Director.GetGenericBinding(target) as AudioSource;
  73. if (binding == null)
  74. return;
  75. var audioSourceVolume = binding.volume;
  76. var audioSourcePan = binding.panStereo;
  77. var audioSourceBlend = binding.spatialBlend;
  78. var trackVolume = m_VolumeProperty.floatValue;
  79. var trackPan = m_StereoPanProperty.floatValue;
  80. var trackBlend = m_SpatialBlendProperty.floatValue;
  81. // Skip sections when result is obvious
  82. var skipVolumeInfo = Math.Abs(audioSourceVolume) < float.Epsilon && Math.Abs(trackVolume) < float.Epsilon || // All muted
  83. Math.Abs(audioSourceVolume - 1) < float.Epsilon && Math.Abs(trackVolume - 1) < float.Epsilon; // All max volume
  84. var skipPanInfo = Math.Abs(audioSourcePan) < float.Epsilon && Math.Abs(trackPan) < float.Epsilon || // All centered
  85. Math.Abs(audioSourcePan - 1) < float.Epsilon && Math.Abs(trackPan - 1) < float.Epsilon || // All right
  86. Math.Abs(audioSourcePan - (-1.0f)) < float.Epsilon && Math.Abs(trackPan - (-1.0f)) < float.Epsilon; // All left
  87. var skipBlendInfo = Math.Abs(audioSourceBlend) < float.Epsilon && Math.Abs(trackBlend) < float.Epsilon || // All 2D
  88. Math.Abs(audioSourceBlend - 1) < float.Epsilon && Math.Abs(trackBlend - 1) < float.Epsilon; // All 3D
  89. if (skipVolumeInfo && skipPanInfo && skipBlendInfo)
  90. return;
  91. s_MixInfoBuilder.Length = 0;
  92. if (!skipVolumeInfo)
  93. s_MixInfoBuilder.AppendFormat(
  94. Styles.mixedPropertiesInfo,
  95. (audioSourceVolume * trackVolume).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  96. trackVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  97. audioSourceVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  98. AudioSourceInspector.Styles.volumeLabel.text);
  99. if (!skipVolumeInfo && !skipPanInfo)
  100. s_MixInfoBuilder.Append(Styles.mixInfoSectionSeparator);
  101. if (!skipPanInfo)
  102. s_MixInfoBuilder.AppendFormat(
  103. Styles.mixedPropertiesInfo,
  104. Mathf.Clamp(audioSourcePan + trackPan, -1.0f, 1.0f).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  105. trackPan.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  106. audioSourcePan.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  107. AudioSourceInspector.Styles.panStereoLabel.text);
  108. if ((!skipVolumeInfo || !skipPanInfo) && !skipBlendInfo)
  109. s_MixInfoBuilder.Append(Styles.mixInfoSectionSeparator);
  110. if (!skipBlendInfo)
  111. s_MixInfoBuilder.AppendFormat(
  112. Styles.mixedPropertiesInfo,
  113. Mathf.Clamp01(audioSourceBlend + trackBlend).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  114. trackBlend.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  115. audioSourceBlend.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
  116. AudioSourceInspector.Styles.spatialBlendLabel.text);
  117. EditorGUILayout.Space();
  118. EditorGUILayout.HelpBox(new GUIContent(s_MixInfoBuilder.ToString()));
  119. }
  120. protected override void ApplyChanges()
  121. {
  122. var track = (AudioTrack)target;
  123. if (TimelineEditor.inspectedAsset != track.timelineAsset || TimelineEditor.inspectedDirector == null)
  124. return;
  125. if (TimelineEditor.inspectedDirector.state == PlayState.Playing)
  126. track.LiveLink();
  127. else
  128. TimelineEditor.Refresh(RefreshReason.ContentsModified);
  129. }
  130. bool ShouldDisableSpatialBlend()
  131. {
  132. return m_Director == null ||
  133. targets.Any(selectedTrack => m_Director.GetGenericBinding(selectedTrack) == null);
  134. }
  135. }
  136. }