[英]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.