unity学习笔记-时钟

unity学习笔记

  • 实现时钟的显示
    • 思路
    • 代码

实现时钟的显示

思路

先获得程序中的时间戳或时间,然后对其进行格式的转换,从而获得时分秒的数据——这里建议写个方法,方便调用
然后是在场景中放置一个时钟的物体,其中的时分秒记得要分开,如果是一个整体的话是不能分别控制的
这里有一个需要注意的地方,就是导入的时候,程序默认给你的锚点是中心,但是我们想要的是以时针的屁股为锚点的旋转,所以这里我的方法是给时分秒三个针分别创建一个父级的空对象(这个空对象最好是在时分秒的父级下创建,这样他会自动对齐到中心),然后将他的组件里的transform改成rectransform,这个直接点击add component找,然后添加就可以,程序会自动替代的
接着就是代码,在update方法里调用获得时分秒数据的方法,然后根据这些数据转换为时分秒在场景中的旋转角度即可
要用到的方法和类有
transform.localRotation 这个是设置物体的局部旋转
Quaternion.Euler这个是控制物体的旋转角度的
secondPre.GetComponent().eulerAngles.y这个是获得物体当前旋转角度的
string.Format("{0:T}", System.DateTime.Now).Split(’:’)这个是获得时间并格式转换的

代码

    // Update is called once per frame
    private GameObject hourPre;
    private GameObject minutePre;
    private GameObject secondPre;
    private string[] times;
    private int hour;
    private int minute;
    private int second;
    private bool secToMin = false;
    private bool minToHour = false;
    private void Start()
    {
        hourPre = GameObject.Find("hour");
        minutePre = GameObject.Find("minute");
        secondPre = GameObject.Find("second");
        times = getNetTIme();
        hour = int.Parse(times[0]);
        minute = int.Parse(times[1]);
        minutePre.transform.localRotation = Quaternion.Euler(0, 0, minute * 6);
        if (hour>12)
        {
            hourPre.transform.localRotation = Quaternion.Euler(0, 0, (hour-12) * 30);
        }
        else
            hourPre.transform.localRotation = Quaternion.Euler(0, 0, hour * 30);
    }
    void Update()
    {
        times = getNetTIme();
        second = int.Parse(times[2]);
        secondPre.transform.localRotation = Quaternion.Euler(0, 0, second * 6);
        if (Mathf.Floor(secondPre.GetComponent<RectTransform>().eulerAngles.y)==180)
        {
            minute = int.Parse(getNetTIme()[1]);
            minutePre.transform.localRotation = Quaternion.Euler(0,0,minute*6);
            if (minutePre.GetComponent<RectTransform>().eulerAngles.y == 180)
            {
                hour = int.Parse(getNetTIme()[2]);
                if (hour > 12)
                {
                    hourPre.transform.localRotation = Quaternion.Euler(0, 0, (hour-12) * 30);
                }
                else
                    hourPre.transform.localRotation = Quaternion.Euler(0, 0, hour * 30);
            }
        }
    }
    string[] getNetTIme()
    {
        return string.Format("{0:T}", System.DateTime.Now).Split(':');//编辑器的本地时间比正常的时间要慢8h,这里测试需要先加8h,真机时要去掉
    }

这里小弟有一个疑问,如果在update里一直这样调用方法,会不会加大程序的运行内存或者运行压力,我在使用的时候没有强烈的感觉到,但是实际会不会就不清除了,如果有大佬知道的话可以告知一下吗
总结:这个用到的方法不多,不过得找到对应的方法和类,这一步比较难,后面的都没什么
btw,本来是想着时钟在移动的时候是连续的,但是使用Time.deltaTIme这个方法不同的设备好像是会有不同的反应的,这样的话不利于兼容,而且这个不好写,因为是在update里执行的,对秒数进分钟的时候不好判断

你可能感兴趣的:(unity,unity)