1. 如何让一个物体按照指定点进行旋转?

我们都知道transform.localRotation只能绕着中心点进行旋转。

方法一:采用Transform.RotateAround 方法旋转

方法二:为这个物体添加一个父对象,通过旋转父对象来旋转子物体。下面的代码采用的这种方式

2. 如何平滑的旋转呢?

直接在Update进行旋转即可。只要知道每分钟旋转多少度,每小时旋转多少度,每秒旋转多少度。

通过DateTime.Now.DayOfTime 拿到一个时间搓,然后得到总小时数、总分钟数、总秒数,都乘以度数即可。

3. 这个案例我们学到了什么?可以使用这些知识点做什么?

  1. 通过添加父物体的方式改变原本物体的轴心点

  2. 通过DateTime可以拿到当前的时间。能不能使用这个Api去优化之前的时间系统呢?

using System;
using UnityEngine;

namespace DY._01_创建一个时钟
{
    public class Markers : MonoBehaviour
    {
        public Transform markerParent;
        public GameObject markerPrefab;
        public float distance;

        [Header("时、分、秒")] public GameObject[] hand;

        private const float HoursToDegrees = 30f;
        private const float MinutesToDegrees = 6f;
        private const float SecondsToDegrees = 6f;

        private void Start()
        {
            Vector3 dir = Vector3.up * distance;
            // Instantiate(markerParent, )
            for (var i = 1; i <= 12; i++)
            {
                Instantiate(markerPrefab, transform.position + dir, Quaternion.Euler((i-1)*30,0,0), markerParent);
                dir = Quaternion.AngleAxis(30, i * Vector3.right) * dir;
            }
        }


        private void Update()
        {
            // 获得当天的时间
            TimeSpan dateTime = DateTime.Now.TimeOfDay;
            hand[0].transform.localRotation = Quaternion.Euler(HoursToDegrees * (float)dateTime.TotalHours, 0, 0);
            hand[1].transform.localRotation = Quaternion.Euler(MinutesToDegrees * (float)dateTime.TotalMinutes, 0, 0);
            hand[2].transform.localRotation = Quaternion.Euler(SecondsToDegrees * (float)dateTime.TotalSeconds, 0, 0);
        }
    }
}