質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2331閲覧

ScriptedImporterで生成したScriptableObjectに値が保持されない (Unity2018.3.0 b5)

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/10/18 15:16

前提・実現したいこと

ゲーム内で使用するデータをtsvで管理し、
UnityのScriptedImporterを使用して、インスペクタ上で確認できるようにしようと考えています。
ですが、生成したScriptableObjectの変数が、なぜか空になるようです。
理由と解決策をご存知の方がいれば、ご教授いただけると幸いです。

ソースコード

ScriptedImporter, ScriptableObject, Editorは、以下のように実装しています。
TSVの行ごとにScriptableObjectが生成され、先頭行は見出しとして使用するイメージです。

TSVObject

1using System.Collections.Generic; 2using UnityEngine; 3 4public class TSVObject : ScriptableObject { 5 public Dictionary<(int, string), string> data = new Dictionary<(int, string), string>(); 6}

TSVEditor

1using UnityEditor; 2using UnityEditor.Experimental.AssetImporters; 3 4[CustomEditor(typeof(TSVObject))] 5public class TSVEditor : ScriptedImporterEditor { 6 7 public override void OnInspectorGUI() { 8 base.OnInspectorGUI(); 9 10 serializedObject.Update(); 11 12 var data = target as TSVObject; 13 14 foreach (var key in data.data.Keys) { 15 EditorGUILayout.LabelField(key.Item2); 16 } 17 18 serializedObject.ApplyModifiedProperties(); 19 } 20}

TSVImporter

1using System.Collections.Generic; 2using UnityEngine; 3using UnityEditor.Experimental.AssetImporters; 4using System.IO; 5using System.Linq; 6 7[ScriptedImporter(1, "tsv")] 8public class TSVImporter : ScriptedImporter { 9 10 public override void OnImportAsset(AssetImportContext ctx) { 11 12 // ファイルを全行読み込み 13 var lines = new List<List<string>>(); 14 using (var stream = new StreamReader(ctx.assetPath, System.Text.Encoding.GetEncoding("shift_jis"))) { 15 while (stream.Peek() > -1) { 16 var line = stream.ReadLine().Split('\t').ToList(); 17 lines.Add(line); 18 } 19 } 20 21 // 読み込んだデータからScriptableObjectを作成 22 for (int id = 1; id < lines.Count; id++) { 23 24 var so = ScriptableObject.CreateInstance<TSVObject>(); 25 var heads = lines.First(); 26 var line = lines[id]; 27 28 for (int index = 0; index < heads.Count; index++) { 29 var head = heads[index]; 30 so.data.Add((id, head), line[index]); 31 } 32 33 so.name = "ID:" + id + "-" + so.data[(id, "名前")]; 34 ctx.AddObjectToAsset("ID:" + id + "-" + so.data[(id, "名前")], so); 35 36 } 37 38 } 39}

また、TSVファイルは以下の通りです。

ID 名前 説明文 1 回復薬 体力を回復します。 2 蘇生薬 戦闘不能を回復します。

試したこと

ctx.AddObjectToAsset呼び出し前後では、
生成したsoのdataのCountは、読みだしたデータが入っているようなのですが、
ゲーム実行時などで読み込むと、dataが空になっています。

以上、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ctx.AddObjectToAsset〜の次の行に
EditorUtility.SetDirty(so);
AssetDatabase.SaveAssets();
を入れると解決するんじゃないかと思います。

参考:ScriptableObjectの変更した値が戻ってしまう場合の対処法【Unity】【ScriptableObject】【トラブルシューティング】 - (:3[kanのメモ帳]

投稿2018/10/19 01:58

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/23 14:49

ご回答、ありがとうございます。 早速、SetDirty、SaveAssets共に試してみましたが、 やはり空のままでした。 実験的な機能ゆえの不具合なのか、 自分の実装が悪いのか…
sakura_hana

2018/10/24 02:21

うーん、原因不明ですが…… dataが空になっているというのは、インスペクターで見て確認した結果でしょうか。スクリプトからアクセスしても空ですか? また、試しにTSVObject内の変数をintやstring等のシンプルな型にするとどうでしょうか。 (エディタ上に表示されていないだけで、実は変数は正しく保持されている可能性もあるかなーと思います)
退会済みユーザー

退会済みユーザー

2018/10/25 13:31

なんと! アドバイスいただいた通り、シンプルな実装で試したところ、 しっかりデータが反映されていました! 実行前のScriptableObject選択時のインスペクターにも表示されていますし、 実行時も取得出来ています! ありがとうございます! いくつかの型で試したところ、 List<string>は保持され、 Dictionary, Tupleは保持されませんでした。 デフォルトでインスペクター上に表示できるものだけが保持されるのでしょうか。 今回はListを二つ作り、インデクサなどで対応することにします。 本当にありがとうございました!
退会済みユーザー

退会済みユーザー

2018/10/25 13:32

ちなみに、SetDirtyは呼び出さなくても動作するみたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問