在检查器中通知Unity有关修改后的值

时间:2017-09-11 13:57:40

标签: c# unity3d serialization reflection

我正在编写一个自定义检查器来解决我在Unity默认检查器中遇到的问题。我的系统使用反射和属性来绘制可自定义的检查器。 在不输入playmode的情况下修改实例工作正常。问题是,编辑器似乎没有看到我对对象所做的更改。这可以通过常规方式观察:

  • 实例重置播放。
  • 重新打开编辑器时重置实例。

我的编辑器需要大约一秒钟来保存场景,并且光标会在此期间发生变化。这可以通过在更改任何MonoBehaviour(f.e。RigidBody)中的某些值后保存场景来触发。

使用我自己的检查器并修改值,然后保存场景不会触发实际的保存过程(没有视觉线索)。 好像Unity认为没有变化。

GameObject我想在检查员中修改:

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

我使用PropertyInfo.SetValueFieldInfo.SetValue来修改使用Reflection的值和引用。 我们需要调用一些方法来通知Unity有关更改吗?

链接:

1 个答案:

答案 0 :(得分:1)

我自己想出来了,我相信这个解决方案在网络上应该比现在更多(基本上没有)。一种解决方案是致电EditorUtility.SetDirty以通知Unity已修改该项目:

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

正如@Programmer EditorSceneManager.MarkSceneDirty的评论中所提到的,应该使用。这在the docs中也有提及,但它们没有提供理由或解释。