【问题标题】:object name is not saved after scene reload场景重新加载后不保存对象名称
【发布时间】:2021-12-24 06:20:49
【问题描述】:

我有一个更改对象名称的简单脚本,但更改场景时不会记住更改的名称。

public class MyBehaviour : MonoBehaviour
{
#if UNITY_EDITOR
    private void OnValidate()
    {
        if (!this.name.Contains("_")) 
        {
            this.name = $"{this.name}_{this.GenUID()}";
        }
    }
#endif
}

如何在Edit-Mode 中保存通过脚本所做的更改?

【问题讨论】:

标签: unity3d unity-editor unity3d-editor


【解决方案1】:

您必须将对象标记为脏,以便在按下 CTRL+S 时将其保存

EditorUtility.SetDirty

当您想修改对象而不创建撤消条目时,可以使用 SetDirty,但仍要确保更改已注册且不会丢失。如果对象是场景的一部分,则场景被标记为脏。

public class MyBehaviour : MonoBehaviour
{
#if UNITY_EDITOR
    private void OnValidate()
    {
        if (!this.name.Contains("_")) 
        {
            this.name = $"{this.name}_{this.GenUID()}";
            EditorUtility.SetDirty(this);
        }
    }
#endif
}

另请注意

如果对象可能是 Prefab 实例的一部分,您还需要调用 PrefabUtility.RecordPrefabInstancePropertyModifications 以确保创建 Prefab 覆盖。

如果你还想支持撤消/重做

如果您确实想支持撤消,则不应调用SetDirty,而应在更改对象之前使用Undo.RecordObject,因为这会将对象标记为脏(或对象的场景,如果它是一部分场景)并在编辑器中提供撤消条目。如果对象可能是 Prefab 实例的一部分,您仍然应该调用 PrefabUtility.RecordPrefabInstancePropertyModifications。

【讨论】:

  • 谢谢,但它不起作用,它仍然会在场景重新加载后生成一个新名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2016-12-04
相关资源
最近更新 更多