いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Unityで、変数の初期化時の値を変更しても反映されなかった話

 開発作業していて、2時間ハマりました。うう……(涙)。皆さん、お気をつけください。

 メインのクラスで変数 xxxx を定義し、同時に初期化しました。

public int xxxx = 1234;

という感じです。他のクラスからも参照したかったので public をつけて宣言しています。なお、これは定数として使うつもりの変数で、それ以降値の変更はしていません。

 しばらく開発作業を続けていて、xxxx の初期化の値を5678に変更しました。つまり

public int xxxx = 5678;

と書き直しました。しかし!! 動作がおかしかったのでコード中で xxxx の値を表示させてみると、なんと!! 1234 なのです。やばいバグでも出したかな……と思いました。メモリ関係の、どこかの領域を破壊しているとか。実験を繰り返しても分からず、あちこちのサイトを見てみて理由が分かりました。

 

 最初に

public int xxxx = 1234;

とやった段階で、インスペクタの xxxx に初期値、1234がセットされていたのです。その後、

public int xxxx = 5678;

と直してもインスペクタの値は変更されません。

 この状態でプログラムを実行すると、インスペクタの値が優先されるのだそうです。

 

 驚きましたが仕方ありません。そういう仕様なのですね。しかしこうなるともう public の変数を宣言時に初期化するのは怖くなります。「この値を定数として使おう」と思っても、あとで「いや、別のこの値の方がいい!」みたいに考え直すなど日常茶飯事です。インスペクタに表示させなければよいそうで、それには変数の宣言前に[HideInInspector]を書きます。でもこれ、いちいち変数ごとにやらないとダメみたいです。うう、面倒くさい……。

 ぼくは結局、変数の宣言は今まで通りクラスの最初のあたりで行い、初期化はStart()ルーチンですることにしました。これで解決!

 

 変数の値はあっちからもこっちからもセットできる、みたいになっていて起こったことでした。インスペクタは便利ですが、こんなこともあるんですね……。

 

2021年4月22日(木)追記:

public だとインスペクタから代入できるようになるので、こういうことが起こるのです。public でないなら心配ありません。