スクリプタブルオブジェクト(あえてカナ表記)略してスク
- BTA(Kelorin Jo)
- 2019年12月15日
- 読了時間: 4分
Screptable Object…データをファイルにして保存、書き換えと読み込みに役立つってものなんですよね?(無垢な瞳)
エディタ拡張にしろゲームづくりにしろ避けては通れない?ものに挑戦してるとこですが、
先週はものすっっごく足止め食ってました。
データ格納のテンプレづくり、ファイル手動・自動生成はまあ理解すれば簡単にできた、
手動でフォーム欄に割り当てたスクリプタブルオブジェクトの中の数値の書き換えと読み込みは簡単にできた、
自動=スクリプトでスクリプタブルオブジェクトを読みこませるのがどうしてもできなかった。
理由は3つ、一つはつまらんことでした、読み込ますブツを置いてあるResourcesフォルダの名をタイポしてただけ。気づかなかった。目が悪すぎて。
自分が思ってた以上に見えてなくて、発見に数日かかった…
老いと緑内障です。Unityの文字小さいんだよっっ
2つ目の原因は、Resources.Loadは、たとえリソースどころかリソースフォルダ自体がなくてもエラーも警告もはかないで無言でnullを返すだけという、極めて珍しいコードだったことでした。そこに気づくまで、プロジェクト全体まで見回す羽目になったのでした。
エラーが出なければ対策も取れない。恐ろしい
スクリプタブルオブジェクト-長いよ略称とかないの。以後略してスクと表記-
スクを読み込むコードのResources.Loadが元凶とわかるも、、記事によってコードの構文が違いすぎるのがきつかった。なんで同じことするのに何通りも書き方があるのさ…そして結構タイポしてる記事も多い…
Instance …get…
CreateInstance…Resource.Load…
EditorUtility.SetDirty
…
最後の理由は、スクはゲッターとセッターを備えてないとスクの中身を見れない書き込めないということでした。
それしなくても中身が取り出せてるぽい記事が多数だったので、なぜこれがないといけないのか未だにわかりません。その反面、実行中にスクの中身を書き換えてから終了してももとに戻らない、マジで書き換わるみたいな。プレイ中でも非実行時でもエディタ拡張から操作してもしっかり書き換わるのでまあいいかな…。(もしかしたら何かの拍子で戻るのかも)
色んなサイトの記事のコードをつぎはぎして、トライ&エラーの果て動いたコードは、
・スクのテンプレ
CreateAssetMenuで手動作成用メニュー、普段Monobehabiorとか出るところをScriptableObjectって換える、
外部から読み書きはゲッターとセッターをつければできたのでした。なぜこれでないとできないのか知らない。大量の変数ぶんを用意するのクソめんどい、
なおただの変数は読み書きできても、リストの中の変数の取得する構文が今の所わからない。
参考にしたサイト
例
using UnityEngine;
// スクリプタブルオブジェクトの練習1
[CreateAssetMenu(menuName = "Test/SCDATA")]
public class SCDataTemplate : ScriptableObject {
[SerializeField] private string SCname = ""; [SerializeField] private Vector3 SCpoint = new Vector3(0,0,0);
// ゲッター public string GetSCname() { return SCname; }
public Vector3 GetSCpoint() { return SCpoint; }
//セッター public void SetSCname(string word) { SCname=word; }
public void SetSCpoint(Vector3 xyz) { SCpoint=xyz; }
}
これでプロジェクトの右メニューからブランクのスクが作れます。ファイル名を変えて使います
スクのファイル名がSCData1だったら、
Vector3 zahyou=SCData1.GetSCpoint()でzahyouにSCpoint;が代入されます
SCData1.SetSCname(namae)lでSCnameにnamaeが代入されます
・スクを生成する
シーンのオブジェクトを選択してデータを控えるエディタ拡張などに必要な
テンプレコードを元にまっさらなスクを作成する機能
参考にしたサイト
//リソースディレクトリへのパス private const string RESOURCES_PATH = "Assets/Resources/";
…
private void Create(string Filename = null) {
string dataPath = RESOURCES_PATH + Filename +".Asset"; AABpreset data = ScriptableObject.CreateInstance<AABpreset>(); AssetDatabase.DeleteAsset(dataPath); AssetDatabase.CreateAsset((ScriptableObject)data, dataPath);.
※AABpresetがスクのテンプレ名 上のコードと別のから抜粋だから名前が違います
・スクに値を保存
上のコードからの続きです。dataが作ったばかりのスクの内容を保持してて、そのまま値を書き込めます。
スクがセッターを備えてれば値を書き込めるので、以下を実行すればバッチリ保存されました。
参考にしたサイト
…(dataに変数の値を代入)
//保存 ScriptableObject obj = AssetDatabase.LoadAssetAtPath(dataPath, typeof(ScriptableObject)) as ScriptableObject; EditorUtility.SetDirty(obj);
Debug.Log(dataPath + "を作成");
}

シーンに配置したオブジェクトをエディタウィンドゥにD&Dすると情報をもろもろ取得、
書き出しボタンを押すとファイル生成、数値も書き込まれてます
次の問題は、エディタ拡張・自作エディタのGUI入力フォームに配列とリストの欄を表示させる方法がわからないことです。
選択した複数オブジェクト、親オブジェクトの複数の子を配列リストに入れるのはできてます。
入力フォームの出し方がマジでやり方わかりません。
記事が全然見つからない。
英語サイトにあったコード打ってみたけどダメ…
あとこのGUI、2017.4では正常に表示されるけど2018.3以降では動かないかもしれないです。
GUIの構文あたりが一部通らないようで。
バージョン違い対策も必要なのかー?しかしこれまたそれらしき記事が見つからない…