【问题标题】:Unity ScriptableObjects - Read-only fieldsUnity ScriptableObjects - 只读字段
【发布时间】:2022-11-01 18:10:57
【问题描述】:

假设我有一个 ScriptableObject 项:

public class Item : ScriptableObject
{
    public new string name;
    public string description;
    public Sprite sprite;
}

唯一的问题是可以修改字段:

Item item = new Item();
item.description = "Overwrite";

我希望它们是只读的。我使用属性找到了这个解决方法:

public class Item : ScriptableObject
{
    [SerializeField] private new string name;
    [SerializeField] private string description;
    [SerializeField] private Sprite sprite;

    public string Name => name;
    public string Description => description;
    public Sprite Sprite => sprite;
}

唯一的问题是这有效地使我所有的 ScriptableObjects 的长度加倍并且看起来很麻烦。是否有另一种首选方法可以使 ScriptableObject 字段只读而不需要额外的代码并且仍然序列化字段?

【问题讨论】:

  • 你拥有它的方式是统一编写它的最短方式。

标签: unity3d properties scriptable-object


【解决方案1】:

您可以使用Field-Targeted Attributes

public class Item : ScriptableObject{
    [field: SerializeField] public string Name { get; private set; }
    [field: SerializeField] public string Description { get; private set; }
    [field: SerializeField] public Sprite Sprite { get; private set; }
}

【讨论】:

    【解决方案2】:

    您可以直接将字段初始化为属性并将get 方法添加到其中。 set 方法默认设置为private set;。它限制对属性的任何外部修改。这些属性可以是 set 私有的,即它们可以在脚本中访问和修改。

    public string Name { get; }
    public string Description { get; }
    public Sprite SpriteObj { get; }
    

    笔记:属性的命名约定是以大写字母开头。将属性名称更改为SpriteObj,使其不会与内置组件名称冲突。

    【讨论】:

      【解决方案3】:

      不要直接使用原始的可脚本化对象,使用它的运行时副本来防止原始值被修改。

      您可以使用 ScriptableObject.CreateInstance(Type your_so)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-20
        相关资源
        最近更新 更多