【Unity】 ScriptableObjectを使おう
ScriptableObjectの基本的な使い方について。
メニューからAssets→Create ScriptableObjectと選んで実行すると、
そのクラスがあるフォルダにPlayerData.assetが作成される。
Inspectorを見ると以下のように表示される。

このようにInspectorで値が編集出来てそのまま保存出来るデータになった。
普段と違うのは、Hierarchyに置いたゲームオブジェクトからプレハブを作成するのではないところだ。
つまり、ScriptableObjectを継承して作ったクラスを「リソースデータ」として作成し、
プロジェクトに置いておけるのだ。
これの使い道はというと、作成したプレハブをResourcesディレクトリ配下に置き、
以下のようなコードで動的に読み込んで使うことが主になると思われる。
これは完全にリソースデータの概念だ。
例えばプレイヤーや敵のデータを種類ごとに作成しておいて、バトルが始まる前にロードして
セットアップするといった流れのゲームの本流の流れに適した形のデータだ。
ゲームオブジェクトにデータを持たせた場合に、シーン毎にそれを設定しなければならなかったり、
それが同一プレハブだったりするとコンフリクトしてしまう事がよくある。
そういった手間や困った事を早めにScriptableObjectベースのリソースデータを動的ロードして
使用するフローに置き換えておくことで、グッと作業量が減ることだろう。
注意点としては、このプレハブ自体をゲームオブジェクト内でメンバとして持つ事も出来て、
その場合にInspectorから値を編集して保存すると元のプレハブの値も変わる。
基本このデータ用のプレハブを丸ごとメンバとして持つのは、特別な理由が無い限り避けた方がいいだろう。
あくまでデータの中身だけを参照して、ローカルに流してやる用途が自然だ。
他にも、ScirptableObjectはExcelから吐いたデータとの連携などもコードで書くと出来るようだ。
プロジェクト内にExcelのファイルを入れておき、そのファイルを編集してUnityに戻ると
それに対応したScriptableObject継承のデータを吐いたりといった、プランナー向けの拡張も出来る。
カスタマイズ次第で色々便利になるScriptableObject、まだ使っていないという方は
試しに使ってみてはいかがだろうか。
(扱うデータの種類や数が沢山あるものに向いていると思う。)
ScriptableObjectは、これまたあまり深く理解はしていないので的外れかもしれないが、
使ってみた感じ「全シーンで共通のリソースデータ」の作成に向いているクラス、のような気がしている。
全てのアセットファイルはこのクラスが元になっているっぽく、それをこっちでも使えるようになっている。
テラシュールさんのこのスクリプトが凄く便利で仕事でも良く使わせていただいている。
ScriptableObjectをプレハブとして出力する汎用スクリプト
https://gist.github.com/tsubaki/5149402
ScriptableObjectを継承して作成したクラスを、そのままScriptableObjectのプレハブとして
出力してくれるものだが、例えばプレイヤーのデータを作る場合にこんなクラスを作ったとする。
using UnityEngine;
using System.Collections;
[System.Serializable]
public class StatusData
{
public int m_HP;
public int m_MP;
public int m_Attack;
public int m_Defence;
}
public class PlayerData : ScriptableObject
{
public int m_No;
public StatusData m_Status;
public AnimationCurve m_Curve;
}
メニューからAssets→Create ScriptableObjectと選んで実行すると、
そのクラスがあるフォルダにPlayerData.assetが作成される。
Inspectorを見ると以下のように表示される。

このようにInspectorで値が編集出来てそのまま保存出来るデータになった。
普段と違うのは、Hierarchyに置いたゲームオブジェクトからプレハブを作成するのではないところだ。
つまり、ScriptableObjectを継承して作ったクラスを「リソースデータ」として作成し、
プロジェクトに置いておけるのだ。
これの使い道はというと、作成したプレハブをResourcesディレクトリ配下に置き、
以下のようなコードで動的に読み込んで使うことが主になると思われる。
// difficulty setting
var data = Resources.Load( "PlayerData" ) as PlayerData;
m_HP = data.m_HP;
// ...
これは完全にリソースデータの概念だ。
例えばプレイヤーや敵のデータを種類ごとに作成しておいて、バトルが始まる前にロードして
セットアップするといった流れのゲームの本流の流れに適した形のデータだ。
ゲームオブジェクトにデータを持たせた場合に、シーン毎にそれを設定しなければならなかったり、
それが同一プレハブだったりするとコンフリクトしてしまう事がよくある。
そういった手間や困った事を早めにScriptableObjectベースのリソースデータを動的ロードして
使用するフローに置き換えておくことで、グッと作業量が減ることだろう。
注意点としては、このプレハブ自体をゲームオブジェクト内でメンバとして持つ事も出来て、
その場合にInspectorから値を編集して保存すると元のプレハブの値も変わる。
基本このデータ用のプレハブを丸ごとメンバとして持つのは、特別な理由が無い限り避けた方がいいだろう。
あくまでデータの中身だけを参照して、ローカルに流してやる用途が自然だ。
他にも、ScirptableObjectはExcelから吐いたデータとの連携などもコードで書くと出来るようだ。
プロジェクト内にExcelのファイルを入れておき、そのファイルを編集してUnityに戻ると
それに対応したScriptableObject継承のデータを吐いたりといった、プランナー向けの拡張も出来る。
カスタマイズ次第で色々便利になるScriptableObject、まだ使っていないという方は
試しに使ってみてはいかがだろうか。
(扱うデータの種類や数が沢山あるものに向いていると思う。)
[ | 2014年02月23日 19:02:28 : Unity | ] |