一直在学习的路上摸索,越发感觉要学的东西越来越多,但是终归还是离不开“实践”两字,真所谓实践出真知
偶尔翻到了一个外国程序小哥的博客,跟着实现了一个简单的时钟功能,功能简单,但是也有一些技巧性,步骤如下
-
创建表盘
- 首先在场景中创建一个空物体,Create Empty,命名为clock。然后创建一个柱体Cylinder.命名为ClockFace,也就是我们的表盘。
2.更改表盘的缩放值,如下
3.然后表盘雏形就出来了
创建钟表格子
先创建一个cube,调整其缩放和位置如下:
接着制作其他11个表示表盘点,在这里有一个小技巧。先创建一个空物体,命名为Temp,Reset其Tranform值,这样就保证了temp的原点和表盘的原点在在一起,把上述cube拖拽到Temp下面,把cube拖拽到Temp后,复制该Temp 11次
接着计算每个每个temp的旋转角度,表盘一周是360度,12个格子,那么每个格子就30度值递增下去就行了,也就是temp 的旋转着(0,0,0)temp1就是(0,30,0)temp2(0,60,0).....以此类推,设置好之后,在依次把cube从temp下拖出来依次按时钟点数命名,然后删除temp最终表盘整体就完成了
接下来就是写代码了,代码逻辑很简单,直接带注释全部贴出来,把脚本挂在Clock上,把时针,分针,秒针拖进去,如下
public class Clock : MonoBehaviour
{
// Start is called before the first frame update
public Transform hourArm;
public Transform minitueArm;
public Transform secondArm;
private float degreesPerHour = 30f;//一周12小时,所以每小时的度数是30度
private float degreesPerMinute = 6f;//一小时60分,所以每分钟度数是6
private float degreesPerSec = 6f;//一分钟60秒,所以没秒度数是6
public bool continuous;//秒针是否平滑过渡,还是一秒一秒的旋转
private DateTime date;
// Update is called once per frame
void Update()
{
if (continuous)
{
UpdateContinuous();
}
else
{
UpdateDiscrete();
}
}
void UpdateContinuous()
{
TimeSpan time = DateTime.Now.TimeOfDay;
hourArm.localRotation =
Quaternion.Euler(0f, (float)time.TotalHours * degreesPerHour, 0f);
minitueArm.localRotation =
Quaternion.Euler(0f, (float)time.TotalMinutes * degreesPerMinute, 0f);
secondArm.localRotation =
Quaternion.Euler(0f, (float)time.TotalSeconds * degreesPerSec, 0f);
}
void UpdateDiscrete()
{
DateTime time = DateTime.Now;
hourArm.localRotation =
Quaternion.Euler(0f, time.Hour * degreesPerHour, 0f);
minitueArm.localRotation =
Quaternion.Euler(0f, time.Minute * degreesPerMinute, 0f);
secondArm.localRotation =
Quaternion.Euler(0f, time.Second * degreesPerSec, 0f);
}
}
这样一个简单的钟表功能就完成了
参考文章:https://catlikecoding.com/unity/tutorials/basics/game-objects-and-scripts/