验证码功能
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
namespace AibisDream.FixSystem
|
||||
{
|
||||
@@ -10,13 +11,66 @@ namespace AibisDream.FixSystem
|
||||
/// </summary>
|
||||
public class VerificationCodeSystem : MonoBehaviour
|
||||
{
|
||||
private Image _target;
|
||||
private Image _slot;
|
||||
private Slider _slider;
|
||||
|
||||
private void Awake()
|
||||
#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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user