この記事でのバージョン
Unity 5.3.4f1 Personal
はじめに
今回はタイトル通り、変数の初期値を変更しても反映されない時の対処法です。
個人的にはUnityで始めたばかりの頃にハマりやすい所の一つだと思っとります。
原因
ではさっそく本題です。
タイトルのような問題は変数をpublicにしているかSerializeFieldを付けている時に起こります。
例えば以下のようにpublicな変数を設定したとします。
public float Speed = 4f;
この初期値を後から変更すると……、
public float Speed = 5f;
なんとInspector側の数字は4のまま!
そして実行してもSpeedは4のまま!
つまり、コード側で書いた初期値よりInspector側の値が優先されるというのが原因です。
解決策
この問題を解決する方法は変数をInspectorに表示しない事です。
publicな変数だと表示されてしまうので、privateにするのが手っ取り早いです。
private float _speed = 4f;//Inspectorに表示されない public float Speed = 4f;//Inspectorに表示される
ただし、privateにしたので外部から参照できなくなります。
float speed = sample._speed;//エラーが出る
外部からの参照を有効にしつつ、Inspectorに表示させたくない場合はHideInInspectorを使います。
[HideInInspector] public int PublicHideInt = 10;//Inspectorに表示されず、外部からアクセスできる。
ちなみに外部からの参照を無効にしつつ、Inspectorに表示させる場合は
privateな変数にSerializeFieldを付けます。
[SerializeField] private int _privateSerializeInt = 10;//Inspectorに表示され、外部からアクセスできない。
まとめると以下の通り。
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { /*protectedについては省略*/ private int _privateInt = 10;//Inspectorに表示されず、外部からアクセスできない。 public int PublicInt = 10;//Inspectorに表示され、外部からアクセスできる。 [SerializeField] private int _privateSerializeInt = 10;//Inspectorに表示され、外部からアクセスできない。 [HideInInspector] public int PublicHideInt = 10;//Inspectorに表示されず、外部からアクセスできる。 }
これで完璧ですね……!