【问题标题】:Unity resets parameter value set with Editor script on playUnity 在播放时重置使用编辑器脚本设置的参数值
【发布时间】:2021-01-24 15:52:33
【问题描述】:

我在 Unity 2020.2.1f1 中设置了一个非常简单的编辑器脚本,当按下 Inspector 按钮时,它应该将指定参数的值更改为代码中设置的值。

public override void OnInspectorGUI()
{
    DrawDefaultInspector();

    StateObject s = (StateObject)target;
    if (s.objID == 0)
    {
        if (GUILayout.Button("Generate Object ID"))
        {
            GenerateID(s);
        }
    }
}

public void GenerateID(StateObject s)
{
    s.objID = DateTimeOffset.Now.ToUnixTimeSeconds();
}

这一切都像它应该的那样工作。我按下按钮,正确的数字出现在字段中,我很高兴。但是,一旦我切换到播放模式,该值会重置为预设默认值,并且即使我关闭播放模式也会保持这种状态。

我是否缺少一些 ApplyChange 功能或其他什么?

【问题讨论】:

    标签: c# unity3d unity-editor


    【解决方案1】:

    在我看来,这比混合从编辑器脚本直接访问然后手动标记脏东西要好,而不是通过 SerializedProperty 并让 Inspector 处理这一切(还有标记脏和保存更改、处理撤消/重做等)

    SerializedProperty id;
    
    private void OnEnable()
    {
        id = serializedObject.FindProperty("objID");
    }
    
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
    
        // Loads the actual values into the serialized properties
        // See https://docs.unity3d.com/ScriptReference/SerializedObject.Update.html
        serializedObject.Update();
    
        if (id.intValue == 0)
        {
            if (GUILayout.Button("Generate Object ID"))
            {
                id.intValue = DateTimeOffset.Now.ToUnixTimeSeconds();
            }
        }
    
        // Writes back modified properties into the actual class
        // Handles all marking dirty, undo/redo, etc
        // See https://docs.unity3d.com/ScriptReference/SerializedObject.ApplyModifiedProperties.html
        serializedObject.ApplyModifiedProperties();
    
    }
    

    【讨论】:

    • 谢谢!我发现了类似的东西,但并不完整。我试过了,但没有用。您的示例确实有效!再次感谢!
    【解决方案2】:

    (编辑:这可行,但不如公认的答案。)

    嗯,是的,我实际上缺少某种 ApplyChange 函数。

    我不知道我是怎么错过的,但我一直在寻找这个:

    EditorUtility.SetDirty(target);
    

    所以,在我的脚本中,我只需编辑 GenerateID 函数:

    public void GenerateID(StateObject s)
    {
        s.objID = DateTimeOffset.Now.ToUnixTimeSeconds();
        EditorUtility.SetDirty(s);
    }
    

    我将它发布在这里以防万一有人遇到同样的问题,这样他们希望在被提醒 SetDirty 是一件事之前不必花费太多时间寻找解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2020-03-24
      • 2020-08-24
      • 2022-08-16
      相关资源
      最近更新 更多