質問: "MyScriptable/Create EnemyData")] public class EnemyData : ScriptableObject { public string enemyName; public int maxHp; public int atk; public int def; public int exp; public int gold; } ```
回答: 混乱を招くのは「EnemyDataがインスタンス化されるのはいつか」と「enemyData変数にオブジェクトが入るのはいつか」が**別である**からだと思います。 ### EnemyDataがインスタンス化されるのはいつか 自分でまとめようかと思ってたら既に情報がありました。 【Unity】ScriptableObjectを使用した、コンポーネント・シーン間でのデータ共有について - テラシュールブログ > > ScriptableObjectはアセットでありインスタンスである > > > というわけで、インスタンス化されるのは「ScriptableObjectアセットを作った瞬間」です。 (これはScriptableObjectを継承したクラスの特性です) `[CreateAssetMenu(menuName = "MyScriptable/Create EnemyData")]` は「こういう名前のメニューを用意しますよ、それが選択されたらこのスクリプトを実行しますよ(その結果EnemyDataというScriptableObjectが生成されますよ)」という意味のコードです。 つまり`new EnemyData()`に匹敵するのは、このメニューを実行した瞬間(=**プロジェクトフォルダ内にEnemyDataアセットが出来た瞬間**)ということになります。 ### enemyData変数にオブジェクトが入るのはいつか 「ScriptableCharaControllerコンポーネントのインスペクター上で、enemyData変数にEnemyDataアセットをドラッグ&ドロップした時」 または「別のスクリプトから何らかの方法で設定した時」です。 **これは通常の参照型の変数と何ら変わりません。** (`public GameObject enemyObj;`と同じようなものである、ということ) なのでインスペクター上で設定せず、他スクリプトからの設定も無ければ、enemyDataはnullのままであり、ShowScriptableObjectDataメソッド内のDebug.Logはエラーになります。 とても余談ですが、MonoBehaviourを継承したクラスもnew出来ません。 「そのクラスが付与されているGameObjectが生成された瞬間」or「`AddComponent`メソッドによりGameObjectに付与された瞬間」にインスタンス化される為です。(内部的にはnewされていることに違いはありませんが、自分でnewしようとすると警告を出してくると思います) Unity(のMonoBehaviour)はそういうもの、という認識でいいと思います。 これらの継承が無いクラスのインスタンスを作りたければnewする必要があります。