unity实现一个钟表小程序

一直在学习的路上摸索,越发感觉要学的东西越来越多,但是终归还是离不开“实践”两字,真所谓实践出真知

偶尔翻到了一个外国程序小哥的博客,跟着实现了一个简单的时钟功能,功能简单,但是也有一些技巧性,步骤如下

  • 创建表盘

  1. 首先在场景中创建一个空物体,Create Empty,命名为clock。然后创建一个柱体Cylinder.命名为ClockFace,也就是我们的表盘。

unity实现一个钟表小程序_第1张图片

2.更改表盘的缩放值,如下

unity实现一个钟表小程序_第2张图片

3.然后表盘雏形就出来了

unity实现一个钟表小程序_第3张图片

创建钟表格子

先创建一个cube,调整其缩放和位置如下:

unity实现一个钟表小程序_第4张图片unity实现一个钟表小程序_第5张图片

接着制作其他11个表示表盘点,在这里有一个小技巧。先创建一个空物体,命名为Temp,Reset其Tranform值,这样就保证了temp的原点和表盘的原点在在一起,把上述cube拖拽到Temp下面,把cube拖拽到Temp后,复制该Temp 11次

unity实现一个钟表小程序_第6张图片

接着计算每个每个temp的旋转角度,表盘一周是360度,12个格子,那么每个格子就30度值递增下去就行了,也就是temp 的旋转着(0,0,0)temp1就是(0,30,0)temp2(0,60,0).....以此类推,设置好之后,在依次把cube从temp下拖出来依次按时钟点数命名,然后删除temp最终表盘整体就完成了

unity实现一个钟表小程序_第7张图片unity实现一个钟表小程序_第8张图片

接下来就是写代码了,代码逻辑很简单,直接带注释全部贴出来,把脚本挂在Clock上,把时针,分针,秒针拖进去,如下

unity实现一个钟表小程序_第9张图片

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/

你可能感兴趣的:(unity实践动手系列)