65.9K
CodeProject 正在变化。 阅读更多。
Home

小心 Unity 中的那些特殊名称

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016年2月3日

CPOL

4分钟阅读

viewsIcon

11475

小心 Unity 中的那些特殊名称

SNAGHTML102d3441

偶尔,你会意识到一个简单的事实:所有工具都有其自身的方式和方法,每个工具都有一些小技巧,如果不知道这些小技巧,可能会在意想不到的地方让你栽跟头,Unity 也是如此。

Unity 是一个非常强大的引擎和工具,但要掌握它,你必须了解它的工作原理、哪些方法行不通以及应该避免什么。

正如那句老话所提醒的

“能力越大,责任越大”
(而且很可能你会因此经常撞到低矮的门框上)

那些简单的事实之一就涉及到你在脚本和代码中给事物命名的规则(*你的类名,而不是属性或枚举*),我将在下面解释。


名字的意义?

仅使用 Unity 几分钟后,你应该清楚,有些名字是你根本不能用于 Unity 中的事物,最明显的例子是

  • MonoBehaviour – 因为几乎所有东西都是 MonoBehaviour
  • 基类型,如 Vector2PointCanvas – 因为 Unity 已经有了这些东西,虽然你可以使用它们,但你将无法获得基类的功能
  • 保留名称 – 基本上是 Unity 命名空间内的任何名称。试试创建一个自己的“UnityEngine”类,看看会发生什么!

还有更多,Unity 通常会在你做一些它认为愚蠢或不恰当的事情时预先警告你。

然而,对于你构建的平台,情况并非如此…… Unity 也会检查那些吗?

答案是,很遗憾,不。


你可以拥有任何你想要的颜色,只要它是红色

这一切的起因是,我当时正在帮助一家工作室(这也是我通常做的事情),测试他们的项目,并支持他们构建 Windows 10 UWP 版本(一次构建目标多个平台,太好了)。

在他们项目的编译版本中出现了一个错误,该错误表现为以下两种方式之一:

  • 一个非常有帮助的加载项目问题,并伴随以下错误:“对象引用未设置为一个对象实例”(这信息量很小)
  • 项目打开时没有问题,但构建时,你会突然被大量的错误信息淹没
    – “类没有名为 x 的属性” 或
    – “无法隐式转换类型 X 到 Y

在这种情况下,我正在测试,开发者创建了一个名为“SplashScreen”的类(这似乎相当无害),然而,当你深入挖掘时,你会发现 Unity 和 Microsoft 平台都已经拥有一个名为 SplashScreen 的类型。Unity 能够在内部构建中处理自己的类型,确保项目中的 SplashScreen 类版本与 Unity 的 SplashScreen 版本不同(很可能是通过使用不同的命名空间)。然而,当涉及到平台构建时,你项目中使用的类将覆盖平台使用的类


如果你测试了,它们就会出现

因此,让我们测试一下,以便在这种情况发生时你能更好地做好准备。据我所知,这只影响所有现代 Windows 平台,因为它们可以直接完全访问 Unity 项目(对于 .NET 项目来说这是一个非常有用的功能),尽管这也会影响你编写的任何被平台使用的插件(除非你遵循下一节中的步骤)。

为了重现这个问题,只需尝试以下操作:

  1. 创建一个新的空白项目
  2. 创建一个名为 SplashScreen 的新脚本
  3. 将项目构建为任何“Windows 应用商店”平台
  4. 在 Visual Studio 或 MonoDevelop 中打开构建的项目

看,没有任何错误。现在,构建它。

你将看到一系列与 SplashScreen 类相关的错误,因为项目现在认为你的项目中的类应该优先于平台保留的类型。


那么,你不应该使用哪些名字?

现在,我已经进行了一些测试,但并不算非常广泛,所以我将列出我测试过并发现问题的名称。

如果你发现更多,请在下方评论,我会将其添加到列表中。

  • 控件,而该控件又负责动画。
  • App
  • Application
  • Window
  • UnityPlayer (这个让我感到惊讶,因为 Unity 本身并没有警告不要使用它)

如果你知道更多,请随时在下方评论。


如何完全避免这个问题

需要注意的是,这会影响你基础项目中定义的任何类或类型。避免这些麻烦的一个简单方法是在你的类中使用自己的命名空间,这意味着你的代码不会与任何同名的其他代码或类型混淆(除了你自己的 张大嘴巴的微笑)。
要了解更多关于使用命名空间的信息,请查看 Unity Learn 网站上的这些参考资料:

保持安全,编码愉快!

© . All rights reserved.