[Unity C#教程] 游戏对象和脚本
博主最近在学习Unity,发现一个英文教程很好。这个教程通过一个个小项目讲解了Unity方方面面,包括编辑器的使用,脚本的开发,网格基础, 渲染和Shader等等,而且是由浅入深介绍的。这个教程是荷兰的独立软件开发工程师Jasper Flick写的,发表在了他自己的网站catlike coding。你可以在这个网站上看到这个教程和他的其他作品。
因为这个教程很不错,所以我计划把它翻译下来,这样对我的Unity技术和翻译水平都会是一个提高的机会。 我会不定期更新,但是尽量一个月保证一篇到两篇。我的Unity和英文翻译水平都很有限,如果阅读时发现什么错误,敬请指出。如果有什么关于文章的问题,也欢迎提问,大家一起讨论。 另外需要说明的是,我已经得到Jasper本人的许可翻译和发表。
这个教程的第一部分名为《游戏对象和脚本》,是属于第一章《基础篇》的,它介绍如何用Unity来做一个三维的钟表。前面先介绍搭建钟表的模型如何制作,后面介绍脚本的开发。如果你按照他的教程做下来,你会得到如下的一个钟表:
虽然这个项目看起来很简单,但是对于初学者来说是一个很好的项目-- 因为你很快就可以做出一个确实能用的东西了。 而且教程内一些小技巧我相信大牛也不一定都熟悉,比如表盘刻度的自动放置。所以好好读读这篇文章我相信会有所收获。
下面是这篇文章的正文翻译:
游戏对象和脚本 – 创建一个时钟
原作者:Jasper Flick
原链接:http://catlikecoding.com/unity/tutorials/basics/game-objects-and-scripts/
翻译者: York Zhang
翻译者邮箱: york.zhang[at]outlook.com
用简单的游戏对象创建一个时钟,
旋转时钟的指针来显示时间,
让指针动起来!
在这个教程里我们将创建一个简单的时钟,并编写一个组件用来显示当前时间。你并不需要了解太多Unity编辑器。 如果你已经用几分钟稍微熟悉了点Unity编辑器,知道了怎么在Scene(场景)中切换,就可以了。
这个教程是基于Unity 2017.1.0和以上版本的。
是时候创建一个时钟了。
- 创建一个简单的时钟
打开Unity,然后创建一个新的3D工程。你不需要添加额外的Asset Packages,也不需要开启Unity Analytics。如果你还没有对Unity editor进行界面的修改,你会得到如下的窗口布局:
默认窗口布局
我用了一个不太一样的布局,也就是”2 by 3”, 你可以从编辑器右上角的下拉菜单中选择。我又进一步对这个布局改了一下,将Project窗口修改成了”One Column Layout”,这样就更好的适应了垂直方向。你可以通过修改工具条(toolbar)右上角的锁图标附近的下拉菜单进行修改。 另外,我关闭了位于Scene窗口的Gizmos下拉菜单里的Show Grid选项。
定制的“2 by 3”布局
为什么我的Game窗口有显示有黑色的边? 如果你用的是高分辨率显示的话,会出现这个问题。 为了显示整个Game窗口, 打开aspect-ratio下拉菜单,然后关闭Low Resolution Aspect Ratios 选项。
关闭状态下的Low Resolution Aspect Ratios 选项。
1.1 创建一个Game Object(游戏对象)
在默认的场景里, 你能看到有两个game objects。 他们是在Hierarchy窗口,你也能看到他们也在Scene窗口里。 第一个Game Object是Main Camera(主镜头),用来渲染场景。而Game窗口用这个镜头来渲染。第二个game object是Directional Light,用来照亮整个场景。
用GameObject-->Create Empty 选项来创建你的第一个game object。 你也可以通过右键菜单来在Hierachy里面创建。 这样,在场景里就添加了一个新对象,然后你马上就可以命名它。 因为我们要创建的是一个时钟,我们就给它取名为Clock。
Hierarchy里的clock对象
Insepctor窗口含有game object的细节。 当我们选择clock这个game object的额时候, 它会显示对象名字和一些设置在顶部。默认情况下,这个game object是启用状态的,非静态的,不带标签(tag)的,而且它归属于一个默认的层(layer)。 这些设置是对我们来说是可以的。 在这些下面,你会看到这个game object的所有组件。一般来说总会有一个Transform组件,而我们clock这个game object 唯一有的组件就是它。
选择clock之后的Inspector窗口
Transform组件包含game objec在三位空间中的位置(position),旋转(rotation)和大小(scale)。你需要确保前两者的值都是0,而第三者的值都是1。
二维的game object是什么情况呢? 在二维而不是三维的情况下, 你可以忽略其中一个维度。一般来说,像UI元素这样的2维对象,都会有一个Rect Transform,这是一个比较特殊的Transform组件。
1.2 创建表盘
虽然我们有了一个clock对象,但是我们在场景中什么都没有看到。 我们需要添加三维模型,它才能渲染出来。 Unity自带一些基础的对象,我们可以用它们来做简单的时钟。我们先通过GameObject –> 3D object--> Cylinder 来添加一个圆柱体。 让它和我们的clock对象有一样的Transform值
一个圆柱体的Game Object
和空的game object不同的是,这个新创建的game object多出三个组件。首先,它有一个Mesh Filder。它只是包含了对内置的圆柱体网格的参照。第二个是一个Capsule Collider(胶囊碰撞体), 这是一个描述三维物理的组件。第三个是Mesh Renderer(网格渲染器)。这个组件用来确保物体的网格会被渲染,他也控制了用来渲染的材质。你如果不对它进行更改,它会使用Default-Material(默认材质)。你在inspector里的组件列表里也能看到这个材质。
虽然说这个对象用来表示一个圆柱体,但是它还有一个胶囊碰撞体组件,因为Unity并不含有原始的圆柱体碰撞体。我们不需要这个胶囊碰撞提组件,所以我们可以删除它。 如果你想在你的表上用到物理特性,你最好不要用Mesh Collider组件。 你可通过上方右边的齿轮图标旁边的下拉菜单来删除组件。
不再有碰撞体
为了将这个圆柱体变成表盘,我们得压扁它。你需要减少Scale里Y的值到0.1. 因为圆柱体网格是两个单元高,它的有效高度变成了0.2个单元。 让我们做一个大时钟,将Scale里X和Z的值改为10。
大小变化后的圆柱体
因为这个圆柱体表示表盘,你需要将圆柱体的名字更改为Face。它是时钟的一部分,所以让其成为Clock的子对象。要做到这点,你需要在Hierarchy里将它拖到clock上面。
表盘子对象
子对象是受制于它的父对象的,意思是说当Clock改变了位置,表盘也会变。就好像他们是一体的。 旋转和大小也一样。 你可以用这个方式去制作更复杂的关系。
1.3 创建时钟的外圈
时钟的表盘上一般会有标记来帮助指出具体什么时间。也就是说表的外围。 让我们用方块来指一个12小时的时钟的时间。
通过GameObject-->3D Object-->Cube来添加一个立方体(Cube)。将它的大小调整为(0.5,0.2,1),然后他就变成了一个又细又扁的长形方块。 现在它就在表盘上,那么我们需要将其位置(position)修改为(0,0.2,4)。这样他就会位于表盘的最顶端,表示12点的刻度。让我们将它命名为Hour Indicator(小时刻度)。
12小时的刻度
因为这个小时刻度的颜色和表盘一样,所以不太容易看得见它。让我们通过Assets-->Create-->Material, 或者在Project窗口点击右键菜单来让我创建另外一个材质。你会发现这个材质和之前的默认材质是一样的。将Albedo值改成深一点的颜色,比如Red红,Green绿和Blue蓝都为73。这样我们就得到一个深灰色的材质。给它一个合适的名字,比如Clock Dark。
黑色材质asset和颜色的弹出窗口。
什么是Albedo?