(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

変数の初期値を変更しても反映されない時の対処法【Unity】【トラブルシューティング】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.4f1 Personal


はじめに

今回はタイトル通り、変数の初期値を変更しても反映されない時の対処法です。

個人的にはUnityで始めたばかりの頃にハマりやすい所の一つだと思っとります。


原因

ではさっそく本題です。

タイトルのような問題は変数をpublicにしているかSerializeFieldを付けている時に起こります。

例えば以下のようにpublicな変数を設定したとします。

public float Speed = 4f;

f:id:kan_kikuchi:20160719134153p:plain


この初期値を後から変更すると……、

public float Speed = 5f;

f:id:kan_kikuchi:20160719134153p:plain


なんと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に表示されず、外部からアクセスできる。

}  

f:id:kan_kikuchi:20160719135238p:plain


これで完璧ですね……!