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

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

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

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

Unity

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

Q&A

解決済

1回答

865閲覧

Unity ScriptableObjectの変数保存について

Hit01

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/25 23:40

[SerializeField]もしくは [System.Serializable]も使って変数の保存をしています。

Editor側からは

if (GUI.changed) { EditorUtility.SetDirty(target); serializedObject.ApplyModifiedProperties(); }

を呼び出し、ちゃんと変数の保存は出来ています。

しかし、他のScriptableObjectから読み取った値を保存しようとした場合、Playボタンを押した途端に値がリセットされてしまいます。

具体的には以下のような構成です。

[System.Serializable] public class A: ScriptableObject { [SerializeField] public List<string> Names; } [System.Serializable] public class B: ScriptableObject { [SerializeField] public A Sc_A; [SerializeField] public string a_name; }

classA をScriptableObjectとして管理しておきclassBのInspector側からclass Aを設置しています。

class B のa_nameには class A の Names の中から好きなものをインスペクターから選択できるようにしたいので、EditorGUILayout.popupを利用して Sc_A にセットされているclass AのNamesを取得、選択できるようにしています。

Popupで選択し、Inspector上で保存は出来るようにはなりましたが。 Playボタンを押したタイミングで一度値が初期化されているようで、どうしてもデフォルト値に戻されてしまいます。

ただ、if(application.isPlaying)で起動中かどうかとゆう処理を挟めば変動の心配はないのですが、あまりに力技な感じがしてこれといった方法がないか探しています。

いろいろ資料を探してみたのですが、ScriptableObjectをScriptableObjectから参照している例が少なくあまり有力な情報が得られません。
アドバイスお願い致します。

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

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

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

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

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

sakura_hana

2018/05/26 06:12

値がリセットされるのはClassBのa_nameという認識でいいですか? また、ClassAを参照せず、適当な固定値をa_nameに入れた場合は正常に動作しますか?
Hit01

2018/05/26 13:36

はいa_nameがリセットされます。固定値をa_nameに入れた場合はちゃんと保存されますが、EditorでClassAを参照していた場合はスタート時に同じようにリセットされます。
sakura_hana

2018/05/27 04:35

値をセットしているプログラムを見ないことには何とも言えなさそうなので提示をお願いします。(Play時に初期値に戻るというよりも「再度参照している(その時に指定の値が無いと見なされ初期値になっている?)」ような気がしますが)
guest

回答1

0

自己解決

自己解決しました。

PopUpに使っているListからIndexOfで現在選択している要素を番号を取得していたのですが、この処理をまとめて独自クラスで管理していたのがまずかったようです。
それぞれのEditorに直接書き込んであげたら問題無く動作しました。
独自クラスはStaticなClassで管理していたので、ゲームをプレイした際に独自クラスが強制的に読み込まれ、その内容がEditor側でも影響を受けたのだと思います。

投稿2018/05/27 21:21

Hit01

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問