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

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

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

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

Unity

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

Q&A

解決済

1回答

675閲覧

保存した音量を他シーンで共有できない。

giftVS

総合スコア19

C#

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

Unity

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

0グッド

0クリップ

投稿2019/02/01 11:56

前提・実現したいこと

メニューシーン保存した音量を他シーンで共有させたい。

発生している問題・エラーメッセージ

メニューシーンにスライダーを配置し音量と同期させ同シーンにあるタイトルに戻るボタンで音量を保存し、ステージシーンで保存した音量の値を受け取るまではできました。しかしその取得した音量をミキサーにセットできません。

該当のソースコード

メニューシーンにあるスライダーのスクリプト

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6 7public class VSlider : MonoBehaviour 8{ 9 public UnityEngine.Audio.AudioMixer mixer; 10 11 public Slider VolumeSlider; 12 13 public static float GetVolume; 14 15 16 17 void Awake() 18 { 19 GetComponent<Slider>().value = PlayerPrefs.GetFloat("master", 0); 20 21 float GetVolume = VolumeSlider.value; 22 23 PlayerPrefs.SetFloat("GetVolume", VolumeSlider.value); 24 25 Debug.Log("ステージに渡す"+PlayerPrefs.GetFloat("GetVolume", GetVolume)); 26 Debug.Log("スライダー値" + VolumeSlider.value); 27 } 28 29 public void masterVol(Slider VolumeSlider) 30 { 31 if (PlayerPrefs.HasKey("master")) 32 { 33 PlayerPrefs.GetFloat("master", VolumeSlider.value); 34 35 mixer.SetFloat("master", VolumeSlider.value); 36 } 37 else 38 { 39 mixer.SetFloat("master",-20); 40 } 41 } 42 void Update() 43 { 44 Slider VolumeSlider = gameObject.GetComponent<Slider>(); 45 46 } 47}

メニューシーンにあるタイトルに戻るボタン、PlayerPrefs.Save();は負荷が大きくボタンに置くといいと読んだのでここにおきました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7public class buttonmenu : MonoBehaviour 8{ 9 public Slider VolumeSlider; 10 11 public void OnClick() 12 { 13 FadeManager.Instance.LoadScene("Title", 0.3f); 14 15 16 17 PlayerPrefs.SetFloat("master", VolumeSlider.value); 18 PlayerPrefs.SetFloat("GetVolume", VolumeSlider.value); 19 PlayerPrefs.Save(); 20 Debug.Log("ステージに渡す" + PlayerPrefs.GetFloat("master", 0)); 21 Debug.Log("masterセーブ値" + PlayerPrefs.GetFloat("master", 0)); 22 Debug.Log("GetVolumeセーブ値" + PlayerPrefs.GetFloat("GetVolume", 0)); 23 } 24 25 26 27}

ステージにあるAudio Sourceにアタッチしてあるスクリプト。ここのデバッグには保存した数値がでてます。
しかしmixer.SetFloat("master", GetVolume);が機能しないです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SetVolume : MonoBehaviour { 6 7 public UnityEngine.Audio.AudioMixer mixer; 8 9 public static float GetVolume; 10 11 void Start() 12 { 13 14 PlayerPrefs.GetFloat("master", GetVolume); 15 16 mixer.SetFloat("master", GetVolume);//ここが機能しません。 17 18 Debug.Log("メニューからもらうStart" + PlayerPrefs.GetFloat("master", GetVolume));//ここはセーブした値が出ます。 19 20 } 21} 22

重複しますがSetVolumeのデバッグは保存した値がでます。
どうか知恵をお貸しください。
基本的なコードの書き方も理解していない素人ゆえコードで説明があるとすごく助かります。よろしくお願いします。

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

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

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

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

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

bochan2

2019/02/01 12:11

Playerprefsはメモリ上にキャッシュされてるので、実は(パフォーマンスの話のみなら)ガンガン呼んでしまって大丈夫だと思います。
guest

回答1

0

ベストアンサー

質問頂きありがとうございます。

PlayerPrefs.GetFloat("master", GetVolume);を
GetVolume=PlayerPrefs.GetFloat("master", 1);にしたら動くと思います。

public static float GetFloat(string key, float defaultValue);

と公式ドキュメントに書いてある通り、第2引数は値が無かったときの既定値です。

ここに公式ドキュメントのリンクを貼っておきますので読んでみてください。

https://docs.unity3d.com/ScriptReference/PlayerPrefs.GetFloat.html

投稿2019/02/01 12:15

編集2019/02/01 12:42
bochan2

総合スコア2050

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

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

bochan2

2019/02/01 12:16

関係ないといえば関係ないのですがstatic変数を使うべきかはよく考えた方が良いと思います
giftVS

2019/02/01 12:44

回答ありがとうございます。うまく作動しました。 申し訳ないのですがなぜよく考えたほうがいいのか厳しめな表現でも構いません勉強したいので教えていただけませんか。
bochan2

2019/02/01 12:50

クラスを複数生成したとき(同じScriptを複数のゲームオブジェクトに貼り付けるなどしたとき)に干渉するからです。 音量を複数種類用意することはあんまり無さそうですが、staticを外しても動くものは外してしまっておいた方が後で拡張するときに楽だと思います。
giftVS

2019/02/01 12:57

public static float GetVolume;は出す側でももらう側でも不要ということでしょうか。 そしてこれ(音量関係)以外でこのような書き方は不具合の元といことですかね。
bochan2

2019/02/02 00:18

仰る通り、もらう側では不要ということです。 あと、playerprefsで共有している以上変数は渡す必要が無いのでstaticでない方が冗長でなくなります。 playerprefsでしか受け渡ししていないのにstaticがあると他の人や未来の自分がどっちを使えば良いか分からなくなってしまうという問題もあります。
giftVS

2019/02/02 13:00

ありがとうございます。自分の理解が少し深まったと思います。 今後のためにもいろいろ修正してみます。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問