unity3d 如何使用ScriptableObject中的脚本?

qf9go6mv  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(169)

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

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

5uzkadbs1#

正如您所意识到的,您不能将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;
}

cbjzeqam

cbjzeqam2#

可脚本化对象是一个数据容器。素材或灯光设置都是可脚本化对象。您可以将它们保存为资源并将它们用作其他脚本的设置,但不能将它们附加到GameObjects. Read more here
若要在资源浏览器中创建ScriptableObjects,需要在开始类之前添加以下内容。

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

若要将它们添加到脚本,请使用public Cards cards;,然后可以将它们从资源浏览器拖到检查器中的脚本。
你唯一可以添加到游戏对象的是单一行为

相关问题