1
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とは

Posted at

最初に

本記事は自分のチートシート用にまとめているため、端折っている部分が多々あります。
正確な情報をお求めの方は引用元のサイトをご覧ください。

概要

ゲームやアプリの中で変化せず、あちこちで共用するデータを格納する時に便利なクラス

たとえば、
・複数リスポーンする敵のパラメータ
・カードゲームのカードの名前、パワー、HP、スキル

個別のゲームオブジェクト等にアタッチはせず、都度アセットをロードして使用するため、メモリの節約になる。(これがメインの目的)
Scriptを生成したときに自動で継承されるMonoBehaviourと同じ立ち位置

使い方

クラスの定義
using UnityEngine;

[CreateAssetMenu(menuName = "Card State")] //このクラスのアセットをメニューから作成する際のパスの定義
public class TileState : ScriptableObject 
{
    public string name;
    public int power;
    public int hp;
}

Start()関数とUpdate()関数は消しておくこと。
これらはMonoBehaviourで定義されていることからScriptableObjectでは使用できない。

解説

[CreateAssetMenu(menuName = "Card State")]
このクラスのアセットをメニューから作成する際のパスを定義する
上記の例だとUnity画面の Assets > Create > Card State より選択できるようになる
image.png
public class TileState : ScriptableObject
クラスの継承元は、いつものMonoBehaviourからScriptableObjectに変更する

あとは自由に定義するだけ

構造体やクラスじゃダメ?

冒頭に記載した通り、構造体やクラスだと生成するゲームオブジェクトごとにアタッチする必要があるのでメモリの無駄使い
静的(Static)にすればアタッチ不要になるけど、オブジェクト生成前からメモリを消費するので同じくメモリの無駄使い(カードゲームを例に挙げれば、何百種類のカードのデータを静的に保持してたら大変なことになる。。。)

ポケモンもUnityをベースに作ってると聞いたことがあるけど、キャラクターごとの名前やデザイン、ステータスなどはScriptableObjectで定義されてるのかなあ、知らんけど

参考にしたサイト

1
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
1
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?