暫無描述
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.

AudioClipPropertiesDrawer.cs 3.4KB

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