はじめに
現在、大学の課題で某どうぶつゲームから着想を得た2DパズルゲームをUnityで制作している。本作は鳥をできるだけ多く積み上げ、高いスコアを目指すというゲームだ。今回は本作の制作でも使った基底クラス、MonoBehaviourとScriptableObjectについて、比較したいと思う。
基底クラスとは
基底クラスとは、他のクラスに機能や性質を受け継がせるための「親クラス」のこと。他のクラス(派生クラス)に共通の処理や変数をまとめて定義でき、派生クラスは基底クラスの機能をそのまま使ったり、拡張したりできる。
MonoBehaviourとは
MonoBehaviour(モノビヘイビア) は、Unityのゲームオブジェクトにアタッチして使う、基本的なスクリプトの基底クラスのこと。Unityのゲームオブジェクトに動作や挙動を与えるためのスクリプトを作るときは、このクラスを継承する。継承するとStart()やUpdate()などのUnityのイベント関数を使える。チャッピー曰く、MonoBehaviourは「ゲームオブジェクトに命を吹き込むための土台」だそう。
MonoBehaviourの特徴
| 特徴 | 説明 |
|---|---|
| ゲームオブジェクト依存 | スクリプトはゲームオブジェクトにアタッチして初めて機能する |
| Unityイベントの利用 |
Start(), Update() などが使える |
| シーン内で有効 | シーン内のゲームオブジェクトに紐付く |
| コンポーネント管理 | 他のコンポーネント(Rigidbody, Colliderなど)を簡単に取得可能 |
ScriptableObjectとは
ScriptableObject(スクリプタブルオブジェクト)は、Unityで使われるデータ保持用の基底クラスのこと。ゲームオブジェクトに依存せず独立したデータとしてアセット化でき、データをシーン間で共有したり、複数オブジェクトで再利用したりできる。ゲームオブジェクトにアタッチして動作するものではないため、継承してもStart()やUpdate()などのUnityのイベント関数は基本的に使えない。チャッピー曰く、「ゲームの設定や情報を保存・共有するためのデータコンテナ」だそう。
ScriptableObjectの特徴
| 特徴 | 説明 |
|---|---|
| シーン非依存 | ゲームオブジェクトにアタッチしなくてもアセットとして存在できる |
| 再利用可能 | 複数のオブジェクトで同じデータを参照可能 |
| 軽量 | MonoBehaviourよりメモリ消費が少ない |
| Inspectorで編集可能 |
[SerializeField] を使って値を設定できる |
両者を比較してみよう
| 比較項目 | MonoBehaviour | ScriptableObject |
|---|---|---|
| 依存対象 | ゲームオブジェクト | シーンやオブジェクトに依存しない |
| イベント関数 |
Start(), Update() など使用可能 |
基本的に使用不可 |
| 用途 | 挙動・処理 | データ保持・設定 |
| 作成方法 | ゲームオブジェクトにアタッチ | アセットとして作成、再利用可能 |
まとめ
MonoBehaviourとScriptableObjectには、それぞれ違った良さがある。Unityでゲーム制作をするなら、それぞれの特徴を覚えておこう!メリークリスマス!