【问题标题】:Reference Scriptable Object property in Unity3d Inspector在 Unity3d Inspector 中引用 Scriptable Object 属性
【发布时间】:2016-01-22 20:55:40
【问题描述】:

我正在尝试为我在 Unity3d 中构建的策略游戏构建一些内容。我目前正在使用 Scriptable Objects 来创建资产,但是在链接资产时遇到了我想要的问题。

让我用一些代码给出一个适当的例子。假设我有一座接受资源的建筑物。所以我可能会让我的构建 SCO 看起来像:

public class buildingSCO : ScriptableObject {
    public string Name;
    public string ID;
    public string Res;
}

我的资源 SCO 看起来像:

public class resourceSCO : ScriptableObject {
    public string Name;
    public string ID;
}

因此,当我为建筑物创建资产时,我会手动输入资源的 ID(或复制/粘贴)。但我担心的是,随着我创建越来越多的资产,我会开始犯错误。我想要的是能够打开一个对象选择器并选择我想要的资源资产。

【问题讨论】:

  • 您是否可以编辑和缩短您的问题?例如,完全消除前 3 个句子

标签: unity3d unity3d-editor


【解决方案1】:

我认为 Unity 不会创建您的 SCO 的副本和副本。只需按照 Unity 想要的方式引用它们,就可以了。

public class buildingSCO : ScriptableObject
{
    public string Name;
    public string ID;
    public resourceSco Res;
}

优化的第一条规则:不要优化。

如果您真的,真的需要使用 Id 和查找,您可以通过创建自定义检查器来做到这一点。

[CustomEditor(typeof(buildingSCO))]
public class BuildingSCOInspector : Editor
{
    public override void OnInspectorGUI()
    {
        buildingSCO building = target as buildingSCO;

        building.Name = EditorGUILayout.TextField("Name", building.Name);
        building.ID = EditorGUILayout.TextField("ID", building.ID); // or whatever

        // this only shows currently selected resourceSCO.ID
        EditorGUILayout.LabelField("Res (current)", building.Res);

        // this allows selection of another resourceSCO
        resourceSCO resource = EditorGUILayout.ObjectField("Res", null, typeof(resourceSCO), false) as resourceSCO;
        if (resource != null)
        {
            building.Res = resource.ID;
        }
    }
}

【讨论】:

  • 我要检查你的自定义编辑器,我想这可能是我要找的。我刚刚重新阅读了我的问题,我可以看到您认为我在哪里担心多个副本。我会尽量解决这个问题。
  • 自定义编辑器正是我想要的。代码存在一些问题(例如 OnInspectorGUI 签名需要被公共覆盖),因此我将对您发布的内容进行快速编辑。这将帮助我确保不会输入错误的 ID。
猜你喜欢
  • 2013-01-28
  • 2011-06-03
  • 2020-02-01
  • 2023-03-29
  • 1970-01-01
  • 2015-11-12
  • 2011-08-09
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多