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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

Q&A

解決済

3回答

1949閲覧

PlayerPrefsで音量がセーブ、ロードできない

Buddha_san2

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/06/24 11:02

編集2018/06/27 05:56

前提

Unity,C#でゲームを作っています。
前の質問が複雑になってしまったので、ここで清書します、すいません。

Sliderを使っています。
シーンが変わっていても音量を維持するようにしています。

問題

PlayerPrefsを使っているのですが、うまく音量がセーブできません。

float volume の値を変えても意味がないのでしょうか?
よろしくお願いします。

該当のソースコード

これが音量のSliderにつなげています。

public class VolumeALL : MonoBehaviour { public UnityEngine.Audio.AudioMixer mixer; // インスペクター上からスライダーのオブジェクトを登録 public Slider targetSlider;   public static float volume; void Start() { // mixer.GetFloat()の値は、volumeに代入される // 返り値は、パラメーターが存在しない場合にfalseになる if (mixer.GetFloat("Master", out volume)) { targetSlider.value = volume; } //セーブされている音量をロードする volume = PlayerPrefs.GetFloat("VOLUME", volume); } //sliderの所にこれを起動しています public void masterVol(Slider slider) { mixer.SetFloat("Master", slider.value); }

シーンを切り替えるボタンの所で、

public void SaveVolume(float volume) {     float Volume = VolumeALL.volume; PlayerPrefs.SetFloat("VOLUME", Volume); }

を起動させています。

###訂正後

public class VolumeALL : MonoBehaviour { public UnityEngine.Audio.AudioMixer mixer; // インスペクター上からスライダーのオブジェクトを登録 public Slider targetSlider; void Start() { targetSlider.value = PlayerPrefs.GetFloat("Master",0); } public void masterVol(Slider slider) { mixer.SetFloat("Master", slider.value); } }

シーンを移動させるボタンにこのメソッドを起動

public void SaveVolume(Slider slider) { PlayerPrefs.SetFloat("Master", slider.value); PlayerPrefs.Save(); }

これで、Sliderをセーブ、ロードすることが出来ました。自分自身、教えて頂かなければ、一生出来なかったと思います。
回答、本当にありがとうございます。
もし良ければ、もう少しだけ教えて頂けたらと思います。
##問題点
次は、その音量を変えるシーンに移らなければ、音量が変わらないという事になりました。
私のゲームでは、タイトルのシーンが最初なので、一度設定のシーンに行かなければ音量が変わりません。
タイトル画面の状態から音量が変わっている、というようにすることは可能でしょうか?

##タイトル画面の音楽を流しているコード
関係ないかもしれないのですが、挙げます

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ //シーンが同じでも重複再生されないコード //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ public class Sound2 : MonoBehaviour { public bool dontDestroyEnabled = true; //instanceにSoundを格納 private static Sound2 instance = null; public static Sound2 Instance { get { return instance; } } void Awake() { //既にinstanceに曲入っていて、新たに入った曲があれば、それを消去 if (instance != null && instance != this) { Destroy(this.gameObject); return; } //曲がまだなら曲スタート else { instance = this; } //サウンドを消去せずに維持する DontDestroyOnLoad(this.gameObject); }

解決したコード

音量の変更をするスライダー部分

public class VolumeALL : MonoBehaviour { public UnityEngine.Audio.AudioMixer mixer; // インスペクター上からスライダーのオブジェクトを登録 public Slider targetSlider; void Start() { targetSlider.value = PlayerPrefs.GetFloat("Master",0); masterVol(targetSlider); } public void masterVol(Slider slider) { mixer.SetFloat("Master", slider.value); } }

タイトル画面

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ //シーンが同じでも重複再生されないコード //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ public class Sound2 : MonoBehaviour { public UnityEngine.Audio.AudioMixer mixer; public bool dontDestroyEnabled = true; //instanceにSoundを格納 private static Sound2 instance = null; public static Sound2 Instance { get { return instance; } } void Awake() { //既にinstanceに曲入っていて、新たに入った曲があれば、それを消去 if (instance != null && instance != this) { Destroy(this.gameObject); return; } //曲がまだなら曲スタート else { instance = this; } //サウンドを消去せずに維持する DontDestroyOnLoad(this.gameObject); } void Start() { mixer.SetFloat("Master", PlayerPrefs.GetFloat("Master", 0)); }

回答して頂いた皆様(MMashiro様、capra314cabra様、ha_wn様、TomoG12様)のおかげで、無事うまくセーブ、ロードが出来ました。
無知な私に、長い時間付き合って頂き、本当にありがとうございます。

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

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

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

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

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

guest

回答3

0

ベストアンサー

タイトル画面の音楽を流しているコードで音量設定している箇所が無いと当然ですがタイトル画面の音量は変わらないです。
動作優先でSound2に付け加えると下記の様になると思います。

