Unity是一个制作专业级游戏的开发环境。它创建于MonoDevelop的基础之上,并用它来实现将同个代码部署到多个平台的目标。Unity有两个版本,但本文关注的是无附加件的免费版本。
Unity免费版(我目前使用的版本)支持开发者向Mac、Windows、Linux、Web和Google Native(游戏邦注:这是一个无插件的Chrome部署技术)部署内容。现在开发者还可以下载针对Android和iOS平台的免费部署版本。如果你是以团队身份使用该工具,可以花500美元获得更多功能和资产的使用授权。免费版本支持多人游戏、物理、3D音频、动画、Direct3D 11、着色器、光照贴图以及地形等实用功能。如果你是Xbox 360、PS 3或Will开发者,你也可以向这些平台部署内容,只是我并不清楚这一用法的授权情况。
Unity Pro收费标准是1500美元,拥有许多高端性能,例如细节层次(LOD)、自动寻径、高端音频过滤器、视频回放、流媒体、IK动画、3D纹理、即时阴影及其他专业功能。这个Pro的Android和iOS授权费都是1500美元,可以支持那些400美元版本所不具备的功能。
介绍《KeyShot》
这是我遵循来自Walker Boys Studio的免费教程后自己创造的一款游戏。Walker Boys Studio网站有长达70多分钟的视频,教授用户如何用JavaScript编写代码,并逐步分解如何创造4种不同类型的游戏。《KeyShot》是基于本教程第二款游戏所制作的游戏,但也扩展了许多内容。除此之外,我还将所有的JavaScript类转变成了C#。这个项目包括面向两个语言的同个功能,它们在Unity中很容易切换。
《KeyShot》是极为初级版的《大蜜蜂》。其目标是尽量在30秒内不死的情况下获得最高分。系统将保存前10项最高分,以便创造让玩家打败高分的动力。
执行
这里我建议你直接上Walker Boys Studio网站下载游戏的基础资产。
以下是我对Walker Boys教程内容的扩展功能:
*使用多个摄像机运行背景logo
*执行JavaScript和C#,包括如何使用JavaScript中的嵌套术语以及如JavaScript中调用C#脚本
*如何使用带有不与Unity的标准Y-up对齐轴线的3D模型
*使用PlayerPrefs呈现高分列表(详见本文第二部分)
*如何使用带有文本域的对话搜集用户数据(详见本文第二部分)
*如何在Unity中执行作弊码(详见本文第二部分)
使用多个摄像机执行背景logo
好,现在让我们看看如何展现游戏区域之外的logo。
1.从Assets进入Import New Asset菜单,我先择输入PNG。这可以将资产拖入Unity令其处于可用状态。
2.接下来双击载入Scene1:
3.在Unity右上方的窗口中有一个Layers下拉单菜。选择“Edit Layers”,可以看到一个标签列表,之后是Builtin Layers,然后是User Layers。
4.如果点击User Layer 8右边,就可以设置该图层的名称。我为图片选择了“背景图片”这个名称。
5.在Hierarchy的下拉菜单中,使用Create菜单并选择“GUI Texture”,将其命名为“背景图片”。
6.将logo资产拖到GUI Texture的Texture属性(游戏邦注:以便告知我们将使用这个logo作为纹理)。
7.现在在Hierarchy中选择“背景图片GUI Texture”查看其属性列表。要获得准确的大小,使用Pixel Insert设置。我从属性中看到这张图片大小是512X128。为了将图片置于中间,我将X轴设为-256,Y轴为-64,然后将宽度设为512,高度为128。
8.将背景图片的图层设为“背景图片”。
(为准确展现图片,我们需要创造第二个摄像机)
9.在Hierarchy视图中点击“Main Camera”。然后在Hierarchy中选择“Creat”下拉菜单并选择“Camera”。我将其命名为“背景摄像机”。在默认状态下,我们创造自己的新摄像机时,其视口会和之前所选择的一样,所以不需要再进行调整。
10.现在点击背景摄像机,设置它的Culling Mask,以便仅使用背景图片这个图层。
这可以点击Culling Mask,选择Nothing。然后选择Background Image。此时我还设置了背景摄像机的背景颜色,以匹配Keyholel logo的背景。
11.最后,我们要让主摄像机去忽略背景图像这个图层。
执行这一操作,点击Main Camera,然后再点击Culling Mask。然后取消选择背景图像这个图层。
(这个过程要经历数个步骤,但结果十分可观,它会在游戏中所有其他元素之后显示水印)
执行JavaSCript和C#
包括如何在JavaScript中使用嵌套通用术语,以及如何从JavaSCript中调用C#脚本
在Walker Boys教程中,他们选择JavaScript为所有游戏编码,这方法还行。但如果你也和我一样,你可能会更喜欢用C#而非JavaSCript编码。所以,我将所有的JavaSCript转换为C#,我的项目源代码中将同时运用到这两者(详见第二部分)。
在使用Unity开发游戏并选择编程语言时需注意:
1.如果你用JavaScript编码,那就会在编辑之前转变为C#。这是为何你用JavaSCript编码时必须用到#pragma strict的原因。每个JS文件都是像C#类一样用同个名称执行。所以,既然C#就是目标语言,为何不直接使用C#来编码?
2.你也可以从JS调用C#,或者从C#调用JS,但不可在一个项目中同时调用两种语言。这是因为一个文件组要先于另一文件组进行编缉。在“Standard Assets”这一特定文件夹中的文件编辑要先于分布在别处的文件。在我的项目中,我所有的C#文件都在Standard Assets文件夹,所有的JS文件都在基础文件夹。这意味着我可以从自己项目的JS文件中调用C#。但出于本文需要,我没有这么做,但我将进行示例,这样你的项目有此需求时就可以派上用场。注意,在这个示例中,我所有的JS文件都以2结束,而其对应的C#文件都有相同的名称,但没有2这个数字。要调用C#版本而非JS版本,只要从scriptSceneManager2和scriptAstroid2移除2就行。文件归到合适位置时,事情就比较简单了。
function OnTriggerEnter(other:Collider) {
if (other.gameObject.tag == scriptSceneManager2.TAG_ASTROID) {
var astroidScript = other.GetComponent(scriptAstroid2);
astroidScript.ResetPosition(); } …}
3.JavaScript中的通用术语使用了一个时髦的术语。这在如下嵌套通用术语中尤其令人抓狂:
C#: List<KeyValuePair<int, string>> highScores = new List<KeyValuePair<int, string>>();
JS: var highScores:List.<KeyValuePair.<int, String> > = new List.<KeyValuePair.<int, String> >();
要尤其注意JS中右方括号之间的空隙,因为如果没有它,文件就无法编辑。
4.C#中的字符串类型名称是string,而在JavaScript则是String。
5.你可以在JavaSCript代码中直接调用C#,通常也只能如此。这是在编辑过程中将JS转换为C#时要注意的另一点。
6.即使已经完成转换,也要在转换前检查JS术语。其检查范围在JS中与在C#并不相同。
例如,在C#中:
for (int i = 0; i < 10; i++) {
print(“i = ” + i); }
// i was only in scope during the for loop, so i must be redefined for the next for loop for (int i = 0; i < 10; i++) {
print(“another i loop. i = ” + i); }
在JS中则是:
for (var i:int = 0; i < 10; i++) { print(“i = ” + i ); } // in JS, once a variable is defined it stays defined. Scope is at the function level for (i = int 0; i < 10; i++) { print
(“another i loop. i = ” + i); }
7.JavaScript可强制转化许多值,而C#即使在JS严格模式中也做不了到。强制转换(自动从一种类型切换到另一种)会产生大量副效应,从而催生难以发现的漏洞。为此,在使用JS编码时,我格外注意指定的参数类型,并确保使用的是自己预期的类型。
8.JavaScript函数是一直可存取的,但C#遵循的是域规则。如果一个脚本将调用另一者,在C#中就要确保这些将被其他脚本调用的方法处于公开状态。
如何使用带有不与Unity的标准Y-up对齐轴线的3D模型
从其他程序(游戏邦注:例如Blender、3D、Lightwave等)导入3D模型时,许多此类模型的轴线设置中Y并非处于“up”状态,而Unity却有此要求。因此你若不掌握这一方法,就不太可能在Unity中使用这些模型。
你可以通过以下网站了解情况,但其中内容对我来说有点费解了:
http://docs.unity3d.com/Documentation/Manual/HOWTO-FixZAxisIsUp.html
因此,我将通过截图进行讨论。
1.创造一个空白的GameObject
2.将GameObject重命名为“Key2”,将其将拖拽到prefabPlayer,令其成为后者的下属文件。因为我是复制自己的key来解释如何操作,所以我将不再使用当前的Key,向你展示如何进行匹配。
3.注意Unity如何在相当随机的位置中放置对象。将位置更改为0,0,0,这样它就会很接近原先的Key。现在将Key_8网格和matPlayer拖拽到Key2对象。
你将得到以下结果:
注意新的Key处于其默认方向,这样会出现旋转错误的情况。因为我们有一个GameObect把持网格,而不是直接将其添加到prefabPlayer对象,我们可以重置Key2 GameObject的旋转,而不会影响prefabPlayer的旋转。
将Key GameObject的Y和Z旋转位置分别设为90和90,更正Key的旋转方向,这样我们就有一个可用于玩家的垂直、侧视图的Key。