c# - 如何以更有效的方式管理统一脚本?
问题描述
目前我正在开发自己的 Unity 项目。当我的项目变得更大时,我开始意识到让每个组件都有自己的生命周期是多么可怕。
例如,我不知道一个组件是否需要获取另一个仅在Start
方法中初始化的组件,而该组件在方法中引发了此调用Awake
。这将是一场噩梦。
所以我创建了一个名为 IController 的接口,并拥有它所固有的所有控制组件以及重写父方法。然后我在中央控制器中管理它们。它看起来像这样:
Public class CentralController{
Public NPCController npcController;
Public MusicController musicController;
Public CharacterController characterController;
Public List<IController> controllers;
Public void Awake(){
if (npcController != null)
controllers.Add(npcController);
if (musicController !=null)
controllers.Add(musicController);
if (characterController != null)
controllers.Add(characterController);
}
Public void Update(){
foreach (IController controller in controllers)
{
controller.Update();
}
}
}
我为每个控制器添加一个引用,因为我想通过检查器分配它们。但是这似乎有点愚蠢,因为每次向系统添加新控制器时我都需要更改唤醒方法,同时违反了打开关闭原则。
我应该怎么做才能使脚本可扩展?
解决方案
我完全理解你的痛苦,我去过那里。为了保持代码的可维护性和可重用性,我建议您遵循 SOLID 原则:S - 单一职责,一个类应该只需要担心一个系统。O - Open/Close原则,每个类都应该对扩展开放,对修改关闭,这意味着对类的特定行为形式使用继承和多态。L - Liskov 的替换原则,它指导我们什么时候使用继承,什么时候不使用继承。I - 接口隔离。D - 依赖倒置,这意味着对依赖使用抽象。以下是关于 SOLID 的精彩 Unity 演讲的链接: https ://www.youtube.com/watch?v=eIf3-aDTOOA
除此之外,您需要保持系统松散耦合以实现可重用性,因为您可以使用观察者模式(使用操作或事件和委托)。
在项目的初始阶段创建符合 SOLID 的架构确实需要付出努力,但随着项目规模的扩大,这种努力确实会得到回报。
我不建议您直接开始使用 DOTS。DOTS 并不适用于每个项目,它需要同时完成各种任务,因此需要相应地对代码进行矢量化。
推荐阅读
- elasticsearch - 根据嵌套数组中的字段对结果进行排名
- xamarin.android - Visual Studio Mac 部署到 Android 模拟器失败
- python - 在 python 中合并 2 个链表不起作用。创建的第三个链接列表在执行后给了我一个 NULL 值/结果
- typescript - NestJS DTO 扩展了 PartialType 中断验证
- mongodb - Mongodb query starts with inside $in Query
- r - R 新手和编程新手 - 将向量的所有值融合为一个值
- c++ - Codeforces 关于二进制提升和 LCA 的问题
- python-3.x - 错误:只能将 str(不是“int”)连接到 str
- c# - .Net核心,使用
- ubuntu-12.04 - Windows 子系统 WSL Ubuntu 升级 18.04 到 20.04 问题