C# Can';t更改附加到游戏对象的脚本上的公共变量。值在播放时恢复

C# Can';t更改附加到游戏对象的脚本上的公共变量。值在播放时恢复,c#,unity3d,gameobject,C#,Unity3d,Gameobject,这是我的第一个问题。我找不到关于这个话题的任何东西 我想创建一个编辑器脚本,用于更改附加到游戏对象的脚本中的许多公共布尔值 我将此脚本附加到游戏对象。游戏对象是一个预设: using UnityEngine; using System.Collections; public class ScriptWithPublicBools : MonoBehaviour { public bool b1; public bool b2; } 这是我的编辑器脚本: using Unit

这是我的第一个问题。我找不到关于这个话题的任何东西

我想创建一个编辑器脚本,用于更改附加到游戏对象的脚本中的许多公共布尔值

我将此脚本附加到游戏对象。游戏对象是一个预设:

using UnityEngine;
using System.Collections;

public class ScriptWithPublicBools : MonoBehaviour {

    public bool b1;
    public bool b2;
}
这是我的编辑器脚本:

using UnityEngine;
using System.Collections;
using UnityEditor;

public class EditorHelper : ScriptableObject
{
    [MenuItem("Trace/Trace")]
    public static void trace()
    {
        foreach (GameObject g in Selection.gameObjects)
        {
            ScriptWithPublicBools tb = g.GetComponent<ScriptWithPublicBools>();

            if (tb)
            {
                tb.b1 = false;
                tb.b2 = true;
            }
        }
    }
}
使用UnityEngine;
使用系统集合;
使用UnityEditor;
公共类EditorHelper:ScriptableObject
{
[菜单项(“跟踪/跟踪”)]
公共静态无效跟踪()
{
foreach(选择中的游戏对象g.gameObjects)
{
ScriptWithPublicBools tb=g.GetComponent();
如果(tb)
{
tb.b1=假;
tb.b2=真;
}
}
}
}
脚本工作正常,游戏对象上的布尔值在编辑器中设置正确。但当我按下播放按钮时,两个bool的值会切换回脚本应用之前的值

预置的值是什么并不重要,这些值只是在应用编辑器脚本之前恢复为值

我是做错了什么还是一个bug

如果应用编辑器脚本,将场景另存为新场景,并打开新创建的场景,则值也会出错

但是,如果游戏对象不是预制的,那么所有的工作都很完美,并且这些值保持编辑器脚本给出的值,即使在启动游戏模式之后也是如此


因此,只有在使用预置时才会出现问题。

您需要调用
EditorUtility.SetDirty(tb)完成所有更改后,请参阅以了解有关此操作的更多信息


如果您需要更改预制件本身,请查看

+1有趣的预制件,欢迎使用。(游戏对象是一个预设):根据我的理解,场景中的游戏对象是一个预设的实例,而不是预设本身。我是否理解您的理解正确,在这个实例中更改是可见的,但没有应用到预置本身?是的,您理解正确。你是对的,我的场景中的游戏对象是一个预置的实例。编辑器脚本设置的值仅在场景中的游戏对象上应用和可见–它们不应用于预设。但是,当我按下“播放”按钮或保存场景并重新打开时,值不会保存,而是在应用编辑器脚本之前恢复为值。如果我破坏预置实例,则不会发生这种情况。