Posted at

ScriptableObjectを継承して作ったクラスが読み込まれない?

More than 3 years have passed since last update.

さっき起きた出来事で「???」と頭を抱えた事案があったので

メモを残しておこうと思います(戒め)

夜遅く(22時)に仕事をしていたところ、ScriptableObjectを継承したクラスが何故か読み込まれない現象に陥りました。

しかもScriptableObjectクラスを継承して作った自作クラス全てではなく、特定の1クラスのみ。

こんな感じ。


hoge_Init.cs

using UnityEngine;

using System.Cillections;

namespace Hoge
{
// ScriptableObjectを継承したhogehogeをさらに継承してhoge_initを作成
public class hoge_init : hogehoge
{
      // Activeになった際に呼び出される(hogehogeよりoverride)
public override void OnActivate()
{
hoger();
}
}
}


こんな感じでhogehogeを継承して作られたクラスがいくつもあり、それらをScriptableObjectに格納して使っていたとします。

この時、ScriptableObjectの中にhogehogeを継承してクラスを登録出来るListがあり、その中にhoge_intを追加しました。

そして動作を確認し(問題なく挙動することを確認)、Save Assetsを入念に行い、assetを更新しました。

したはずです。

絶対にしました。

しかし、一旦unityを終了し、再度立ち上げると・・・一番最初に登録したhoge_initは消えていました。

入れ直したり、Save Assetsしてなかったんじゃないかと思い、shift+alt+S(macショートカット)を連打しましたが、結果は変わらず。

そこで一緒に仕事している方が気づきました。

「あれ?Initとinitになってない?」

ファイル名は「hoge_Init.cs

クラス名は「hoge_init

あっ

クラス名に寄せる形でファイル名を「hoge_init.cs」に直したところ、登録したhoge_initが消えなくなりました。

この現象が起きている時に、hoge_initを追加している.assetファイルの中身などを見ていると、hoge_initに対してguidが振られておらず、他のhogehogeクラスを継承したクラスのオブジェクトにはguidが振られていました。

Unityを起動して、.assetファイルを読み込む際にクラス名と同一のファイル名があるかなどを調べていたりするのだろうか………

普段はクラス名とファイル名を合わせる習慣がついているので気づきませんでした。

なかなか限定的な現象な気がしますが、また起きた時にわわっってなりたくないので、

メモ代わりに残しておきます。

クリスマス……イブ……