繁体   English   中英

如何使用 ScriptableObject 中的脚本?

[英]How do I use a script that is in my ScriptableObject?

我正在创建一个系统,其中我的卡在 ScriptableObject 中,但每张卡都有一个唯一的 function。 我想到的是为每个从“技能”继承的技能创建一个新的 class 。 所以我把这个脚本为我的 ScriptableObject 中的每个字母,但现在我试图访问它但我不能,因为我不能使用 AddComponent。

public class Cards : ScriptableObject
{
    public Sprite cardSprite;
    public int cardAttack;
    public int cardHealth;
    public int cardCost;
    public Object cardAbility;
}

可编写脚本的 object 是一个数据容器。 材质或照明设置是可编写脚本的对象。 您可以将它们保存为资产并将它们用作其他脚本的设置,但不能将它们附加到 GameObjects。 在这里阅读更多

要在资产浏览器中创建 ScriptableObjects,您需要在 class 开始之前添加以下内容。

[CreateAssetMenu(fileName = "DefaultFileName", menuName = "ScriptableObjects/NameOfYourObjects", order = 1)]

要将它们添加到脚本中,请使用public Cards cards; 然后您可以将它们从资产浏览器拖到检查器中的脚本。

唯一可以添加到游戏对象的东西是 MonoBehaviors

正如您所意识到的,您不能将 AddComponent 与 ScriptableObjects 一起使用,因为它只能用于将组件附加到 GameObjects。

然而,ScriptableObjects 确实支持类似于主资产和子资产的概念。

您可以使用 AssetDatabase.AddObjectToAsset 添加新的子资产,它们将在项目视图中的主资产下方显示为嵌套的子资产。

public abstract class Skill : ScriptableObject
{
#if UNITY_EDITOR
    protected static void AddToCard<TSkill>(MenuCommand command) where TSkill : Skill
    {
        Card card = (Card)command.context;
        TSkill skill = CreateInstance<TSkill>();
        skill.name = skill.GetType().Name;
        card.skill = skill;
        string path = AssetDatabase.GetAssetPath(card);
        AssetDatabase.AddObjectToAsset(skill, path);
        AssetDatabase.ImportAsset(path);
    }

    [MenuItem("CONTEXT/Card/Remove Skill")]
    protected static void RemoveSkill(MenuCommand command)
    {
        Card card = (Card)command.context;
        string path = AssetDatabase.GetAssetPath(card);
        Skill skill = AssetDatabase.LoadAssetAtPath<Skill>(path);
        AssetDatabase.RemoveObjectFromAsset(skill);
        AssetDatabase.ImportAsset(path);
    }
#endif
}

using UnityEditor;
using UnityEngine;

[CreateAssetMenu]
public class ExampleSkill : Skill
{
#if UNITY_EDITOR
    [MenuItem("CONTEXT/Card/Add Skill/Example Skill")]
    private static void AddToCard(MenuCommand command) => AddToCard<ExampleSkill>(command);
#endif
}

using UnityEngine;

[CreateAssetMenu]
public class Card : ScriptableObject
{
    public Skill skill;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM