首页 > 解决方案 > 如何以更有效的方式管理统一脚本?

问题描述

目前我正在开发自己的 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();
           }
    }
}

我为每个控制器添加一个引用,因为我想通过检查器分配它们。但是这似乎有点愚蠢,因为每次向系统添加新控制器时我都需要更改唤醒方法,同时违反了打开关闭原则。

我应该怎么做才能使脚本可扩展?

标签: c#unity3ddesign-patterns

解决方案


我完全理解你的痛苦,我去过那里。为了保持代码的可维护性和可重用性,我建议您遵循 SOLID 原则:S - 单一职责,一个类应该只需要担心一个系统。O - Open/Close原则,每个类都应该对扩展开放,对修改关闭,这意味着对类的特定行为形式使用继承和多态。L - Liskov 的替换原则,它指导我们什么时候使用继承,什么时候不使用继承。I - 接口隔离。D - 依赖倒置,这意味着对依赖使用抽象。以下是关于 SOLID 的精彩 Unity 演讲的链接: https ://www.youtube.com/watch?v=eIf3-aDTOOA

除此之外,您需要保持系统松散耦合以实现可重用性,因为您可以使用观察者模式(使用操作或事件和委托)。

在项目的初始阶段创建符合 SOLID 的架构确实需要付出努力,但随着项目规模的扩大,这种努力确实会得到回报。

我不建议您直接开始使用 DOTS。DOTS 并不适用于每个项目,它需要同时完成各种任务,因此需要相应地对代码进行矢量化。


推荐阅读