Editorで編集中に気づくと、たまに、
NullReferenceException: Object reference not set to an instance of an object
というエラーが出ていて、編集中に?何故?Editor拡張周りに何かバグが?って思っていたのですが、違いました。
理由は、Reset関数のせいでした。
以下、引用。Reset関数とは、
デフォルト値にリセットします
Reset はインスペクターのコンテキストメニューにある Reset ボタンやコンポーネントを初めて追加するときに呼び出されます。 この関数はエディターモードのみで呼び出されます。Reset はインスペクターでデフォルト値を設定するときにもっともよく使用されます。
ということです。そんな特別な関数になるとはつゆ知らず。普通にResetという名前の関数を作っていました。
例えば、以下の様な関数
public void Reset() { cachedTransform.localPosition = startPosition; }
cachedTransformは以下のようにStart関数で与えるようにしていたので問題が。
void Start()
{
cachedTransform = transform;
}
当然、Editorで編集中はStart関数が呼ばれていないのでcachedTransformはnullなわけです。とほほ。
というわけで、Reset以外に良い名前はないかと考えてみたんですが、なかなかよい名前が思い浮かばない... 妥協してResetParamsという関数名に変更して対処しました。
それにしても、今回のResetもそうだけど、Unityの、StartとかUpdateとかAwakeとか、仮想関数でも無いのに勝手に呼ばれるのが怖い。
処理高速化のためとはいえ、なんとかならんものか。せめて命名規則とかでそれっぽくしておいて欲しい。全部頭にOnをつけて、
OnStart
OnUpdate
OnAwake
OnReset
ってするとか。