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

Posted

技术标签:

【中文标题】无法更改附加到游戏对象的脚本上的公共变量。值在播放时恢复【英文标题】:Can't change public variables on a script attached to a gameobject. Values are restored upon play 【发布时间】:2012-04-19 10:19:53 【问题描述】:

这是我的第一个问题。没有找到任何关于该主题的内容。

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

我有这个脚本附加到一个游戏对象。 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 按钮时,两个 bool 的值会切换回它们在应用脚本之前的值。

预制件的值是什么无关紧要,这些值只是在应用编辑器脚本之前恢复到值。

我做错了什么还是一个错误?

如果我应用编辑器脚本,将场景另存为新场景,然后打开新创建的场景,值也是错误的。

但是,如果 GameObject 不是预制件,一切都可以完美运行,并且值保持编辑器脚本给出的值,即使在启动播放模式后也是如此。

所以问题只有在使用预制件时才会出现。

【问题讨论】:

+1 有趣的,欢迎来到 SO。 (游戏对象是预制件):根据我的理解,场景中的游戏对象是预制件的实例,而不是预制件本身。我是否理解正确,这些更改在此实例中是可见的,但并未应用于预制件本身? 是的,你正确理解了我的意思。你是对的,我场景中的 GameObject 是预制件的一个实例。编辑器脚本设置的值仅在场景中的游戏对象上应用和可见——它们不会应用到预制件上。但是当我按下 PLAY 按钮或保存场景并重新打开时,这些值不会保存,而是在应用编辑器脚本之前恢复为值。如果我破坏预制实例,这不会发生。 【参考方案1】:

您需要在所有更改完成后致电EditorUtility.SetDirty (tb);,有关更多信息,请参阅EditorUtility.SetDirty。

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

【讨论】:

以上是关于无法更改附加到游戏对象的脚本上的公共变量。值在播放时恢复的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的非静态游戏对象在场景重新加载后会在脚本中丢失其引用?

Unity 脚本中公共变量初始化值修改后,为啥Inpector面板的对应变量属性不更新?

无法快速将对象附加到对象数组

如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?

Unity何时调用Inspector初始化

在 object.instantiate (Unity) 之后音频不会立即播放