UnityEngine.ScriptableObject のコンストラクターの扱いは厄介です。
ScriptableObject を継承しなきゃ良い話なんですが、とりあえず数値をインスペクターに表示したいときなんかには便利なんですよねぇ。
便利なんですが、引数無しのコンストラクターは制限したいので、どうにかしたいです。
👇 👇 👇
試した方法
public class MyObject : ScriptableObject
private
private MyObject() { } であっても、CreateInstance<T>() によって System.Reflection 経由で実行されてしまいます。
残念。
new
static new T CreateInstance<T>() where T : MyObject すると、、、
ScriptableObject.CreateInstance<MyObject>() が引き続き使えます。残念。
OnValidate()
根本的な解決は不可能、無理矢理 CreateInstance<T>() が使われたか感知するしかなさそう。
でも OnValidate() は実行されるタイミングがちょっと謎。インスペクターで表示しなくても実行はされるがインスタンス直後じゃない。
[SerializeField]
private bool _invalid = true;
void OnValidate()
{
if (_invalid) throw new System.Exception("OnValidate()");
}
public static T Instantiate<T>(object requirement) where T : MyObject
{
var so = CreateInstance<T>();
// initialization
so._invalid = false;
return so;
}
--
ScriptableObject はコンストラクターの扱いだけ何とかしてくれれば便利なんですが、、、。
ScriptableObject を直に使うことはないから、Visual Studio 上で ScriptableObject.CreateInstance をエラーとして扱えたら便利そう、、、
以上です。お疲れ様でした。