スクリプトで宣言した変数の値とInspector上の変数の値が違う理由について、作業中になんとなく思ったことがあるので書いておきます。
前置として、
スクリプト上で変数をpublicを宣言するとInspector上から変数の値を変更できます。
publicなので別のスクリプトからも変更できます。
public int i;
[SerializeField]をつければprivate変数もInspector上に表示でき、値を変更できます。
この場合は別のスクリプトから値を変更することはできません。
[SerializeField] private int i;
なのですが、ゲームオブジェクト のInspector上で変数が変更されると、スクリプト側から変数の値を変更しても変わりません。
Inspector上の値が優先されてしまいます。
public int i = 0;
これを避けるためにはInpspector上に表示したくないpublic変数は[HideInInspector]をつけるわけです。
[HideInInspector] public int num = 0;
なぜInspector上で変更した値がスクリプトに書いた値より優先されるのかが不思議に思っていました。
今回はこの理由について思ったことです。
Inspectorの値を変更すればシーン別の細かい調整がしやすい
これが理由かなと思いました。
ゲームの難易度の数値の調整とかはエディタ上で実行しながらやれた方が楽だから、ということかなと。
細かい調整を毎回スクリプトの値を変更しながら行うと面倒です。例えばブロック崩しとかでボールやブロックの動きを調整するときに、Inspectorから調整できれば、スクリプトをいじらず、実行しならがバランスを調整できます。
これができないと、1回実行したら数値変えてまた実行する、を繰り返さないといけないわけです。
ほぼ共通だけどちょっとだけシーンごとに値を変えたりするのに、変数をシーンごとに作らないといけなくなるか、ほぼ同じスクリプトをシーンごとに用意しないといけなくなったりするのかなと。
まだクラスがなんなのかよくわかっていないけど、設計図だと考えれば当然なのかなとも思いました。
スクリプトは設計図(クラス)で、スクリプトをアタッチ すると実体化(インスタンス化 )される。
ゲーム内で細かく変更したい数値は設計図であるスクリプトから決めるのではなく、シーン内のオブジェクトにコンポーネントとしてアタッチ された(実体化)された状態で変更してね。
ということなのかなと。
ひとまず、不要にpublic変数を使わず、同じスクリプト内でしか使われない変数はprivateにし、
最初から値が確定している変数はconstをつけるなどした方がいいかと思いました。
このあたりもまだわかっていないので勉強しないとです。