Files
aibis-dream/Assets/Scripts/FixSystemNew/Open/DeepInClock.cs
T
2025-05-14 13:03:08 +08:00

91 lines
2.5 KiB
C#

using System;
using AibisDream.Framework;
using AibisDream.Kit;
using DG.Tweening;
using UnityEngine;
namespace AibisDream
{
public class DeepInClock : MonoBehaviour
{
#region 索引
private MinHand _minHand;
private Transform _secondHand;
private Transform _hourHand;
private SpriteLooper _cityLooper;
public event Action OnClockReached;
public event Action OnClockEnd;
#endregion
#region 参数
[Header("背景切换时长")] public int cityLoopDuration;
[Header("开头全程所需时间")] public float rotateSpeed;
private bool _isReached;
#endregion
// 按分钟计算,全程1440分钟
private BindProperty<float> _curTime;
public void Enable()
{
gameObject.SetActive(true);
_minHand = transform.Find("fenzhen").GetComponent<MinHand>();
_secondHand = transform.Find("miaozhen");
_hourHand = transform.Find("shizhen");
_cityLooper = transform.Find("City").GetComponent<SpriteLooper>();
_curTime = new BindProperty<float>();
_curTime.Register(UpdateCityLooper);
_minHand.OnMinHandReached += StartAutoRotate;
_minHand.OnMinHandChanged += UpdateCurTime;
_minHand.IsActive = true;
}
private void UpdateCityLooper(float curTime)
{
// 时间转为背景循环值
var loopValue = curTime % cityLoopDuration / cityLoopDuration;
_cityLooper.SetLoopProgress(loopValue);
// 处理时针
var hourNum = curTime / 1440;
_hourHand.eulerAngles = new Vector3(0, 0, hourNum * 360);
// 处理分针
var minNum = curTime % 60 / 60;
_minHand.transform.eulerAngles = new Vector3(0, 0, minNum * 360);
if (_curTime.Value > 1200 && !_isReached)
{
_isReached = true;
OnClockReached?.Invoke();
}
}
private void StartAutoRotate()
{
DOTween.To(() => _curTime.Value, value => _curTime.Value = value, 1440f, rotateSpeed)
.SetEase(Ease.InQuad).OnComplete(OnRotateEnd);
}
private void UpdateCurTime(float minHandAngle)
{
_curTime.Value = minHandAngle / 360 * 60;
}
private void OnRotateEnd()
{
gameObject.SetActive(false);
OnClockEnd?.Invoke();
}
}
}