質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1178閲覧

Unityで5段階で区切った音量調節機能をつけたい

yamasho69

総合スコア19

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/11/05 12:02

前提

以下のブログの記事(以下ブログとします。)を元に5段階の音量調節機能をつけようと思いました。
【Unity】AudioMixerを使ってスクリプトから音量を調整する

参考にしたブログのコードには、データの記録機能がなかったので、EasySave(playerprefsのようなもの)というアセットを使い自分で付け足しました。

以下のnoteの記事(以下noteとします。)を元に段階を付けない音量調節機能は実装できました。
【AudioMixer】Unityで簡単音量調整ができるオーディオミキサー機能【SoundOption編】

実現したいこと

以下の3点から5段階で調節できて、スライダーの位置と音量が一致しており、アプリ終了とシーン遷移時もスライダーの位置と音量が記録されているシステムを作りたいです。

1.noteの方法だと、スライダーが半分以下になると極端に音が小さくなってしまうため、ブログの方法を使いたい。
2.ブログの方法を元に SetSE(float volume) を記述したが、シーン遷移すると、音量は保存されているが、スライダーの位置が一番右に戻っている。
3.一度アプリを終了し、再度起動すると、音量は最大、スライダーの位置は一番右に戻っている。

以下のコードは SetBGM(float volume)はnote側、 SetSE(float volume) はブログ側を元に記述しています。

C#

1using UnityEngine; 2using UnityEngine.Audio; 3using UnityEngine.UI; 4 5public class AudioVolume : MonoBehaviour { 6 public AudioMixer audioMixer; 7 public Slider bGMSlider; 8 public Slider sESlider; 9 10 private void Start() { 11 float bgmVolume = ES3.Load<float>("BGM_VOLUME", 1); 12 float seVolume = ES3.Load<float>("SE_VOLUME", 5); 13 bGMSlider.value = bgmVolume; 14 sESlider.onValueChanged.AddListener(SetSE); 15 } 16 17 public void SetBGM(float volume) { 18 bGMSlider.value = volume; 19 audioMixer.SetFloat("BGM", volume); 20 ES3.Save<float>("BGM_VOLUME", volume); 21 } 22 23 public void SetSE(float volume) { 24 //sESlider.value = volume; 25 //audioMixer.SetFloat("SE", volume); 26 //ES3.Save<float>("SE_VOLUME", volume); 27 28 //5段階補正 29 var a = volume /= 5; 30 31 //-80~0に変換 32 var marume = Mathf.Clamp(Mathf.Log10(a) * 20f, -80f, 0f); //marume 0.2 a = 3/5 33 audioMixer.SetFloat("SE", marume); 34 ES3.Save<float>("SE_VOLUME", volume); 35 } 36} 37 38### 試したこと 39様々な変数の入れ替え等。 40スライダーが動かなくなったりしたため、一番いい状態のコードを載せております。 41 42### 補足情報(FW/ツールのバージョンなど) 43Unity2022.3.32f; 44ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

音量ではなく、スライダーの位置をセーブ、ロードすることで解決しました。

C#

1using UnityEngine; 2using UnityEngine.Audio; 3using UnityEngine.UI; 4 5public class AudioVolume : MonoBehaviour { 6 public AudioMixer audioMixer;//オーディオミキサーを登録 7 public Slider bGMSlider;//BGMのスライダーを登録 8 public Slider sESlider;//SEのスライダーを登録 9 10 private void Start() { 11 //BGMとSEのスライダーの位置をロード。データがなければ最大値を入れる。 12 float bgmSliderPosition = ES3.Load<float>("BGM_SLIDER", 5.0f); 13 float seSliderPosition = ES3.Load<float>("SE_SLIDER", 5.0f); 14 //BGMとSEのセットメソッドを呼び出す 15 SetBGM(bgmSliderPosition); 16 SetSE(seSliderPosition); 17 } 18 19 public void SetBGM(float bgmSliderPosition) { 20 //スライダーの位置から相対量をdBに変換してvolumeに入れる 21 var volume = Mathf.Clamp(Mathf.Log10(bgmSliderPosition/5) * 20f, -80f, 0f); 22 //スライダーの位置のデータとビジュアルを合わせる 23 bGMSlider.value = bgmSliderPosition; 24 //オーディオミキサーにvolumeの値をセットする。 25 audioMixer.SetFloat("BGM", volume); 26 //スライダーの位置をセーブする。 27 ES3.Save<float>("BGM_SLIDER", bGMSlider.value); 28 } 29 30 public void SetSE(float seSliderPosition) { 31 var volume = Mathf.Clamp(Mathf.Log10(seSliderPosition/ 5) * 20f, -80f, 0f); 32 sESlider.value = seSliderPosition; 33 audioMixer.SetFloat("SE", volume); 34 ES3.Save<float>("SE_SLIDER", sESlider.value); 35 } 36}

投稿2022/11/06 17:28

yamasho69

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問