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);
}
}