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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

3743閲覧

【Unity】EditorWindowからシーン上のプレハブの値を変更しても再生時に破棄される

i_zna

総合スコア198

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2017/05/22 11:34

編集2017/05/22 11:36

①シーンに配置されたプレハブにスクリプトをアタッチ
②スクリプトの変数をEditorWindowから変更する(シーンは再生中ではない)

この操作をしても、変更された値がシーンの再生開始時に破棄され、プレハブの値に戻されてしまいます。

インスペクタから手動で変更した場合は正しく保持されます。これはなぜでしょうか。
変更をEditorWindowから保存する方法はありますか?

以下のスクリプトで再現できます。
ご回答よろしくお願いします。
Unity5.6.1f1

C#

1//TestObjectという名前のオブジェクトにアタッチ、プレハブ化してください 2using UnityEngine; 3 4public class TestClass : MonoBehaviour { 5 public string hensu="編集前"; 6 7 void Start(){ 8 Debug.Log(hensu); 9 } 10} 11

C#

1using UnityEngine; 2using UnityEditor; 3 4public class TestWindow : EditorWindow 5{ 6 [MenuItem ("Window/TestWindow")] 7 8 public static void ShowWindow () { 9 EditorWindow.GetWindow(typeof(TestWindow)); 10 } 11 12 void OnGUI () { 13 if( GUI.Button ( new Rect(10,10,200,50), "テスト") ){ 14 GameObject G = GameObject.Find("TestObject"); 15 TestClass T=G.GetComponent<TestClass>(); 16 T.hensu="編集後"; 17 } 18 } 19}

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

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

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

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

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

guest

回答2

0

5.6.0f3でのテストです.
EditorUtility.SetDirty()を使用すると変更が適用されます。
Bongoさんのおっしゃる通り変更後に取り消しも行えるようにするとよいかもしれません。
Unityリファレンス

C#

1using UnityEditor; 2 3public class TestWindow : EditorWindow 4{ 5 [MenuItem ("Window/TestWindow")] 6 7 public static void ShowWindow () { 8 EditorWindow.GetWindow(typeof(TestWindow)); 9 } 10 11 void OnGUI () { 12 13 if ( GUI.Button ( new Rect(10,10,200,50), "テスト") ){ 14 GameObject G = GameObject.Find("TestObject"); 15 TestClass T=G.GetComponent<TestClass>(); 16 T.hensu="編集後"; 17 18 EditorUtility.SetDirty( T ); // ここ. 19 } 20 }

投稿2017/05/23 10:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

i_zna

2017/05/23 12:56

試したところ、どちらでも問題は解決しました! ダーティーフラグをよく知らずにアセットにあるプレハブ自体を更新する関数かと思ってました… お二方とも素晴らしい回答をありがとうございました。
guest

0

ベストアンサー

5.4.0f3でやってみましたが、確かにTestObjectが通常のゲームオブジェクトだとhensuが変更されるのに、プレハブのインスタンスだと一見変更されたように見えても、再生時には元に戻っていますね...
独自のエディタ製作には疎いのですが(というよりUnity自体に疎いのですが)、TestClassの状態を変化させる前にUndo.RecordObjectを入れて、変更履歴を記録させるとどうでしょうか。

参考:Unity - Scripting API: Undo.RecordObject

C#

1using UnityEngine; 2using UnityEditor; 3 4public class TestWindow : EditorWindow 5{ 6 [MenuItem ("Window/TestWindow")] 7 8 public static void ShowWindow () { 9 EditorWindow.GetWindow(typeof(TestWindow)); 10 } 11 12 void OnGUI () { 13 if( GUI.Button ( new Rect(10,10,200,50), "テスト") ){ 14 GameObject G = GameObject.Find("TestObject"); 15 TestClass T=G.GetComponent<TestClass>(); 16 Undo.RecordObject(T, "Changed hensu"); 17 T.hensu="編集後"; 18 } 19 } 20}

変更後に変更を取り消せるようになるという利点もありそうですね。
あくまでも想像ですが、スクリプトからオブジェクトの変数が変更されたことを(オブジェクトが「ダーティー」状態になったことを)Unityが正しく認識できていなかったのでしょうか?
上のスクリプト修正案についても、これだけで目的を達せられるのかは自信がありません(何か見落としがあるかもしれません)。このあたりの挙動については、もっと詳しい方のご意見をうかがいたいところです。

投稿2017/05/22 22:09

Bongo

総合スコア10807

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

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

i_zna

2017/05/23 12:56

試したところ、どちらでも問題は解決しました! おかげでUndoも効くようになってとても良い感じです! お二方とも素晴らしい回答をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問