  1. //追加 の3行分を書き足して下さい。

2.mixerにはInspectorからVolumeALLのmixerでアタッチしているものと同じものを入れて下さい。

※これで音が鳴らなくなった場合はセーブされたデータが無いです。

C#

1using System.Collections; //追加 2 3//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4//シーンが同じでも重複再生されないコード 5//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6public class Sound2 : MonoBehaviour 7{ 8 public UnityEngine.Audio.AudioMixer mixer; //追加 9 public bool dontDestroyEnabled = true; 10 11 //instanceにSoundを格納 12 private static Sound2 instance = null; 13 14 public static Sound2 Instance 15 { 16 get { return instance; } 17 } 18 19 void Awake() 20 { 21 //既にinstanceに曲入っていて、新たに入った曲があれば、それを消去 22 if (instance != null && instance != this) 23 { 24 Destroy(this.gameObject); 25 return; 26 } 27 //曲がまだなら曲スタート 28 else 29 { 30 instance = this; 31 } 32 //サウンドを消去せずに維持する 33 DontDestroyOnLoad(this.gameObject); 34 mixer.SetFloat("Master", PlayerPrefs.GetFloat("Master",0)); //追加 35 }

・追記
確認なのですがスライダーはこのgif画像の下側「Master」部分の様に正常に動作しているという事で大丈夫でしょうか?
イメージ説明

その場合dBへの数値変換を「ソースコードのどこかで対応している」「スライダーをMin Value -80,Max Value 0の様にして対応している」のどちらなのかお聞きしたいです。

何を言っているのか判らない場合はそう書いてくれて構わないです。

・追記2
以下をそのまま使ってどうなのか試して下さい。
mixerがnullになっている場合は再設定も忘れずお願いします。
スライダーはMinValue-70、MaxValue 0の設定のままで良いです。

C#

1using UnityEngine; 2using System.Collections; //追加 3 4//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5//シーンが同じでも重複再生されないコード 6//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7public class SetVolumes : MonoBehaviour 8{ 9 public UnityEngine.Audio.AudioMixer mixer; //追加 10 public bool dontDestroyEnabled = true; 11 12 //instanceにSoundを格納 13 private static Sound2 instance = null; 14 15 public static Sound2 Instance 16 { 17 get { return instance; } 18 } 19 20 void Awake() 21 { 22 //既にinstanceに曲入っていて、新たに入った曲があれば、それを消去 23 if (instance != null && instance != this) 24 { 25 Destroy(this.gameObject); 26 return; 27 } 28 //曲がまだなら曲スタート 29 else 30 { 31 instance = this; 32 } 33 //サウンドを消去せずに維持する 34 DontDestroyOnLoad(this.gameObject); 35 } 36 37 void Start() 38 { 39 mixer.SetFloat("Master", PlayerPrefs.GetFloat("Master", 0)); //追加 40 } 41}

投稿2018/06/26 10:00

編集2018/06/27 05:32
Hawn

総合スコア1222

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

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

Buddha_san2

2018/06/26 12:44

すいません、三行追加して、mixerにVolumeALLと同じものを入れましたが、何も変わりませんでした。 mixer.SetFloat("Master", PlayerPrefs.GetFloat("Master",0)); これで音量を設定と同じように出来る、と私も思ったのですが、何かあるのでしょうか? 大変申し訳ないのですが、ご助言頂けたら嬉しいです。
Hawn

2018/06/27 03:52 編集

VolumeALLのmixer.SetFloat("Master", slider.value);が本当に正常に動くならば何も変わらないという事は無い気もしますが Debug.log(PlayerPrefs.GetFloat("Master",0));を何処かに追加して表示される数字を教えて下さい。 >戻り値はしっかりと保存されています。なので、0です。 >音量をSliderで変えるとその変えた分の数値がしっかりとセーブされています。 他の方とこういったやり取りしていましたがこれは正常にセーブした値なのでしょうか? 保存したミキサーの数値が0で無いにも関わらず0が毎回返ってきているとしたら保存されている数値を取れていないという事になります。
Hawn

2018/06/27 01:54 編集

それとAudioSourceとSound2.csが付けられたゲームオブジェクトは本当にシーン上に一つだけ存在しているでしょうか? その辺り問題が無く値も取れているのであれば下の二か所を書き換えて下さい。 public UnityEngine.Audio.AudioMixer mixer; //追加 ↓ public AudioSource audio; //追加 public AudioSource audioにはInspectorから”再生するシーンのゲームオブジェクトにアタッチされているAudioSource”を入れて下さい。 mixer.SetFloat("Master", PlayerPrefs.GetFloat("Master",0)); //追加 ↓ audio.volume = PlayerPrefs.GetFloat("Master",0); //追加
Buddha_san2

2018/06/27 04:42

Sliderを動かし、再起動をしたところ、タイトル画面で-46になりました。 AudioSourceのオブジェクトはSound2のみがついています。 ほかに、タイトル画面のボタンに効果音を入れて、クリックしたら、 GetComponent<AudioSource>().Play(); を起動させて、効果音を出すようにしています。 二か所を書き替えました。ただ、一か所目が public new AudioSource audio; とするようにいわれたので、newを付けました。 audioにはタイトル画面で流れている音楽(audioSource)を入れました。 そうしたところ、Siiderが0、音量がMAXでも音楽が出なくなりました。 音楽は無音になったのですが、効果音はやはり設定画面に行かないと音量が変わりませんでした。 質問なのですが、今私が音量を設定しているのが、Master,BGM,SEのうちのMasterの部分で、すべての音量を管理するところなのですが、そのせいでタイトル画面の音量が変わらない、ということはありますでしょうか?
Hawn

2018/06/27 05:53 編集

>そうしたところ、Siiderが0、音量がMAXでも音楽が出なくなりました。 >音楽は無音になったのですが、効果音はやはり設定画面に行かないと音量が変わりませんでした。 上の変更は「タイトル画面の音楽の音量変更」に対応したものなので効果音は変わりません。
Hawn

2018/06/27 05:01 編集

>質問なのですが、今私が音量を設定しているのが、Master,BGM,SEのうちのMasterの部分で、すべての音量を管理するところなのですが、そのせいでタイトル画面の音量が変わらない、ということはありますでしょうか? AudioMixerのMasterは全ての音量に対応しているので正常に変更出来ていればBGM,SEも一緒に音量が変わります。 上に書いたソースコードの二か所の変更はAudioMixerの設定が上手く出来ていないと考えて、BGMのみ音が変わるようにしました。 スライダーのMin Value -80,Max Value 0の設定にされているようなのでMin Value 0,Max Value 1でタイトル画面のBGMだけは対応出来る筈です。 効果音の方は変更出来ませんがそもそも存在を初めて知ったので考慮していません。 そちらも対応するならばgif画像の件とExposed Parametersで設定したパラメータ名を教えて頂きたいです。
Buddha_san2

2018/06/27 05:00

いえ、タイトルの音楽(BGM)が何をしても流れなくなりました。 Sliderを動かしても何をしても音楽(BGM)が流れません。 今回、音量の調節をしているのはすべての音量を管理するところで、 タイトルの音楽(BGM)は何も流れなくなりましたが、SEは変わらず設定画面に行かないと音量が変わりません。つまり、SEの音は出ますが、設定画面に行かない限り、SEの音量の変更が出来ていない状態です。
Hawn

2018/06/27 05:02

>いえ、タイトルの音楽(BGM)が何をしても流れなくなりました。 >Sliderを動かしても何をしても音楽(BGM)が流れません。 スライダーのMin Value -80,Max Value 0の設定にされているようなのでMin Value 0,Max Value 1でタイトル画面のBGMだけは対応出来る筈です。 これをまず試して頂きたいです。
Buddha_san2

2018/06/27 05:09

スライダーは正常に機能していることを確認しました。 ただし、タイトル画面に行くとすべての音量が0に戻ってしまいます。 設定画面に行くと、スライダーで変更した音量がロードされます。 すいません、追記の部分が分かりません。 スライダーの音量について、MinValueとMaxValueはInspectorで手動で変更しています。 例えば、今回のスライダーはMinValue-70、MaxValue0としています
Hawn

2018/06/27 05:34 編集

追記の部分が分からず何故その設定が出来ているのかが疑問ですが タイトルの「BGM音量だけ」を変更するのはスライダーの設定をMin Value 0,Max Value 1で出来るのでそちらに変更するか。 効果音も含めるならば現状のスライダーの設定のままタイトルでmixer.SetFloatをStartで読み込んでMasterの値を変えれば良いです。
Hawn

2018/06/27 05:33 編集

本文「追記2」に新しいソースコード書いたのでそれをそのままSetVolumes.csにコピペして使って下さい。
Buddha_san2

2018/06/27 05:38

ありがとうございます!うまく機能しました。 しっかりとタイトル画面でも音量が変更しました、本当にありがとうございます。ha_wnさんが居なければ、絶対にここまでたどりつきませんでした。本当に感謝の気持ちでいっぱいです。 疑問なのですが、 Awake()だとmixer.SetFloat が起動せず、Start()で起動したのはどういうことなのでしょうか?
Hawn

2018/06/27 05:57 編集

Awake()の実行はStart()より早いです。 今回であればAudioMixerの変更はAwake()では受け付けていないがStart()では受け付けているといった状態になっています。 他の原因も考えていたので提示が遅れました。 申し訳ないです。
Buddha_san2

2018/06/27 05:50

なるほど...理解しました、ありがとうございます!
guest

0

横から失礼します。

public void SaveVolume(float volume) {     float Volume = VolumeALL.volume; PlayerPrefs.SetFloat("VOLUME", Volume);      PlayerPrefs.Save(); }

でいけるかと思います。
PlayerPrefs.Set~~はデータを設定しているだけで保存は出来ていません。
PlayerPrefs.Save()をすることで保存されています。
公式カンファレンス

投稿2018/06/25 04:23

TomoG12

総合スコア299

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

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

Buddha_san2

2018/06/25 08:55

セーブできるようになりましたありがとうございます!
guest

0

Start関数内でロードした後 targetSlider.value に対して volume を代入してください。
floatは値型なので参照型のような挙動はしない為です。

投稿2018/06/24 12:39

MMashiro

総合スコア2378

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

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

Buddha_san2

2018/06/24 14:27 編集

回答ありがとうございます! Start関数内で、targetSlider.value と ロード の順番を変えるということでしょうか?
MMashiro

2018/06/24 22:51

そもそもの前提を聞いたほうが良いかもしれなかったです、 1. mixerから現在の音量を取得している 2. PlayerPrefsから保存した音量を取得している 上記のどちらをスライダーや現在の音量に反映させたいのでしょうか? PlayerPrefsを使っているのであれば1番の取得はそもそも要らないではないかと思った為です
Buddha_san2

2018/06/25 01:33

いまは、mixerから音量を取得しているので、PlayerPrefsから音量を取得すれば良いということでしょうか? mixerの音量が保存できるのであれば、そうしたいのですが、不可能ですよね...
MMashiro

2018/06/25 01:37

> いまは、mixerから音量を取得しているので、PlayerPrefsから音量を取得すれば良いということでしょうか? シーン移動前のAudioMixerの音量を保存しておいてシーン移動後に復元すれば良いと思います。 > mixerの音量が保存できるのであれば、そうしたいのですが、不可能ですよね... mixer.GetFloat("Master", out volume) で取得できるのは質問者様も知ってるはずなので、取得後volume変数をPlayerPrefsで保存すれば良いと思います
Buddha_san2

2018/06/25 04:04

理解力が悪くてすいません。 まず最初に、masterVolのメソッドで、 mixer.SetFloat("Master", slider.value); PlayerPrefs.SetFloat("Master", slider.value); のようにすれば良いという事でしょうか? 大変申し訳ないのですが、もしよければ、参考となるコードを教えて頂けると大変ありがたいです。
MMashiro

2018/06/25 04:23

masterVolは現状で良いと思います。 Startメソッド内で 1.PlayerPrefsから音量データを読み込み 2.その値をslider.valueに入れた後 3.masterVolを一度呼び出してください
MMashiro

2018/06/25 04:24

SaveVolumeメソッドではVolumeALL.volumeを保存するのではなく slider.valueかmixer.GetFloat("Master")の値を保存するようにしてください
MMashiro

2018/06/25 04:24

つまりVolumeALLのvolume変数は不要ということになります
Buddha_san2

2018/06/25 09:09

Sliderのセーブロードをすることが出来ました、ありがとうございます! MMashiroさんが居なければ、一生出来なかったと思います、ありがとうございます。 質問のところに問題の詳細を書きました。 もし良ければ、もう少しだけお付き合い頂けたら嬉しいです。
MMashiro

2018/06/25 09:23

Startメソッド内のSliderに代入した後 masterVolメソッドを呼び出してみたら意図した動きにはならないでしょうか?
Buddha_san2

2018/06/25 09:47

Startメソッドの中に VolumeBGM.masterVol(); を入れるということでしょうか? すいません、知識がないためにエラーが発生してしまいました。 「'VolumeBGM.masterVol(Slider)' の必要な仮パラメーター 'slider' に対応する特定の引数がありません。」
MMashiro

2018/06/25 09:51

masterVol(targetSlider); で良いと思います
Buddha_san2

2018/06/25 10:17

masterVol(targetSlider); を入れましたが、やはりタイトル画面の状態から音量が変わった状態にはなりませんでした。 音楽はタイトル画面で流すようにしており、設定画面ではDontDestroyOnLoadになっています。 設定のシーンに行かずに、タイトル画面から音量が変わった状態にするには、やはり不可能なのでしょうか? セーブしたのがSliderというだけで、音量自体はセーブされていないということなのでしょうか?
MMashiro

2018/06/25 10:31

タイトル画面で以前保存した音量が最初から反映されてるようにしたい という事であってますか?
Buddha_san2

2018/06/25 10:34

そうです!それが出来たらいいのですが、やはり難しいでしょうか?
MMashiro

2018/06/25 10:40

ということでしたら恐らく音量の保存が出来てない可能性が高いです。 現在タイトル画面でデバッグした場合 PlayerPrefs.GetFloat("Master",0); の戻り値はいくつでしょうか?
Buddha_san2

2018/06/25 11:11

戻り値はしっかりと保存されています。なので、0です。 音量をSliderで変えるとその変えた分の数値がしっかりとセーブされています。 しかし、数値が変わっても音量は設定のシーンに行くまで変わりません。
MMashiro

2018/06/25 11:21

数値を取得できているのであればその数値を mixer に渡すだけで良いはずなので、Start内でmasterVolを呼べば行けるはずなのですが…
Buddha_san2

2018/06/25 11:39

そうなんですね・・・なぜうまくいかないのでしょうか・・・ masterVol内の mixer.SetFloat("Master", slider.value); だけだと足りないんでしょうか?
capra314cabra

2018/06/25 12:43

ScriptReference的にはmixer.SetFloat("MasterVol", slider.value);ではないでしょうか。
Buddha_san2

2018/06/25 13:17

Exposed name does not exist: MasterVol UnityEngine.Audio.AudioMixer:SetFloat(String, Single) というエラーが出てきて、音量が変わらなくなってしまいました。
Hawn

2018/06/26 09:44 編集

パラメータ名はご自身で付けている筈なので変える必要ありません。 mixer.SetFloat("Master", slider.value);で正常だったのであれば戻しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問