using System; using AibisDream.Kit; using TMPro; using UnityEngine; using UnityEngine.UI; using Random = UnityEngine.Random; namespace AibisDream.FixSystem { /// /// 验证码系统 /// 随机出现,非阻塞 /// public class VerificationCodeSystem : MonoBehaviour { #region 必要组件 [SerializeField] private Image background; [SerializeField] private Image target; [SerializeField] private Image slot; [SerializeField] private SliderEx slider; [SerializeField] private TMP_Text infoText; #endregion private float _normalizePosX; public event Action OnVerificationEnd; public void StartVerification() { infoText.text = "请将图片拖动至对应位置"; gameObject.SetActive(true); _normalizePosX = Random.Range(0.4f, 0.9f); // 随机生成数据,包括Slot位置,有资源之后增加背景图 var slotWidth = target.rectTransform.rect.width; var backgroundWidth = background.rectTransform.rect.width - target.rectTransform.rect.width; var slotPosX = _normalizePosX * backgroundWidth + slotWidth / 2; slot.rectTransform.anchoredPosition = new Vector2(slotPosX, slot.rectTransform.anchoredPosition.y); // 初始化 target.rectTransform.anchoredPosition = new Vector2(slotWidth / 2, target.rectTransform.anchoredPosition.y); slider.value = 0; // 绑定事件 slider.onEndDrag.AddListener(OnRelease); slider.onValueChanged.AddListener(OnValueChange); } private void OnRelease(float value) { var isSuccess = Mathf.Abs(value - _normalizePosX) < 0.03f; OnVerificationEnd?.Invoke(isSuccess); slider.onValueChanged.RemoveAllListeners(); slider.onEndDrag.RemoveAllListeners(); // 如果失败就再来一次 if (!isSuccess) { infoText.text = "失败"; ActionKit.Delay(1f, StartVerification).Start(this); } else { infoText.text = "成功"; ActionKit.Delay(0.5f, () => gameObject.SetActive(false)).Start(this); } } private void OnValueChange(float value) { var slotWidth = target.rectTransform.rect.width; var backgroundWidth = background.rectTransform.rect.width - target.rectTransform.rect.width; var targetPosX = value * backgroundWidth + slotWidth / 2; target.rectTransform.anchoredPosition = new Vector2(targetPosX, target.rectTransform.anchoredPosition.y); } } }