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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2274閲覧

PlayerPrefsで音量をセーブ、ロードしたいがうまくいかない

Buddha_san2

総合スコア27

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/06/23 09:25

編集2018/06/26 07:15

前提

Unity,C#でゲームを作っています。
音量を変えたまま、セーブしたいと思っています。
音量調整はSliderを使っています。
現在問題は一番下のコードです。

問題

public float volume = PlayerPrefs.GetFloat("Volume", 0);

をしたところ、エラーが起きました。

UnityException: GetFloat is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'VolumeALL'.

GetFloatはMonoBehaviourから呼び出すことはできないとしたら、void Start()にfloat volumeを入れればいいのですが、そうなると、SetFloatでvolumeをセーブできません。

該当のソースコード

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

試したこと

ほかにどのような方法でセーブできるのかが分かりません。
また、このエラーをどうにかする方法が分かりません。
教えて頂けたらとても嬉しいです、よろしくお願いします。

###訂正後

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

直しましたが、次は再起動しても音量が変わったままになりません。
PlayerPrefs.SetFloat の場所が悪いのでしょうか?
その場合、どこに PlayerPrefs.SetFloat を入れれば良いのでしょうか?

もしくは、Startの PlayerPrefs.GetFloat が良くないのでしょうか?
申し訳ございません、もう少しだけよろしくお願いします。
###更に訂正後

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 void SaveVolume(Slider slider) { PlayerPrefs.SetFloat("Master", slider.value); PlayerPrefs.Save(); }

これで音量の保存はできましたが、タイトル画面から音量が変わることはありませんでした。一度音量設定画面に行かなければ変更された音量がロードされません。
どうすれば良いでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1public float volume = PlayerPrefs.GetFloat("Volume", 0);

の部分ですが、メンバー変数は初期化する際に、決まった値しか代入できません。
よって

C#

1public float volume;

と宣言だけにし、Start()かAwake()で

C#

1volume = PlayerPrefs.GetFloat("Volume", 0);

とすればよいと思います。

投稿2018/06/23 09:56

capra314cabra

総合スコア222

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

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

Buddha_san2

2018/06/23 11:40

訂正しました、見て頂けると嬉しいです。
capra314cabra

2018/06/23 11:49

masterVolがどこで呼び出されているか分からないので、憶測になりますが if (mixer.GetFloat("Master", out volume)) { targetSlider.value = volume; } でout引数を利用しているので、せっかくゲットしたvolumeの値を関数に書き換えさせてます。 mixer.SetFloat("Master", volume);をその前に挟むだけで改善するかもしれません。
Buddha_san2

2018/06/23 12:08

masterVolは音量を変えるsliderの所で起動させています。 ごめんなさい、もう少しだけ詳しく教えて頂いてもよろしいでしょうか?
capra314cabra

2018/06/25 12:44

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

2018/06/26 07:15

上手くいきませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問