TLDR:使用 Monobehvaiour 来实现敌人。使用 SO 只是为了设置其数据或实现其部分逻辑。所以最好不要为每个敌人生成一个 SO。您将敌人生成为预制件,并在其预制件中添加一个或多个 SO 来实现合成。
为了理解这一点,我可以解释 SO 的历史,这样您就可以找到所有常用的实现。
第 1 阶段 - 数据容器
最初 SO 是为了存储(非可变)数据。它们可以用作模板。
即,您有一个武器,并且您为每种武器实例化一个武器。
通过这种方式,您可以将武器附加到一个单元上。
public class Attacker : MonoBehaviour
{
public Weapon weapon;
public void Attack(IDamageGetter target) => target.GetDamage(weapon.damage);
}
public interface IDamageGetter
{
void GetDamage(int Damage);
}
[CreateAssetMenu(menuName = "Base Weapon")]
public class Weapon : ScriptableObject
{
public int damage = 5;
}
关于用于数据的 SO 的一些不错的教程如下:使用可编写脚本的对象自定义 UI https://www.youtube.com/watch?v=HkUSmI7F304
第 2 阶段 - SO 组合逻辑
第一阶段之后,有人注意到 https://www.youtube.com/watch?v=6vmRwLYWNRoSO 可以用于许多不同的事情。
许多开发人员开始在 SO 中添加逻辑。
public class AttackerWithLogic : MonoBehaviour
{
public WeaponWithLogic weapon;
public void Attack(IDamageGetter target) => weapon.Attack(target);
}
public abstract class WeaponWithLogic : ScriptableObject
{
public int damage = 5;
public abstract void Attack(IDamageGetter target);
}
这样做可以将大量逻辑与单一行为分离,并将任何逻辑附加到 SO 本身上。
你不会有一个具有 2 个派生类敌人WithAxe 和敌人WithSword 的单一行为敌人。
你将有一个单一行为敌人,并且你可以附加武器斧或武器剑。
本系列教程是理解此逻辑并将事件应用于人工智能的重要来源。带有可编写脚本的对象的可插入人工智能 https://www.youtube.com/watch?v=cHUXh5biQMg
第 3 阶段 - 反应式脚本对象
最后,我们有了使用 Scriptable 对象的新方法,描述如下:团结奥斯汀 2017 https://www.youtube.com/watch?v=raQ3iHhE_Kk.
这比其他想法更先进,并且需要了解观察者模式和 C# 事件系统,但它是使用可编写脚本的对象的好方法。
这可以用作生成器。
[CreateAssetMenu(menuName = "EnemySpawner")]
public class EnemySpawner : ScriptableObject
{
public event Action<Enemy> OnSpawn;
public Enemy enemyPrefab;
public void SpawnEnemyWithSword()
{
var enemy = Instantiate(enemyPrefab);
//..
//code to setup sword
//..
OnSpawn?.Invoke(enemy);
}
public void SpawnEnemyWithAxe()
{
//any other logic with the same event
}
}
SO 非常适合实现 OOP 模式,我仍然不确定新 ECS 的未来会怎样,但我希望他们也能有一席之地。
综上所述
我是 SO 的忠实粉丝,但在某些情况下你想为敌人生成一个 SO。无论如何,SO 不应该在任何地方取代 MonoBehaviours。我会使用 MonoBehaviour 来代表敌人。
如果您仍然需要为每个单一行为拥有一个 SO,您可以在唤醒时使用 ScriptableObject.CreateInstance 创建它们,但在这种情况下,它们与基本可序列化类没有太大区别。
您仍然可以实现 SO 来设置其数据(例如生命值或武器伤害),处理其部分逻辑(例如为每个武器添加效果),或处理生成机制的事件。
我强烈建议您查看我在这里分享的链接。根据您的经验选择从哪里开始,第一阶段的视频更容易,而第三阶段的视频最高级。 (不管怎样,都很简单,只有最后一个需要理解event of c#)