这次是Unity3D的一次练手
教程来自:
时钟教程
为什么明明有教程我还要重新写一遍博客呢?
因为对于我来说,写博客已经是复习的主要手段了。
而且教程里很多的都是非常基础的东西,我在博客里面会精简,挑出重点,方便一些有基础的朋友们观看。
那么话不多说我们开始:
首先是场景的搭建:搭建一个时钟
这里非常值得一提的是,每一个刻度点是基于在原点的父结点来操作的,每一个父子结点组旋转30度,就可以得到时钟大概的样子
之后把这些结点与父节点脱钩(按住ctrl多选拖动),Unity会自动保存相对位置信息,然后就可以把父节点删掉了。
最终场景:
然后开始写Clock的脚本“Clock”代码加注释如下:
using UnityEngine;
using System;
// MonoBehaviour代表我们自定的这个脚本是否能够像其他组件一样绑定到游戏对象上
// 如果想让自己写的代码能够绑定到游戏对象,那么就必须从这个类继承
public class Clock : MonoBehaviour
{
const float degressPerHour = 30f;//每一次的旋转角度,const来表示这是一个常量
//const标识的值可以让编译器省去一些复制和储存,提高性能
const float degressPerMinutes = 6f;//假设分为60格,每一个格子6°
const float degressPerSeconds = 6f;
public Transform hoursTransform;
public Transform minutesTransform;
public Transform secondsTransform;
public bool continuous;//是否启用连续功能
void UpdateContinuous() {//连续转动指针
//TimeSpan结构表示一个时间间隔
TimeSpan time = DateTime.Now.TimeOfDay;//用time缓存变量,可以节省很多性能开销
//Time.time记录的是Unity启动运行之后到现在的时间
//访问系统时间需要DataTime结构,是C#语言的类型,包含在System的命名空间下
hoursTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalHours *degressPerHour, 0f);//沿着y轴旋转
minutesTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalMinutes*degressPerMinutes,0f);
secondsTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalSeconds*degressPerSeconds,0f);
}
void UpdateDiscrete() {//不连续转动指针
DateTime time = DateTime.Now;//用time缓存变量,可以节省很多性能开销
//Time.time记录的是Unity启动运行之后到现在的时间
//访问系统时间需要DataTime结构,是C#语言的类型,包含在System的命名空间下
hoursTransform.localRotation = Quaternion.Euler(0f, time.Hour *degressPerHour, 0f);//沿着y轴旋转
minutesTransform.localRotation = Quaternion.Euler(0f, time.Minute*degressPerMinutes,0f);
secondsTransform.localRotation = Quaternion.Euler(0f, time.Second*degressPerSeconds,0f);
}
void Update() {
if(continuous){
UpdateContinuous();
}
else{
UpdateDiscrete();
}
}
}
记得讲Public的时针、分针和秒针赋值
多提一句:最后使用TimeSpan实现连续指针转动是因为TimeSpan可以表示3.5,4.5,4.4小时这些值,但是DateTime就不行。所以造成了DateTime每次获取的值都是一个值,然后机械的去旋转指针。(类似积分那样累计最小值?这个比喻我也不知道恰不恰当)
其它的一些细节我都加在代码的注释里了。
连续旋转的效果如下:
本次基础练习到此为止。