ProjectSettings > Audio > Global Volume
ProjectSettings の Audio には、オーディオのボリュームを調整できる Global Volume がある。一方ランタイムで操作できるボリュームには static 変数の、AudioListener.volume がある。
この両方はどうやら一緒っぽい。
AudioListener.volume が再生する度に Global Volume の値にリセットされているっぽい。
Unity での音が大きい場合ここを下げておくと便利なので、それを Editor 拡張からどうやればいいか調べてみました。
まずはエディタ拡張用の Slider。
<engine:Slider low-value="0" high-value="1" value="1" name="audioVolume" />
次に EditorWindow を継承したクラスでまずは Slider のイベント取得。
そして、スライダーが変わるごとに ProjectSettings の Audio の Global Volume を書き換え。
なぜか再生するたびに uxml 側の Slider が戻ってしまうので、再生時に設定されている値を入れ直す的な流れでできました。
/// <summary>
/// 静的コンストラクタ。
/// </summary>
static Lesson01Utility()
{
EditorApplication.playmodeStateChanged += PlayModeStateChanged;
}
/// <summary>
/// OnEnable.
/// </summary>
public void OnEnable()
{
VisualElement root = rootVisualElement;
VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UXML/***.uxml");
VisualElement labelFromUXML = visualTree.CloneTree();
root.Add(labelFromUXML);
AudioVolumeSlider = root.Query<Slider>("audioVolume").First();
AudioVolumeSlider.RegisterValueChangedCallback<float>(OnAudioVolumeChanged);
}
/// <summary>
/// ProjectSettings > Audio > Global Volume の変更。
/// </summary>
private static void OnAudioVolumeChanged(ChangeEvent<float> evt)
{
SetAudioGlobalVolume(evt.newValue);
}
/// <summary>
/// ProjectSettings > Audio > Global Volume の変更。
/// </summary>
private static void OnAudioVolumeChanged(ChangeEvent<float> evt)
{
SetAudioGlobalVolume(evt.newValue);
}
private static void SetAudioGlobalVolume(float volume)
{
Object audioMmanager = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/AudioManager.asset").FirstOrDefault();
SerializedObject audioManagerObject = new SerializedObject(audioMmanager);
SerializedProperty globalVolumeProperty = audioManagerObject.FindProperty("m_Volume");
globalVolumeProperty.floatValue = volume;
audioManagerObject.ApplyModifiedProperties();
}
private static float GetAudioGlobalVolume()
{
Object audioMmanager = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/AudioManager.asset").FirstOrDefault();
SerializedObject audioManagerObject = new SerializedObject(audioMmanager);
SerializedProperty globalVolumeProperty = audioManagerObject.FindProperty("m_Volume");
return globalVolumeProperty.floatValue;
}
/// <summary>
/// 以前の状態で再生されていたか。
/// </summary>
private static bool WasPlaying = false;
/// <summary>
/// 再生モードが変更された。
/// </summary>
private static void PlayModeStateChanged()
{
if (EditorApplication.isPlaying && EditorApplication.isPlaying != WasPlaying)
{
AudioVolumeSlider.value = GetAudioGlobalVolume();
WasPlaying = EditorApplication.isPlaying;
}
}
コメントを残す