1.3 创建时钟的其他部分
钟盘上一般都会有一些标识来帮助时钟展示时间,我们一般称之为外围。那么我们就把它的 12 个小时的显示做出来。
我们通过 GameObject → 3D Object → Cube 的方式,来创建一个立方体。把它的 scale 设置为 (0.5, 0.2, 1),这样我们就可以得到一个窄的、扁的长条。下一步把它放置在钟盘上,设置 position 到 (0, 0.2, 4),这就是小时的指示器了。我们把它的名字改为 Hour Indicator。
现在有了一个新问题,这个小时指示器颜色和背景太像了,很难区分。我们可以给它重新创建一个材质。点击 Assets → Create → Material 或者右击 Project 窗口,然后我们会得到一个默认材质球的副本。把它的 Albedo 的颜色修改的深一些,比如 RGB 值都设置为 73。这就是一个深灰色的材质了,把它的名字修改成 Clock Dark。
Q&A:什么是 Albedo?
Albedo 是拉丁语,意识是白的程度,你可以简单的理解为材质的颜色。
材质球创建好了之后,我们就可以通过拖拽这个材质球到 hierarchy 窗口,或者拖拽它到 inspector 窗口,或者直接改变 Hour Indicator 的 mesh renderer 组件下的 Materials 数组中第一个元素。
我们的钟盘上是有 12 个小时的,那么我该如果表示它是小时 1 呢?很简单,钟盘有 360 度,一共 12 小时,所以每个指示器旋转 30 度就可以了。试试看,旋转 Y 轴 30 度。
上面有了理论基础之后,我们看到指示器的位置还是在 12 点钟的位置,这是为什么呢?因为所有的 rotation 都是相对于它自己的原点的,也就是它的位置。
我们需要把指示器沿着表盘的的边布置,并且让它对齐到 1 点钟的位置上。有个取巧的办法就是让 hierarchy 帮我们自动排布。
首先我们把刚才指示器设置的 rotation 归 0,然后创建一个新的空的 GameObject,它的 position 和 rotation 为 0 ,scale 为 1。然后把 indicator 拖拽到它下面,变成它的子节点。
现在我们把父节点的 rotation 的 Y 设置到 30 度。前面我们说过父节点的变化会影响子节点,所以自然的小时指示器也会被旋转了,这就是我们想要的效果了。
复制刚才的模板组,windows 上的快捷键为 Ctrl+D(MAC 上为 Command+D),每一个新复制出来的都增加 30 度,这样我们就能制作完整的 12 个小时的了。
这个时候,我们就不再需要这个临时的模板组了,选择所有的 hour indicators,把它们全部拖拽到 clock 的对象下面,让它们成为 clock 的一部分。当我们拖拽的时候,hour indicators 的父节点会发生改变,但是 Unity 会自动转换它们的变换信息来确保即使修改了父节点也不影响它们在场景里的世界坐标。并且自动帮你转化到当前的父节点下。
你可以通过按住 Ctrl 或者 command 键来一次选择多个物体进行操作。
Q&A:如果我看到一些像 90.00001 这样的值,有问题吗?
这个是因为所有的 position, rotation, 和 scale 都是用浮点型的数据表示的。每个浮点型都会有一些精度限制,有可能你看到的值会超出你的预期,但是就事实而言,你不用担心 0.00001 这样的精度问题。
1.4 创建指针
我们可以用相同的方式来创建时钟的指针。创建另外一个 cube,然后把名字改为 Arm,给它们换上和小时指示器相同的深色的材质球。把它的 scale 设置为 (0.3, 0.2, 2.5),变成一个比指示器还长的长条,把 position 设置为 (0, 0.2, 0.75),这样它就显示在表盘上面,并且指向 12 点钟方向了。
要让时针以钟盘中心为圆点进行旋转,我们需要给它创建一个父节点。就像我们刚才给指示器创建的那样,同样的记得要重置 transform 下面的 position 、rotation 和 scale。它和指示器不一样,指示器只是一个固定位置,但是时针是需要旋转的,所以这个 parent 不能删除,我们把它重新命名一下改为 Hours Arm,所以这个时候,原先的 Arm 节点就变成了 clock 的孙节点了。
复制 Hours Arm 两次,来创建 Minutes Arm 和 Seconds Arm。分针要比时针更长更细,所以我们设置一下 它的 scale 到 (0.2, 0.15, 4) 并且 position 为 (0, 0.375, 1)。
同样的,设置一下 Seconds Arms,scale (0.1, 0.1, 5) ,position (0, 0.5, 1.25)。为了更明显的区分秒针,重新建了一个红色的材质球,RGB 值为(197, 0, 0),然后给 Arm 换上。
现在,我们的时钟已经创建好了,如果你也完成了的话,这个时候去保存场景就再好不过了,这里我保存一下工程。
如果你自己照着做了,或者想跳过刚才制作场景的步骤,那么没关系,你可以直接用我创建的,后面会给出下载方式。你可以把这些 packages 直接导入到你的工程里去,方法为 Assets → Import Package → Custom Package..., 然后拖拽 packages 到窗口上,或者双击文件浏览选中。