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
をエラーとして扱えたら便利そう、、、
以上です。お疲れ様でした。