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

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

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

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

Unity

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

Q&A

解決済

1回答

21895閲覧

Unity C# public staticで宣言した変数はなぜインスペクタービューに表示されないのでしょうか?

risaito74

総合スコア44

C#

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

Unity

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

0グッド

1クリップ

投稿2016/02/09 08:12

サウンドをpublic staticで宣言し、別シーンでも使えるようなものを考えています。
本当はAudioSourceのbgmMainComponentをインスペクターでアタッチするつもりでしたが、なぜかインスペクターに表示されないので、bgmMainをGetComponentして代入するようにしています。

publicで宣言したものはインスペクターに表示され、public staticにしたものはインスペクターに表示されませんが、public staticをインスペクターに表示する(アタッチできるようにする)方法はないのでしょうか?
public staticはなぜインスペクターに表示されないのでしょうか?

C#

1public class InitControllerScript : MonoBehaviour { 2 public GameObject bgmMain; //アタッチ用オブジェクト 3 public static GameObject test; 4 public static AudioSource bgmMainComponent; //コンポーネント

イメージ説明
↑※public staticのtestとbgmMainComponentは表示されません。

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜ表示されないかの答えは簡単です。
InitControllerスクリプトが追加されたゲームオブジェクトが複数あり、
それぞれのbgmMainComponentに別々の値が設定された場合、
InitController.bgmMainComponentで取得できる値を判別できないからです。

別シーンでも利用する方法としては、GameObject.DontDestroyOnLoad()にゲームオブジェクトを渡す方法が有名です。
static変数でbgmMainComponentが読み込まれているかどうかを保持し、AudioSourceが追加されたプレハブをインスタンス化してontDestroyOnLoadを設定する方法はいかがでしょうか。

投稿2016/02/09 08:54

hiramaru

総合スコア48

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

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

risaito74

2016/02/09 10:42

ありがとうございます。 staticは唯一の存在(1つのインスタンスしかない)だから複数あると矛盾する(あってはならない)ということですよね?まだ理解がぼんやりしている部分もありますが、本件については了解しました。 DontDestroyOnLoadはすでに活用しています。(実はシングルトンがめんどく…もとい、難しそうなのでもっと簡単にできるのでは…という試行錯誤をしているところでした)
hiramaru

2016/02/09 13:39

よく考えたらstaticの性質上、2つ目のオブジェクトのインスペクタで値を設定したら、1つ目のオブジェクトの値もかわるべきですね。 staticな変数がインスペクタに表示されても良いんじゃないかなと思えてきました…… Unityがstatic変数をインスペクタに表示させないのは、 わかりづらい、勘違いしやすい、つまりバグを生みやすい。からではないでしょうか。 ゲームというジャンルは静的な要素やグローバルな要素を使いたくなる場面が多いので記述を簡単にしたい気持ちはとてもわかりますし、常に簡単にできないか模索すべきだと思います。 シングルトンに関してはこんな感じでしょうか。 ```C# using UnityEngine; public class CommonObjects : MonoBehaviour { static CommonObjects myInstance; public GameObject test; public AudioSource bgmMainComponentt; // 定義側で楽をしたいならこれだけ public static AudioSource bgm => GetInstance().bgmMainComponentt; // 呼び出し側で楽をしたいならこれも追加 public static CommonObjects GetInstance() { return myInstance = myInstance ?? CreateInstance(); } static CommonObjects CreateInstance() { var prefab = Resources.LoadAll<CommonObjects>( "" )[ 0 ]; var instance = GameObject.Instantiate<CommonObjects>( prefab ); GameObject.DontDestroyOnLoad( instance ); return instance; } } ``` 呼び出し側は CommonObjects.GetInstance().bgmMainComponentt もしくは CommonObjects.bgm で呼び出します。 コメントにもありますが定義側で楽をするか呼び出し側で楽をするかですね…悩ましい。
hiramaru

2016/02/09 13:44

すみません今試したら式本体プロパティはUnityのC#では使えないようなので、今までのように public static AudioSource bgm { get { return GetInstance().bgmMainComponentt; } } ですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問