unity: 一時停止して再開するときのみ発生する、エラーの調査
エラーの内容
Unityではゲームの再生を停止して再開する機能がある。再開する前にソースコードを編集すると、再コンパイルされる。
Unityエディタ上でのリスタート(再生の停止・再開)時に、必ず以下のエラーが発生する。
NullReferenceException: Object reference not set to an instance of an object
発生場所
void FixedUpdate()
{
// ... コード ...
float rpm = throttle * rotorController.GetMaxRpm();
// ... コード ...
}
調査の結果、rotorControllerがNullになっていて、GetMaxRpm()を呼び出そうとしてエラーが発生していた。しかし、なぜNullになったのだろうか。
原因
RotorController rotorController;
void Start()
{
rotorController = new RotorController(transform);
}
このコードは最初の一回しか実行されない。
Restartすると、private fieldであるrotorControllerの値は保存されない(Serialized Fieldやpublic fieldは保存されるかも)。
結果、rotorControllerには初期値であるNullが入ることになる。
解決策
Serialized Fieldとして定義する方法もあったが、コードと実際の値が異なってほしくないのでなるべく使いたくない。
Start => OnEnableに変更。
Restart時にもOnEnableは実行される。OnEnableはスクリプトが有効化されるときに実行される。
RotorController rotorController;
void OnEnable()
{
rotorController = new RotorController(transform);
}
参考になりそうなもの
詳しく知りたい方はどうぞ。