簡體   English   中英

從 ScriptableObject 引用 class

[英]Reference a class from a ScriptableObject

我有一個EnemyData ScriptableObject 保存有關敵人的數據。 我想在EnemyData上有一個字段,它引用一些關於這個敵人在其回合中如何表現的邏輯(在回合制紙牌游戲中)。 我目前的嘗試是將其構建為 ScriptableObject,基本上是這樣的:

public class EnemyData : ScriptableObject
{
    public int health;
    public EnemyAIBase enemyAI;
}

public abstract class EnemyAIBase : ScriptableObject
{
    public abstract void PlayTurn(Enemy thisEnemy);
}

public class PirateShipAI : EnemyAIBase
{
    public override void PlayTurn(Enemy thisEnemy)
    {
        thisEnemy.Heal();
        AttackPlayer();
    }
}

舉個例子,我有一個 EnemyData 類型的“ EnemyData ”資產,其敵人AI 字段指向 PirateShipAI 類型的“ PirateShipAI ”資產。

但這感覺不對,每次我編寫一個新敵人的 AI 時,我都必須實例化一個資產,以便它可以被EnemyData引用。 我覺得EnemyAIBase甚至不應該是一個 SO,它不像它有任何變量會被不同的資產覆蓋。 EnemyData資產和該敵人的自定義 AI 之間將存在一對一的映射。 所以這個 SO 只是一些邏輯的容器,感覺不對。 但我不知道在我的EnemyData SO 中引用該邏輯的任何其他方式。

我想我希望 SO 可以直接引用 C# class ,但我認為這是不可能的。

一種選擇是我可以構建一個編輯器,將EnemyData資產隱藏為EnemyAI資產的子資產,就像我在這里所做的那樣: 為嵌套的 ScriptableObjects 構建一個編輯器以在紙牌游戲中組合能力

但這感覺真的不對,因為我不打算讓任何這種人工智能通用。

如何將行為/邏輯附加到 ScriptableObject?

您確實可以簡單地使其不是ScriptableObject 要定義不同的行為,我會在這里使用泛型

public abstract class EnemyData<T> : ScriptableObject where T : EnemyAIBase
{
    public int health;
    public T enemyAI;
}

public abstract class EnemyAIBase
{
    public abstract void PlayTurn(Enemy thisEnemy);
}

然后從這些創建您的實際實現

[CreateAssetMenu]
public class PirateShip : EnemyData<PirateShipAI>{ }

public class PirateShipAI : EnemyAIBase
{
    public override void PlayTurn(Enemy thisEnemy)
    {
        thisEnemy.Heal();
        AttackPlayer();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM