読者です 読者をやめる 読者になる 読者になる

Editorで編集中に気づくと何故かNullReferenceExceptionのエラーが出ている件

Unity

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

ってするとか。


参考:
waken.hatenablog.com