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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

808閲覧

Unityにてプロパティを使用し、値をsetしましたが、他のスクリプトから呼び出した時反映されていませんでした。何が原因かわかりますでしょうか?

arabiiiiiiiiiii

総合スコア8

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2023/01/04 22:29

Unityにてプロパティを使用し、値をsetしましたが、他のスクリプトから呼び出した時反映されていませんでした。

FPS風のゲームを作成しており、
オプション画面のスライダーで設定した値を、他スクリプトに反映させたいです。
エラーメッセージは何も出ていません。

イメージ説明

#スクリプトなどの情報

●プロパティのスクリプト

C#

1 public float Sensitivity 2 { get; set; } = 3f;

●スライダーのスクリプト

C#

1Slider Slider; 2property Sensityvity = new property(); 3 4 void Start() 5 { 6 Slider = GetComponent<Slider>(); 7 8 float maxHp = 6f; 9 float nowHp = Sensityvity.Sensitivity; 10 11 //スライダーの最大値の設定 12 Slider.maxValue = maxHp; 13 14 //スライダーの現在値の設定 15 Slider.value = nowHp; 16 } 17 18 void Update() 19 { 20 Slider.value = Sensityvity.Sensitivity; 21 } 22 23 public void Method() 24 { 25 Debug.Log("現在値:" + Slider.value); 26 Sensityvity.Sensitivity = Slider.value; ★ 27 Debug.Log(Sensityvity.Sensitivity); 28 }

★の箇所で、setさせてプロパティのSensitivityの値を変更させたつもりでいたのですが、
再度オプション画面を表示させた時、値に変更はされていません。
デバックログで確認した際★の瞬間ではSensityvity.Sensitivityの値は変更されています。

他のスクリプト上でも、以下で値を確かめてみましたが、
property Sensityvity = new property();
Debug.Log(Sensityvity.Sensitivity);
プロパティの値は変更されていませんでした。

#補足情報
Unityのバージョン : 2019.4.22f1

何かわかることがあれば、教えていただきたいです。
以上、よろしくお願いいたします。

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

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

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

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

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

ganta7188

2023/01/04 23:36

オプション画面を再度開いたときに、スライダーが再生成されて、 newの部分で初期化されているかもしれません。  → property Sensityvity = new property(); オプション画面を都度プレハブから生成しているならその可能性が高いです。 (逆に都度生成するのではなく表示/非表示するだけなら起こらない) 試しに static property Sensityvity = new property(); として、値が保持されるかどうか試してみてください
arabiiiiiiiiiii

2023/01/05 00:27 編集

ありがとうございます!本当にありがとうございます!! そのとおりでした。 static property Sensityvity = new property(); に変更し、再表示するとプロパティの値が更新されており取得できました。 もう一つお伺いしたいです。 オプション画面で設定できた値を、他のスクリプトからgetで呼び出したいです。 行ったところ、こちらも値が更新されていませんでした。 そういうことはできないのでしょうか? #別スクリプト property Sensityvity = new property(); void Update() { Debug.Log(Sensityvity.Sensitivity);★ } こちらは初期化等をしていないため、Updateの★の箇所のタイミングで、オプション画面で設定した値になると思っていたのですが、なりません。 Updateの中に property Sensityvity = new property(); を記載を試してみたのですが、結果は変わりませんでした。
guest

回答1

0

ベストアンサー

※質問内容は解決したようなので、追加の質問の回答をします

別のスクリプトでnewしたのであれば、それはスライダーとは関係ない別物となります。
値を共有したいのであれば、スライダースクリプトの持っている、Sensityvityにアクセスする必要があります。

こういう場合は通常、
property Sensityvity を public property Sensityvity と直して外部から見れるようにしてから、
GetComponentでスライダースクリプトを取得して、

float value = Slider.Sensityvity.Sensityvity;
などとして値を取得してきます。
詳しくはGetComponentで検索して、調べてみてください。

---
と、通常は上記のやり方でよいのですが、今回の値はオプション画面で使うデータなので、
ちょっと特殊になります。

オプション画面のBGMボリュームなどは、例えばゲームオーバーになってタイトル画面に戻っても、
保持しておきたい値ですよね?

これが敵のHPなど、戦闘が終わったら消して良いようなデータなら、上で書いたようにGetComponentでアクセスして使うのですが、オプション画面のデータはタイトル画面ですら残っているような、他にあまりない特殊な値です。

この場合は、いつでも(ゲーム開始直後~ゲーム終了まで)どこでも(どの画面にいるときも)アクセスできるようにする必要があります。

なので、

C#

1public class GameManager 2{ 3 public static OptionData optionData = new OptionData(); 4}

こんなスクリプトを用意しておき、実際に使うときは、

C#

1volume = GameManager.optionData.bgmVolume;

みたいな感じで使うといいと思います。
(public staticな変数は、いつでもどこでも使えますが、代わりにゲーム終了まで初期化もされないため、こういった特殊なケースでしかオススメできません。通常は、ちゃんとGetComponentして取得してください)

※補足
property Sensityvityという名前になっていますが、
これだとわかりにくいので、

クラス名  インスタンス名
OptionData optionData
として、
OptionDataクラスには、
float mouseSensityvity や
float bgmVolume という変数名を持たせたほうが分かりやすいと思います。

以上、説明が長くなってしまいました…
ゆっくり頑張ってくださいね

投稿2023/01/05 01:13

ganta7188

総合スコア436

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

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

arabiiiiiiiiiii

2023/01/05 01:46

詳細なアドバイスもいただき、本当にありがとうございました。 頑張ります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問