0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ScriptableObject のコンストラクターいろいろ

Last updated at Posted at 2022-08-24

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 をエラーとして扱えたら便利そう、、、

以上です。お疲れ様でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?