Files
aibis-dream/Assets/Scripts/FixSystemNew/WhackMole/VerificationCodeSystem.cs
T
2025-08-11 19:34:53 +08:00

78 lines
2.8 KiB
C#

using System;
using AibisDream.Kit;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
namespace AibisDream.FixSystem
{
/// <summary>
/// 验证码系统
/// 随机出现,非阻塞
/// </summary>
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<bool> 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);
}
}
}