76 lines
2.5 KiB
C#
76 lines
2.5 KiB
C#
using System;
|
|
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;
|
|
|
|
#endregion
|
|
|
|
private float _normalizePosX;
|
|
public event Action<bool> OnVerificationEnd;
|
|
|
|
private void Start()
|
|
{
|
|
StartVerification();
|
|
}
|
|
|
|
public void StartVerification()
|
|
{
|
|
_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)
|
|
{
|
|
StartVerification();
|
|
}
|
|
else
|
|
{
|
|
gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |