Simple Clock(Unity)
第一次创建自己的博客,希望能和大家分享与学习一些小技巧和案例,我遇到的问题及解决方法还有自认为是比较重要的点都会写在里面,可能有些看起来很简单无聊,,,毕竟新手上路,文章的最后如果有项目的代码材料的话就会发给大家以供一起学习交流。那就话不多说,最近在学习一个网站http://catlikecoding.com/unity/tutorials/ ,发现里面的例子都很好,适合有unity、C#基础的朋友学习,不过里面都是英文,故而在这里将这些宝贵的例子给引用过来一起学习交流。罗里吧嗦了一大推,其实我在这里只是来说说自己的认知,顺便补一下网站有些跳过的步骤。
一、项目目标
制作和电脑上时间相同的动态时钟模型
二、基本步骤与思路
层级视图Hierarchy:
Main Camera
Directional Light
Clock②
↓
Face③ Hours Arm⑥ Minutes Arm⑥ Seconds Arm⑥ Hour Indicator * 12④
↓ ↓ ↓
Arm⑦ Arm⑦ Arm⑦
项目视图Project:
Clock(Script)⑨
Clock Dark(Material)⑤
Clock Red(Material)⑧
simple clock(Scene)①
首先创建一个unity3D项目,不用导入资源包,我认为在开始做项目之前,可以先调一调布局设置等等,然后先将Scene gizno工具调到Back的方向,稍微偏一点就OK了(保证3D模型的正方向),接着和①一样在项目视图中创建自己的场景Scene并命名(为了下一次运行项目更加方便),项目开始前的准备工作已经完成。接下来创建一个空物体并命名Clock②,并且在其Transform组件的position中设置为(0,0,0)(一般情况下先将物体位置设为(0,0,0)再做打算,这是一种好的习惯,便于坐标运算)缩放(1,1,1),再创建一个圆柱体Cylinder,更改其缩放大小,属性视图Inspector的Caspule Collider碰撞器可要可不要,然后开始创建Cube,并改名字为Hour Indicator,在项目视图创建⑤,添加到④中,接下来可以和教程一般Ctrl+D复制成功总共12个,再利用数学知识计算各个点的坐标(当然可以运用预设的方法更好,把层级视图的目标拖到项目视图中,再从项目视图中拖到层级视图或Scene界面中),旋转不要忘了。再创建三个空对象⑥,注意位置(0,0,0),缩放(1,1,1)(因为这些都是父对象,子对象是相对其位置、缩放变化的),创建3个Cube,命名为Arm⑦,父子关系连接好,⑧给对于的Arm,这样模型都完成了。不过创建的场景是静态的,需要脚本,我们可以加给总父对象Clock,以下是⑨:
using System; using UnityEngine; public class Clock : MonoBehaviour { public Transform hoursTransform, minutesTransform, secondsTransform; public bool continuous; const float degreesPerHour = 30f, degreesPerMinute = 6f, degreesPerSecond = 6f; void Update() { if (continuous) { UpdateContinuous(); } else { UpdateDiscrete(); } } void UpdateContinuous() { TimeSpan time = DateTime.Now.TimeOfDay; hoursTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalHours * degreesPerHour, 0f); minutesTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalMinutes * degreesPerMinute, 0f); secondsTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalSeconds * degreesPerSecond, 0f); } void UpdateDiscrete() { DateTime time = DateTime.Now; hoursTransform.localRotation = Quaternion.Euler(0f, time.Hour * degreesPerHour, 0f); minutesTransform.localRotation = Quaternion.Euler(0f, time.Minute * degreesPerMinute, 0f); secondsTransform.localRotation = Quaternion.Euler(0f, time.Second * degreesPerSecond, 0f); } }
具体是代码中就是先声明public三个移动的组件的实例,定义一个bool选项,三个常量,Update()方法是每帧调用一次,另外两个方法UpdateDiscreate()是离散的,运用DateTime类的实例time来获取当前系统时间,再运用三个实例组件的本地旋转角来接收绕y轴旋转的角度。UpdateContinuous()中为了能模仿时针是连续的,运用的TimeSpan类在System命名空间中,需要加上对应的命名空间,获取该实例现在一天的时间,不过其获取的时间是双精度的,而Euler方法要求单精度浮点,于是强制转换为float单精度类型。
三、项目的材料
https://pan.baidu.com/s/1VI63pEXnriQ6q9kApOuk_w