【问题标题】:How to deal with invisible c# namespaces in Unity editor?如何在 Unity 编辑器中处理不可见的 c# 命名空间?
【发布时间】:2018-01-14 17:49:09
【问题描述】:

统一文档建议使用命名空间来组织代码,避免扩展类名,并使代码更易于维护。

ControlerCameraAction 变为 Controleurs.Cameras.ActionCameraAction 变为 Cameras.Action。 但是在 Unity 编辑器中,您看不到命名空间,只能看到最后一个类名,这可能会造成混淆,因为某些类现在具有相同的名称。

编辑器现在显示ActionAction
那么如何在 Unity 中使用命名空间呢? 我做错了吗?

【问题讨论】:

    标签: c# visual-studio unity3d namespaces unity5


    【解决方案1】:

    简单的方法是在命名空间中思考文件夹如何。您分配所需的名称,避免与系统和统一命名空间相似的名称。另一个命名空间中的每个命名空间类似于在另一个文件夹中的文件夹中导航。

    通常以您的公司名称或插件名称开头:

    namespace mycompany_name
    {
        namespace myplugin_name
        {
        }
    }
    

    namespace myplugin_name
    {
        //part name i.e. Networking, Utils, Database or similar ramification
        namespace myplugin_part_name
        {
        }
    }
    

    稍后您在另一个脚本中使用“using”引用它:

    using mycompany_name.myplugin_name
    

    【讨论】:

      【解决方案2】:

      那么如何在 Unity 中使用命名空间呢?

      基本上和你一样。命名空间在代码中使用,而不是在编辑器中。 Unity 的主要问题是处理脚本的方式。脚本在内部被编译成可调试的 IL 代码。

      但在编辑器本身中,它们总是以它们的文件名命名,它们被强制与类名相同。

      这就是你看不到整个类型名(命名空间 + 类名),而总是只看到类名的原因。

      我做错了吗?

      不,你不是。据我记得,没有办法在编辑器中显示类名而不是文件名,因为显示的数据是由 Unity 生成的元文件决定的。

      所以 tl;博士:

      你做得对,没有办法在编辑器中显示命名空间。

      我建议您将脚本分类到文件夹中,并使用AddComponentMenu-Attribute 根据您的命名空间物理组织您的代码。这与 Microsoft 使用的模式相同。

      【讨论】:

      • 这是我正在寻找的评论,可能不需要 AddCompentMenu,因为我的脚本路径已经由组件菜单中的命名空间组织。直到你提到它我才看到它。
      【解决方案3】:

      统一文档建议使用命名空间来组织您的 代码,避免扩展类名,并使代码更易于维护。

      是的!

      ControlerCameraAction 变为 Controleurs.Cameras.ActionCameraAction 变为 Cameras.Action

      是的,也不是。

      命名空间背后的理念是组织,而不仅仅是简单的use this feature called namespaces。该组织应该遵循一个逻辑。如果每个类都有不同的命名空间,那么您将必须导入与您将在代码中使用的类一样多的命名空间。

      您可以从“模块”的角度进行思考,或者看看分层架构是否对您有用。

      如果你有 ControllerCameraActionCameraAction,你可以 a.- 使用命名空间 Cameras (那么你将有 Cameras.CameraActionCameras.ControllerCameraAction),b.- 如果你有分层架构(如 MVP、MVVM 或更多的 DomainDesign Driven 等)您可以使用层名称和模块来拥有命名空间。 (然后你会得到Presentation.Cameras.ControllerCameraActionDomain.Cameras.CameraAction 之类的东西,这可以帮助你关注Onion architecture)。


      namespaces 的语法如下:
      namespace Domain.Cameras
      {
          public class CameraAction 
          {
          }
      }
      

      然后你将它们与using 指令一起使用

      using Domain.Cameras;
      
      namespace Presentation.Cameras
      {
          public class ControllerCameraAction 
          {
              private CameraAction cameraAction;
              ...
          }
      }
      

      更多关于命名空间here!

      默认情况下,所有没有显式命名空间的类都属于 global 命名空间,因此即使您没有编写任何命名空间,您也正在使用一个。


      Unity 不会在命名空间之间产生任何区别,这更像是一个 c# 特性。它有助于组织、关注点分离原则以及避免名称冲突,但在最后一个实例中,您的类名仍应具有代表性和清晰性,足以理解该类的作用。如果你看到 Camera.csCamera.cs 真的很难看出哪个类做了什么。如果您打开这些文件并查看它们所在的名称空间/代码/文件夹,这将有所帮助,但我们的想法是节省那些额外的秒数/认知负载,并且更明确地使用您的名称。

      作为补充,您可以在这里看到另一个有趣的discussion about namespaces use

      【讨论】:

      • "(那么你将拥有 Cameras.CameraAction 和 Cameras.ControllerCameraAction)" 我不明白这一点,类名没有改变
      • 哦,那是你必须重新考虑你的名字的时候了。我只是想展示一个带有原始名称的示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多