Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以更有效的方式管理unity脚本?_C#_Unity3d_Design Patterns - Fatal编程技术网

C# 如何以更有效的方式管理unity脚本?

C# 如何以更有效的方式管理unity脚本?,c#,unity3d,design-patterns,C#,Unity3d,Design Patterns,目前我正在开发自己的Unity项目。当我的项目变得越来越大时,我开始意识到让每个组件都有自己的生命周期是多么可怕 例如,我不知道一个组件是否需要为另一个只在Start方法中以首字母开头的组件提取,而这个组件在Awake方法中引发这个调用。那将是一场噩梦 因此,我创建了一个名为IController的接口,并通过重写父方法使其固有的所有控制组件。然后我在中央控制器中管理它们。看起来是这样的: Public class CentralController{ Public NPCControl

目前我正在开发自己的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();
           }
    }
}
公共类中央控制器{
公共NPC控制器NPC控制器;
公共音乐控制器音乐控制器;
公共字符控制器字符控制器;
公开名单控制人;
公共图书馆{
如果(npcController!=null)
控制器。添加(NPC控制器);
if(musicController!=null)
控制器。添加(musicController);
if(characterController!=null)
控制器。添加(characterController);
}
公共无效更新(){
foreach(控制器中的IController控制器)
{
controller.Update();
}
}
}
我为每个控制器添加一个引用,因为我想通过检查器分配它们。然而,这似乎有点愚蠢,因为每次向系统添加新控制器时,我都需要更改唤醒方法,同时违反了开-关原则


我应该怎么做才能使脚本具有可伸缩性?

对于您的问题,我没有一个具体的答案,因为对于这种情况,没有简单的解决方法。这是其中一种情况,应该是特定于项目的,甚至在编码阶段开始之前就应该仔细考虑。 只要有一点耐心,每个人都可以拿出健壮的框架,只要他们稍作停顿,不要害怕后退,什么都不做(代码方面的),这将为自己带来回报,100%肯定。 Unity项目,就像任何其他裸骨项目一样,应该基于精心设计的框架构建,一切都安排得非常完美,然后才开始使用Unity脚本库。有时(特别是对于大型项目),您应该从C#开始,构建框架,然后小心地将其与Unity引擎连接起来,因为许多Unity方法(如更新、启动和唤醒)都是危险的地方,可能会破坏性能,并且管理它们变得很麻烦。(他们为方便使用而建造。)

在我看来,如果你想考虑组件(传统的统一编程风格)并构建一个大型游戏,无论如何都会是一个大混乱


我有两个建议,首先,尝试构建一个框架,在这个框架中,所有的东西都放在适当的位置并经过深思熟虑(这需要软件工程和软件架构方面的知识),或者如果你不想这样做,开始学习DOTS,这是一种现代的统一编程语言风格,它不是面向对象的,而是面向数据,一开始就有默认的性能和干净的代码风格。

我完全理解你的痛苦,我也经历过。 为了保持代码的可维护性和可重用性,我建议您遵循坚实的原则: S-单一责任,一个类应该只有单一的系统需要担心。 O-开/关原则,每个类都应该为扩展而打开,为修改而关闭,这意味着对类的特定行为形式使用继承和多态性。 L-Liskov的替代原则,指导我们何时使用和何时不使用继承。 I-界面分离。 依赖倒置,这意味着对依赖项使用抽象。 下面是关于SOLID的伟大团结演讲的链接:

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

在项目的初始阶段,创建符合SOLID的体系结构确实需要付出努力,但随着项目的发展,这种努力确实会得到回报


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

不要每次更新都获取另一个组件。。。为什么不列出一个控制器列表,让唤醒者确保每个元素都已分配?我正试图阻止我愚蠢地获取描述,这就是为什么我制作这个centrol控制器。我也同意我们应该确保所有元素都在Awake方法中分配,但我的问题是,如果存在添加更多控制器而不修改头部控制器本身的方法,则可以将控制器注册到头部控制器,作为基本代码的一部分……任何示例pls==如果您的中央控制器中的控制器列表控制器类是私有静态的,并且具有要注册的静态方法,并且您的所有控制器都是从基类构建的,作为基类contstructor的一部分,它可以调用centralcontroller.register(this)并添加自身。。。。因此,没有未注册的控制器谢谢你的回答,我开始阅读关于DOTS的Unity文档事实上,我在学习软件工程时已经听说过SOLID,但仍然提供了一个很棒的学习材料。谢谢兄弟。顺便说一句,为了CentralController脚本的缘故,您能举一些使用委托的例子吗?