为脚本文件和其中声明的类仔细选择名称非常重要。使用适当的文件名并将类组织到命名空间下有助于确保编译器能够在没有错误的情况下识别您的类。
您在创建脚本时输入的文件名也将用于其中定义的类的名称。最佳实践是脚本的文件名与其中定义的类的名称相匹配。
对于从内置 Unity 类型MonoBehaviour
和ScriptableObject
派生的脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以您喜欢的任何方式响应用户输入。 更多信息
请参阅术语表,即使文件名不匹配,Unity 仍然可以解析脚本中定义的类类型,但存在一些限制
partial
关键字跨多个文件定义单个 MonoBehaviour 派生类,则只有与partial
类同名的文件才能用作组件GameObject 的功能部件。一个 GameObject 可以包含任意数量的组件。Unity 拥有许多内置组件,您还可以通过编写继承自 MonoBehaviour 的脚本创建自己的组件。 更多信息注意:在所有无法将类名明确匹配到特定文件的情况下,Unity 都会显示警告。
当在项目的不同部分声明多个同名的类时,就会发生命名冲突。随着项目规模和贡献者数量的增加,命名冲突的可能性也会增加。例如,一个开发人员可能会编写代码来控制主要角色,而另一个开发人员则为敌人编写等效的代码。如果两个开发人员都选择将他们的主类命名为Controller
,编译器将无法确定代码中Controller
的使用指的是哪个类。
为了避免类名冲突,在 C# 编程中最佳实践是在命名空间下组织您的类。命名空间是类的集合,类名前缀的命名空间提供了一种完整、明确的方式来引用该类。有关详细信息,请参阅 Microsoft 关于命名空间 的文档。
在下面的示例中,类Controller1
和Controller2
是名为Enemy
的命名空间的成员
namespace Enemy {
public class Controller1 : MonoBehaviour {
...
}
public class Controller2 : MonoBehaviour {
...
}
}
您可以通过使用它们的完整名称在代码中明确引用这些类。完整名称是命名空间加上类名,在本例中分别为Enemy.Controller1
和Enemy.Controller2
。您可以将命名空间声明添加到现有的类声明周围,这样您就不需要单独更改所有类的名称。您可以在类出现的任何地方添加命名空间声明,即使这些类位于不同的源文件中。
您可以通过在文件顶部添加using
指令来避免重复键入命名空间前缀。
using Enemy;
这会导致编译器将此文件中对Controller1
和Controller2
的引用分别解析为Enemy.Controller1
和Enemy.Controller2
。如果脚本还需要引用来自不同命名空间(例如名为Player
的命名空间)的同名类,则必须指定命名空间前缀。如果两个包含冲突类名的命名空间在同一文件中使用using
指令导入,编译器会报告错误。
Unity 存在一个与命名空间和 MonoBehaviour 或 ScriptableObject 类相关的特定限制。如果您的文件包含 MonoBehaviour 或 ScriptableObject 类的定义,则不能在该文件中使用多个命名空间。
Unity 在控制台中给出以下警告
Class MyClass can not exist in multiple namespaces in the same file, even if one is excluded with preprocessor directives. Please move these to separate files if this is the case.
如果您有一个文件在一个命名空间中定义了 MonoBehaviour,而在同一文件中的另一个命名空间中定义了其他类,Unity 将无法识别 MonoBehaviour 类,并且您将无法在游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等。GameObject 的功能由附加到它的组件定义。 更多信息
请参阅术语表上使用它。此限制是在 Unity 2020.1 中引入的,以提高导入和编译速度,因此在此限制引入之前编写的某些旧版Asset Store一个不断增长的免费和商业资产库,由 Unity 和社区成员创建。提供各种各样的资产,从纹理、模型和动画到完整的项目示例、教程和编辑器扩展。 更多信息
请参阅术语表软件包可能会因此无法正常工作。要解决与此问题相关的故障,请将每个命名空间中类的代码分离到单独的文件中。