如何在 Unity 编辑器中处理不可见的 c# 命名空间?
How to deal with invisible c# namespaces in Unity editor?
Unity 文档建议使用命名空间来组织代码,避免扩展 class 名称,并使代码更易于维护。
ControlerCameraAction
变为 Controleurs.Cameras.Action
,CameraAction
变为 Cameras.Action
。
但是,在 Unity 编辑器中,您看不到命名空间,只能看到最后的 class 名称,这可能会造成混淆,因为某些 class 现在具有相同的名称。
编辑器现在显示 Action
和 Action
那么如何在Unity中使用命名空间呢?
我做错了什么吗?
简单的方法就是想在命名空间中如何文件夹。您将所需的名称分配给系统和统一命名空间,避免使用相似的名称。另一个命名空间内的每个命名空间类似于在另一个文件夹内的文件夹内导航。
通常以您的公司名称或插件名称开头:
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
So how to use namespaces in Unity ?
基本上就像你一样。命名空间在代码中使用,而不是在编辑器中使用。 Unity 的主要问题是处理脚本的方式。脚本在内部编译成可调试的 IL 代码。
但在编辑器中,它们总是以文件名命名,强制与 class 名称相同。
这就是您看不到整个类型名称(命名空间 + class名称)而始终只看到 class名称的原因。
Am i doing something wrong ?
不,你不是。据我所知,无法在编辑器中显示 class 名称而不是文件名,因为显示的数据由 Unity 生成的元文件决定。
所以 tl;dr:
您做得对,无法在编辑器中显示命名空间。
我建议您将脚本分类到文件夹中,并使用 AddComponentMenu
-Attribute 根据您的名称空间物理地组织您的代码。这与 Microsoft 使用的模式相同。
The unity documentation recommend to use namespaces to organize your
code, avoid extended class name, and make more maintainable code.
是的!
ControlerCameraAction
becomes Controleurs.Cameras.Action
and
CameraAction
becomes Cameras.Action
.
是,也不是。
命名空间背后的理念是组织,而不仅仅是简单的use this feature called namespaces
。该组织应该遵循一个逻辑。如果每个 class 都有一个不同的命名空间,那么您将必须导入与您将在代码中使用的 class 一样多的命名空间。
您可以考虑 'modules' 或者看看分层架构是否对您有用。
如果您有 ControllerCameraAction
和 CameraAction
,您可以 a.- 为两者使用命名空间 Cameras
(那么您将有 Cameras.CameraAction
和 Cameras.ControllerCameraAction
) , b.- 如果您有分层架构(如 MVP、MVVM 或更多 DomainDesign Driven 等),您可以使用层名称和模块来命名空间。 (然后你会得到类似 Presentation.Cameras.ControllerCameraAction
、Domain.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!
默认情况下,所有没有显式命名空间的 classes 都属于 global
命名空间,因此即使您没有编写任何命名空间,您也使用一个。
Unity不会对命名空间做任何区分,这更多是c#的特性。它有助于组织、关注点分离原则和避免名称冲突,但在最后一个例子中,您的 class 名称仍然应该具有代表性并且足够清晰,以便理解 class 的作用。如果您看到 Camera.cs
和 Camera.cs
,那么很难看出 class 做了什么。如果您打开这些文件并查看 namespace/code/folder 它们所在的位置,那将会有所帮助,但我们的想法是节省那些额外的 seconds/cognitive 负载,只是更明确地使用您的名字。
作为补充,您可以在这里看到另一个有趣的 discussion about namespaces use。
Unity 文档建议使用命名空间来组织代码,避免扩展 class 名称,并使代码更易于维护。
ControlerCameraAction
变为 Controleurs.Cameras.Action
,CameraAction
变为 Cameras.Action
。
但是,在 Unity 编辑器中,您看不到命名空间,只能看到最后的 class 名称,这可能会造成混淆,因为某些 class 现在具有相同的名称。
编辑器现在显示 Action
和 Action
那么如何在Unity中使用命名空间呢?
我做错了什么吗?
简单的方法就是想在命名空间中如何文件夹。您将所需的名称分配给系统和统一命名空间,避免使用相似的名称。另一个命名空间内的每个命名空间类似于在另一个文件夹内的文件夹内导航。
通常以您的公司名称或插件名称开头:
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
So how to use namespaces in Unity ?
基本上就像你一样。命名空间在代码中使用,而不是在编辑器中使用。 Unity 的主要问题是处理脚本的方式。脚本在内部编译成可调试的 IL 代码。
但在编辑器中,它们总是以文件名命名,强制与 class 名称相同。
这就是您看不到整个类型名称(命名空间 + class名称)而始终只看到 class名称的原因。
Am i doing something wrong ?
不,你不是。据我所知,无法在编辑器中显示 class 名称而不是文件名,因为显示的数据由 Unity 生成的元文件决定。
所以 tl;dr:
您做得对,无法在编辑器中显示命名空间。
我建议您将脚本分类到文件夹中,并使用 AddComponentMenu
-Attribute 根据您的名称空间物理地组织您的代码。这与 Microsoft 使用的模式相同。
The unity documentation recommend to use namespaces to organize your code, avoid extended class name, and make more maintainable code.
是的!
ControlerCameraAction
becomesControleurs.Cameras.Action
andCameraAction
becomesCameras.Action
.
是,也不是。
命名空间背后的理念是组织,而不仅仅是简单的use this feature called namespaces
。该组织应该遵循一个逻辑。如果每个 class 都有一个不同的命名空间,那么您将必须导入与您将在代码中使用的 class 一样多的命名空间。
您可以考虑 'modules' 或者看看分层架构是否对您有用。
如果您有 ControllerCameraAction
和 CameraAction
,您可以 a.- 为两者使用命名空间 Cameras
(那么您将有 Cameras.CameraAction
和 Cameras.ControllerCameraAction
) , b.- 如果您有分层架构(如 MVP、MVVM 或更多 DomainDesign Driven 等),您可以使用层名称和模块来命名空间。 (然后你会得到类似 Presentation.Cameras.ControllerCameraAction
、Domain.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!
默认情况下,所有没有显式命名空间的 classes 都属于 global
命名空间,因此即使您没有编写任何命名空间,您也使用一个。
Unity不会对命名空间做任何区分,这更多是c#的特性。它有助于组织、关注点分离原则和避免名称冲突,但在最后一个例子中,您的 class 名称仍然应该具有代表性并且足够清晰,以便理解 class 的作用。如果您看到
Camera.cs
和 Camera.cs
,那么很难看出 class 做了什么。如果您打开这些文件并查看 namespace/code/folder 它们所在的位置,那将会有所帮助,但我们的想法是节省那些额外的 seconds/cognitive 负载,只是更明确地使用您的名字。
作为补充,您可以在这里看到另一个有趣的 discussion about namespaces use。