using DG.Tweening; using UnityEngine; namespace Ichni.Story.UI { /// /// 对话时常驻转动的齿轮/轮盘,以及伴随浮动的指针。 /// public class DialogWheel : MonoBehaviour { [Header("轮盘旋转")] [Tooltip("要旋转的 RectTransform。如果不填,默认获取自身。")] public RectTransform wheelRect; [Tooltip("顺时针旋转一整圈(360度)所需的时间(秒)")] public float rotationCycleDuration = 5f; [Header("指针浮动")] [Tooltip("常驻上下浮动的指针对象 (RectTransform)")] public RectTransform pointerRect; [Tooltip("指针单向浮动的距离(像素)")] public float pointerFloatDistance = 5f; [Tooltip("指针完成单向浮动所需的时间")] public float pointerFloatDuration = 0.3f; private Tween _rotateTween; private Tween _pointerTween; private float _pointerStartY; private void Awake() { if (wheelRect == null) wheelRect = GetComponent(); if (pointerRect != null) { _pointerStartY = pointerRect.anchoredPosition.y; } } private void Start() { // 轮盘常驻匀速旋转 if (wheelRect != null && rotationCycleDuration > 0f) { // SetRelative(true) 保证无论当前角度是多少,都在其基础上转 -360 度 // LoopType.Restart 配合 Linear 缓动,实现无限丝滑旋转 _rotateTween = wheelRect.DORotate(new Vector3(0, 0, -360f), rotationCycleDuration, RotateMode.FastBeyond360) .SetRelative(true) .SetLoops(-1, LoopType.Restart) .SetEase(Ease.Linear); _rotateTween.Play(); } // 指针常驻浮动,启动后永不停止 if (pointerRect != null) { _pointerTween = pointerRect.DOAnchorPosY(_pointerStartY + pointerFloatDistance, pointerFloatDuration) .SetLoops(-1, LoopType.Yoyo) .SetEase(Ease.InOutSine); _pointerTween.Play(); } } private void OnDestroy() { _rotateTween?.Kill(); _pointerTween?.Kill(); } } }