在 Unity3d Inspector 中引用可编写脚本的对象 属性
Reference Scriptable Object property in Unity3d Inspector
我正在尝试为我在 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(或 copy/paste)。但我担心的是,随着我创建越来越多的资产,我会开始犯错误。我想要的是能够打开一个对象 select 或只是 select 我想要其 ID 的资源资产。
我认为 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;
}
}
}
我正在尝试为我在 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(或 copy/paste)。但我担心的是,随着我创建越来越多的资产,我会开始犯错误。我想要的是能够打开一个对象 select 或只是 select 我想要其 ID 的资源资产。
我认为 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;
}
}
}