在Unity编辑器中创建可编写脚本的对象

15

显然我在大学里不擅长听课,因为我甚至无法通过谷歌弄清楚这个问题...如何在编辑器中创建可编写脚本的对象? 我已经打开了项目,看起来像这样:

enter image description here

点击创建按钮,就像您想要创建文件夹、C#脚本或其他任何内容一样。

enter image description here

从弹出菜单中选择ScriptableObject。

enter image description here

在选择脚本后,获取此面板并完成对象。

问题是:我没有ScriptableObject按钮。我有一个脚本是ScriptableObject(为了确保我甚至复制了大学项目中的脚本)。我重新启动了Unity,检查是否安装了任何软件包(没有),并进行了相当多的谷歌搜索。但我似乎无法使其工作...

我需要先安装或添加什么吗? 提前感谢!


你看过这个教程吗?https://unity3d.com/fr/learn/tutorials/modules/beginner/live-training-archive/scriptable-objects - Nerevar
我当时在后台看着它(因为它有一个小时那么长),就在我发完这个帖子的时候,解释出现了。它的工作方式与大学项目不同,但它可以工作(在类上方使用[CreateAssetMenu()])。有趣的是,大学项目并没有这样做,但对他们来说也能正常工作。 - Yiasmat
2个回答

34

你需要另一个脚本来添加按钮,该按钮将从该可编程对象创建实例。类似这样的内容。

using UnityEngine;
using System.Collections;
using UnityEditor;

public class MakeScriptableObject {
    [MenuItem("Assets/Create/My Scriptable Object")]
    public static void CreateMyAsset()
    {
        MyScriptableObjectClass asset = ScriptableObject.CreateInstance<MyScriptableObjectClass>();

        AssetDatabase.CreateAsset(asset, "Assets/NewScripableObject.asset");
        AssetDatabase.SaveAssets();

        EditorUtility.FocusProjectWindow();

        Selection.activeObject = asset;
    }
}

你可以在 Unity 网站上查看Scriptable Objects 入门教程


13
可以通过在类上方添加[CreateAssetMenu()]来更快地完成此操作(这将自动化上述代码)。非常感谢!这让我感到疯狂...有趣的是,我打开的大学项目既没有CreateAssetMenu,也没有上面的代码...但我很高兴现在它可以工作了! - Yiasmat
4
@Yiasmat,这并不完全相同。[CreateAssetMenu()]无法让您在创建过程中运行自己的代码,例如为SO分配唯一ID。 - John Stock

6
我不能评论,所以只能像回答一样放置它: 不要忘记使用UnityEditor.AssetDatabase.GenerateUniqueAssetPath,因为简单的AssetDatabase.CreateAsset可能会删除您的数据:
using UnityEngine;
using System.Collections;
using UnityEditor;

public class MakeScriptableObject
{
    [MenuItem("Assets/Create/My Scriptable Object")]
    public static void CreateMyAsset()
    {
        MyScriptableObjectClass asset = ScriptableObject.CreateInstance<MyScriptableObjectClass>();

        string name = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/NewScripableObject.asset");
        AssetDatabase.CreateAsset(asset, name);
        AssetDatabase.SaveAssets();

        EditorUtility.FocusProjectWindow();

        Selection.activeObject = asset;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接