无法更改附加到游戏对象的脚本上的公共变量。值在播放时恢复。

5
这是我的第一个问题。在这个主题上我找不到任何东西。
我想创建一个编辑器脚本,可以更改附加到GameObject上的脚本中的多个公共布尔值。
我已经将此脚本附加到了一个GameObject上,该GameObject是一个预制件:
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;
            }
        }
    }
}

脚本运行良好,游戏对象上的布尔值在编辑器中设置正确。但是当我按下PLAY按钮时,这两个布尔开关的值会恢复到应用脚本之前的值。
无论prefab的值如何,这些值都只会恢复到应用编辑器脚本之前的值。
我是否做错了什么,还是这是一个bug?
如果我应用编辑器脚本,将场景保存为新场景,并打开新创建的场景,则这些值也是错误的。
但是,如果GameObject不是prefab,则所有内容都可以完美地工作,并且这些值保持其由编辑器脚本给出的值,即使在启动播放模式后也是如此。
因此,问题仅在使用prefab时存在。

+1 有趣的问题,欢迎来到SO。 (The GameObject is a prefab): 我的理解是场景中的GameObject是预制件的一个实例,而不是预制件本身。我的理解正确吗?您的更改在此实例中可见,但不会应用于预制件本身,是这样吗? - Kay
是的,你理解得很正确。而且你也对,我的场景中的GameObject是预制体的一个实例。编辑器脚本设置的值只应用于场景中的GameObject,并且在场景中可见 - 它们不会应用于预制体。但是当我按下播放按钮或保存场景并重新打开时,这些值不会被保存,而是恢复到应用编辑器脚本之前的值。如果我打破预制体实例,这种情况就不会发生。 - jake
1个回答

4
你需要在所有更改完成后调用EditorUtility.SetDirty (tb);,请参见EditorUtility.SetDirty以获取更多信息。
如果你需要改变预制本身,请查看PrefabUtility

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接