如何:Unity3D 或 Spaghetti 代码的项目架构? [关闭]

Posted

技术标签:

【中文标题】如何:Unity3D 或 Spaghetti 代码的项目架构? [关闭]【英文标题】:How to: Project Architecture for Unity3D or Spaghetti code? [closed] 【发布时间】:2020-04-08 17:08:02 【问题描述】:

2 多年来,我一直在编写代码(几种编程语言),总而言之,我一直使用设计模式和几种架构......层、职责分离、不同的类库、客户端/服务器等等……

然而,在这个周末,我只是为了好玩和好奇,安装了 Unity 3D 并试了一下。 虽然我可以在 Visual Studio 中打开文件,但我不明白 unity 项目的默认文件结构。

我创建了嵌套文件夹来组织我的代码,但是当我尝试创建一个类时,出现了许多问题:

命名空间在哪里?为什么我需要自己写?它们是否应该是自动的并考虑到“文件夹”结构? 如何创建/重用/导入不同的项目类库? 如何管理 nuget 包? 以及我一生在编程中所做的一切.....

我找到了一个带有一些信息的article,但仅此而已……仅此而已。

我想知道是否有人可以为我指出关于这个主题的正确方向。

谢谢。

【问题讨论】:

...你在说什么? ^^ 在 c#(不仅是 Unity)中,一个类始终存在于默认命名空间中,除非您明确指定一个不同的命名空间(参见 namespace)。如果您使用的是 VS,它建议为文件夹使用相应的命名空间,但根本没有必要。您可以做的是在Assemblies 中订购它们。对于迁移部件/库:导出和导入Packages。 这个问题是合法的,我知道有人问过这个问题。我希望 *** 能善待它。 我对这是基于意见的看法有点犹豫。标题提出的问题是“Unity3D 的项目架构”以及如何组织代码确实纯粹是基于意见的。但是关于为什么没有(自动)命名空间以及如何使用类库/nuget 包的问题对我来说似乎是有效的问题。 (虽然可能更适合作为独立问题) @Remy_rm 是的,我在基于意见和过于广泛之间悬而未决。可能是个别问题,但至少有一半问题是基于意见的 @Dryadwoods 你能编辑这个问题以减少对意见的影响吗? 【参考方案1】:

基础知识(传统脚本)

在 Unity 中,C# 被用作脚本语言,受到许多限制并且旨在用于模式中。 每个 Unity 脚本都派生自 MonoBehaviour,正如您在文档中所读到的那样,它实现了特定的 methods。此外,您不能使用新的构造函数,而必须使用名为Instantiate 的工厂方法。尽管如此,您可以使用其他类,只要它们被正确包含并被任何 MonoBehaviour 脚本类使用。

虽然该主题有待商榷,但您可以在 Unity [1] 中找到有关 C# 脚本结构不佳的意见。

命名空间和项目结构

在早期版本的 Unity 中,普遍的共识是,当文件夹结构反映类型(例如图像和类别、每个类别的脚本、预制件、纹理等)时,较大的项目会更整洁,而当文件夹按语义命名时,较小的项目会更整洁根据您的项目(例如场景或特定功能)。 命名空间是完全可能的,您可以在任何地方定义它们。尽管如此,正如您所想的那样,已经有一个文件夹结构并且命名空间不是 100% 模式,应该在大型项目中使用以避免冲突,正如 documentation 所暗示的那样。

现代架构:实体组件系统

最近的发展导致了一种名为 Entity Component System 的架构(查看文档)。

实体组件系统 (ECS) 架构将身份分离 (实体)、数据(组件)和行为(系统)。这 架构专注于数据。系统将数据从 通过读取组件数据流将输入状态转换为输出状态, 由实体索引。

最近的这项开发改进了项目架构。不仅项目可扩展性得到了改进,而且您可以如何回收或移植代码。即便如此,您也必须遵循 Unity 模式并坚持使用接口。例如 Unity.Jobs 有接口 JobComponentSystem,需要实现行为。最终,这一切都等于坚持模式。现代项目应该坚持使用 ECS。

【讨论】:

【参考方案2】:

命名空间在哪里?

Unity 从

中的模板创建“基础”C# 脚本 Windows:C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates Mac:/Applications/Unity/Editor/Data/Resources/ScriptTemplates Mac(自 5.2.1f1 起):/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates

默认情况下,此基本脚本不包含命名空间,但您可以通过编辑 81-C# Script-NewBehaviourScript.cs.txt 文件来添加命名空间以包含命名空间。然而,这仍然是一个静态命名空间,您可以将其硬编码到模板文件中。如果没有定义命名空间,Unity 将使用全局命名空间。我找不到他们这样做的原因。但以上信息来自this support page。当然,您仍然可以自己添加命名空间。

导入类库 您可以通过将 DLL 添加到项目的 /Assets/Plugins/ 文件夹来导入它们。这个 Plugins 文件夹是一个专门用于识别 DLL 的“特殊文件夹”。来自this manual page:

您可以添加插件 到您的项目以扩展 Unity 的功能。插件是通常用 C/C++ 编写的本机 DLL。他们可以访问第三方代码库、系统调用和其他 Unity 内置功能。始终将插件放在名为 Plugins 的文件夹中,以便 Unity 检测到它们。

Plugins 文件夹只能有一个,并且必须放在项目的根目录下;直接在 Assets 文件夹中。

NuGet 你可以通过 Visual Studio 下载和管理你的 NuGet 包。默认情况下,它会将包下载到 projectName/Packages/packageName。不过,Unity 有时会在此处检测这些包时遇到问题,因此您可能也希望将它们移动到插件文件夹中。

架构 使用什么架构/文件夹结构取决于个人喜好和意见。然而 Unity 正在向 ECS(实体组件系统)发展。可以是found here的文档。

实体组件系统 (ECS) 架构将身份(实体)、数据(组件)和行为(系统)分开。该架构专注于数据。系统通过读取由实体索引的组件数据流,将数据从输入状态转换为输出状态。

【讨论】:

以上是关于如何:Unity3D 或 Spaghetti 代码的项目架构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

r spaghetti.R

如何把UNITY3D输出的.html格式导入到网站里?

如何将unity模型导入android程序中

Unity3d可视化脚本框架如何在场景后工作?

如何在 Unity3D 单元测试中显示代码覆盖率?

如何防止Unity3D代码被反编译