ScriptableObjectではまったのでメモ
よくこんなSampleで動作確認とかしますよね。
ScriptableSample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Sample : ScriptableObject
{
public int Counter;
}
public class ScriptableSample
{
[MenuItem("Assets/Create/ScriptableSample")]
public static void CreateAsset()
{
Sample ObjSample = ScriptableObject.CreateInstance<Sample>();
string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/" + typeof(Sample) + ".asset");
AssetDatabase.CreateAsset(ObjSample, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
Unity5.5で動いたので、安心してUnity5.6.2で動かしてみるとWarningが出ます!Unity2017でも同じようです。
No script asset for Sample. Check that the definition is in a file of the same name.
Warningの内容からdefinition 定義が無いと怒られているみたいです。
さて定義とは何でしょう。
あれこれぐぐっていたらここにぶつかりました。
When building AssetBundles some scriptable objects get corrupted
最後にこんな説明がありました。
A ScriptableObject must have his own name file. For example, your StructureSettings definition must be in "StructureSettings.asset" file. Please check your definition place about StructureSettings.
ScriptableObjectにはそれを定義するファイルが必要だということです。
”ファイル?”
そう、file。
そこで、こんな感じ(↓)に変更してみると。Warningは消えました!
ScriptableObjectを作る時は、ファイル名とセットのクラスが定義されていることが大事なんですね。
ScriptableSample.cs
public class ScriptableSample : ScriptableObject
{
public int Counter;
[MenuItem("Assets/Create/ScriptableSample")]
public static void CreateAsset()
{
ScriptableSample ObjSample = ScriptableObject.CreateInstance<ScriptableSample>();
string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/" + typeof(ScriptableSample) + ".asset");
AssetDatabase.CreateAsset(ObjSample, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
ちなみにファイルを二つに分け、
Sample.cs
とScriptableSample.cs
Sample.cs側は
public class Sample : ScriptableObject{}
ScriptableSample側で、
CreateAsset()
という形でもWarningは出ませんよ。