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