【译】小心Unity的奇怪名字
发表于2016-02-24
原文地址:http://www.codeproject.com/Articles/1076214/Be-Careful-of-Those-SPECIAL-Names-in-Unity
版权:作者版权声明为http://www.codeproject.com/info/cpol10.aspx,可以翻译
每隔一段时间,你都会想起这么一个简单的事实,每个工具都有它自己的使用方法、有一些技巧,如果你不知道这些,就可能会在使用工具的过程中发生一些意想不到的事情,Unity中的工具也是这样。正如老的引文说的那样:
”伟大的力量要承担大责任“(总和一个矮架子在一起,你总会撞到头)
在你的脚本和代码中使用的名字就是这么一个问题(你的类名,不是属性或者枚举),我将在下面解释。
名字中有什么?
就算只使用了5分钟Unity,很明显有一些名字也是不能在Unity中使用,这些明显的名字包括:
MonoBehaviour 因为几乎所有东西都是MonoBehaviour
诸如Vector2, Point, Canvas这些基本类型 – 因为这是unity已经有的内置类型,你可以使用他们,但是没法重复定义
保留名字-几乎所有在Unity名字空间的名字,不信的话,可以创建你自己的UnityEngine类然后看看会发生什么
如果你做了一些Unity认为有问题或者不合适的事情,Unity越来越倾向于预先警告
但是,这些事情可能在你构建的平台上并不会发生,Unity会检查这些么?
答案是不.
你可以任意选择你想要的颜色,只要它是红的
有一种错误只会在编译版本里面以以下两种方式出现:
· 在加载的时候一个非常有用的提示“Object reference not set to an instance of an object”
· 项目打开的时候没有提示,但是当构建的时候,你会突然看到无数的错误
“Class has no property called x” or
“Cannot implicitly convert type X to Y”
在这种情况下,开发人员创建一个叫做“SplashScreen”的类(看上去相当无害),但是当你深入这个问题,你会发现Unity和微软平台都有一个叫SplashScreen的类型。在Unity内部构建的时候,Unity会正确识别哪个是自己的SplashScreen,但是当在对应平台构建的时候,会发出覆盖。
如果你测试它就会发生
让我们测试这个,这样当问题发生的视乎你就能做好更充分的准备。据我的测试,这个问题似乎只在windows平台才有,应该是因为windows能够完全接触到Unity工程。
要重现问题,简单测试以下步骤:
1、创建一个新的空白项目
2、创建一个新的脚本叫做SplashScreen
3、构建面向“Windows商店”平台的项目
4、在Visual Studio或MonoDevelop中构建项目
看着没错误,现在开始构建。你会看到一个有关SplashScreen的错误,因为项目认为你不需要重新定义,而是该使用平台对应的类
所以什么名字是你不该使用的
现在我要做一个测试,这个测试并不难。如果你发现了一些其他的名字,可以在后面评论,我会把它们加入这个列表
· SplashScreen
· App
· Application
· Window
· UnityPlayer(令我们惊讶的是,Unity对这个名字的重复不会警告)
如何彻底地避免问题
需要注意的是这将影响到你工程里头定义的任何类或者类型。一个简单的避免这些头疼问题的方法是使用你自己的命名空间,这意味着你的类名字不会和其他项目中的名字产生混淆。
要了解命名空间,可以参考下面Unity学习网站上的文章
· http://docs.unity3d.com/Manual/Namespaces.html 关于命名空间的参考以及一些例子
· https://unity3d.com/learn/tutorials/modules/intermediate/scripting/namespaces使用命名空间的学习视频
保持代码的安全和美