簡體   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