開発作業していて、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 でないなら心配ありません。