2017-09-11 13 views
1

Unityのデフォルトインスペクタの問題を解決するカスタムインスペクタを作成しています。私のシステムでは、リフレクションと属性を使用してカスタマイズ可能なインスペクタを描画します。 playmodeを入力せずにインスタンスを変更すると正常に動作します。問題は、エディタが私のオブジェクトに加えた変更を見ないように見えることです。これは通常の方法で確認できます。インスペクタの変更された値についてユニティに通知する

  • 再生時にインスタンスがリセットされます。
  • エディタでインスタンスをリセットし直します。

エディタでシーンを保存するのに約1秒かかり、その間にカーソルが変化します。これは、MonoBehaviour(f.e. RigidBody)の値を変更した後にシーンを保存することでトリガーできます。

自分のインスペクタを使用して値を変更してシーンを保存しても、実際の保存プロセス(視覚的手がかりはありません)は発生しません。 Unityが変更がないと考えているかのように。

ゲームオブジェクト私はインスペクタで修正したいと思います:

[EnableIR] 
public class CustomerSpawn : MonoBehaviour 
{ 
    [Inspect(InspectionKind.DropableObject)] 
    public GameObject CustomerPrefab; // This field resets to null on play. 
} 

私はリフレクションを使用して値と参照を変更するPropertyInfo.SetValueまたはFieldInfo.SetValueを使用しています。 変更についてUnityに通知するために呼び出す必要のあるメソッドはありますか?

リンク:私のカスタムインスペクタを含む

答えて

1

SetValueを検索する)と私は解決策は、(基本的には何もありません)それが現在持っているよりも、ウェブでの多くの存在に値すると考えています。代わりに使用する必要があり

// `target` is the object you are currently inspecting. 
EditorUtility.SetDirty((UnityEngine.Object)target); 

@ProgrammerEditorSceneManager.MarkSceneDirtyによってコメントで述べたように:一つの解決策は、insanceが変更されたことをUnityに知らせるためにEditorUtility.SetDirtyを呼び出すことです。これはthe docsにも記載されていますが、理由や説明はありません。

+0

これは奇妙です。 [The docs](https://docs.unity3d.com/ScriptReference/EditorUtility.SetDirty.html)は、何か別のことをし、5.3以降の 'Undo.RecordObject'を使用するように読者に知らせる' EditorUtility.SetDirty'について説明しています。 'Undo.RecordObject'は私のために何もしません。すべてのエキスパート体験:-) –

+1

代わりに 'EditorSceneManager.MarkSceneDirty'を使う必要があります。それを試して、何が起こるかを見てください。現在のシーンを渡してください。 – Programmer

+0

@Programmerそれはうまくいくように思われ、おそらくもっと良いことです。 –

関連する問題