Unity-时钟MR效果

159 阅读3分钟
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Clock : MonoBehaviour
{

    //public Transform HoursTransform;//小时臂
    //public Transform minutesTransform;//分钟臂
    //public Transform secondsTransform;//秒钟臂
    public Transform HoursTransform,MinutesTransform,SecondsTransform;//小时臂 
    //在编辑器中连接三个臂。

    //时钟的旋转臂均缓慢旋转,可以模拟时间
    public bool continuous;//分别为on和off  

    const float degreesPerHour = 30f, DegreesPerMinute = 6f, degreePerSecond = 6f;//旋转角度 一分钟和一秒钟都占了6度。

    /// <summary>
    /// private 私有方法Awake(),不公开
    /// 
    /// Unity认为Awake和一些其他方法很特殊。
    /// 无论我们如何声明它们,它都会找到它们并在适当时调用它们。
    /// 我们不应该公开这些方法,因为除Unity引擎外,它们不打算被任何其他方法调用。
    /// </summary>
    private void Awake()
    {
        //知道时间
        //Debug.Log("当前时间:"+DateTime.Now);
        /**
         * 旋转指针手臂
         * 
         * 旋转以四元数形式存储在Unity中。
         * 我们可以通过公开可用的Quaternion.Euler方法创建一个。
         * 它具有X,Y和Z轴的规则角度作为参数,并生成适当的四元数。
         * 
         * 四元数基于复数,用于表示3D旋转。
         * 尽管比简单的3D向量更难理解,但它们具有一些有用的特性。
         * 例如,他们不会遭受万向节锁定的困扰。
         * UnityEngine.Quaternion用作简单值。它是一个结构,而不是一个类。
         */
        // Quaternion.Euler(0f, DateTime.Now.Hour, 0f);时钟具有以30°间隔设置的十二小时指示器。
        //为了使旋转与之匹配,我们必须将小时数乘以30。乘以星号完成。
        // Quaternion.Euler(0f,DateTime.Now.Hour*30f,0f);

        /**
         * 每小时的度数不应改变。
         * 我们可以通过在const声明中添加前缀来强制执行此操作。
         * 这变成degreesPerHour一个常数。
         * 
         * const关键字表示值永远不会改变,也不需要成为一个领域。
         * 取而代之的是,将在编译期间计算其值,并替换该常量的所有用法。
         * 这仅适用于诸如数字之类的原始类型
         * 
         * 
        */
        const float degreesPerHour = 30f,DegreesPerMinute = 6f,degreePerSecond = 6f;//旋转角度 一分钟和一秒钟都占了6度。
        //Quaternion.Euler(0f,DateTime.Now.Hour*degreesPerHour,0f);
        //将其应用于小时臂,我们必须将其分配给localRotation其transform组件的属性
        /**
         * localRotation指变换组件的实际旋转,独立于其父级的旋转。
         * 换句话说,它是对象局部空间中的旋转。
         * 它就是在检查器的转换组件中显示的内容。
         * 因此,如果我们要旋转时钟的根对象,它的臂就会像我们期望的那样一起旋转。
还有一个rotation财产。它指的是转换组件在世界空间中的最终旋转,并考虑了其父级的转换。
        否则,旋转时钟时机械臂将无法调整,因为时钟的旋转将得到补偿。
         * 
         */
        //HoursTransform.localRotation = Quaternion.Euler(0f,DateTime.Now.Hour*degreesPerHour,0f);
        DateTime time = DateTime.Now;//TODO 当前时间 遍历该属性导致不同的时间值,解决方法:内部声明一个变量并为其分配时间
        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 * degreePerSecond, 0f);
        Debug.Log("Hours "+ time.Hour +" Minute "+time.Minute+" Second "+time.Second);

        //制作动画手臂
        //Animating
    }
    private void Update()
    {
        if (continuous)
        {
            OnUpdateCounit();
        }
        else 
        {
            OffUpdateCounit();
        }
    

    }
    //打开 显示小时,分钟和秒的分数--旋转臂均缓慢旋转,可以模拟时间 
    void OnUpdateCounit() 
    {
        //DateTime它不包含方便的分数数据。
        //幸运的是,它确实有一个TimeOfDay属性。这为我们提供了一个TimeSpan包含所需格式的数据的值
        TimeSpan time = DateTime.Now.TimeOfDay;//TODO 当前时间 遍历该属性导致不同的时间值,解决方法:内部声明一个变量并为其分配时间
        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 * degreePerSecond, 0f);

      
       
    }
    //关闭 显示小时,分钟和秒的分数
    void OffUpdateCounit()
    {
        DateTime time = DateTime.Now;//TODO 当前时间 遍历该属性导致不同的时间值,解决方法:内部声明一个变量并为其分配时间
        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 * degreePerSecond, 0f);
    }

}