Unity登录注册时限制发送验证码次数功能的解决方法
作者:寻漠潇雨 时间:2021-12-28 00:27:12
当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到服务端消息,只涉及到本地存储,以下是我的解决方案:
直接上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UniRx;
using System;
using System.IO;
using System.Text;
using System.Globalization;
public class RegisterPanel : MonoBehaviour
{
private LoginUIPanel mLoginUIPanel;
StreamWriter writer;
StreamReader reader;
//本地存储手机号
private string set_phonenum;
//同一个手机号码使用次数
private int useNum=1;
FileInfo file;
private Button btn_GetMsgCode;
/**倒计时 */
private Text txt_CountDownTimer;
}
private void Awake()
{
//获取验证码按钮
btn_GetMsgCode = input_MsgCode.transform.Find("Btn_GetVerficationCode").GetComponent<Button>();
btn_GetMsgCode.onClick.AddListener(OnGetMsgCodeClick);
txt_CountDownTimer = btn_GetMsgCode.transform.Find("Text").GetComponent<Text>();
}
private void OnEnable()
{
ResetGetMsgCode();
}
/**
* 获取验证码
*/
private void OnGetMsgCodeClick()
{
if (!mLoginUIPanel.CheckGetMsgCode(input_Account.text))
{
Debug.Log("没有输入");
return;
}
set_phonenum = input_Account.text.ToString();
if (Limit())
{
Debug.Log("返回true");
return;
}
else
{
int timer = 60;
intervalStream = Observable.Interval(TimeSpan.FromSeconds(1))
.Where(value => { return timer > 1; })
.SubscribeToText(txt_CountDownTimer, value =>
{
btn_GetMsgCode.interactable = false;
return (timer--).ToString() + "秒";
});
//.AddTo(this); //绑定生命周期
timeStream = Observable.Timer(TimeSpan.FromSeconds(60))
.SubscribeToText(txt_CountDownTimer, _ =>
{
btn_GetMsgCode.interactable = true;
return "获取验证码";
});
//.AddTo(this);
}
}
private bool Limit()
{
if (PlayerPrefs.HasKey(set_phonenum))
{
mLoginUIPanel.ShowToast("号码已经被注册过!");
return true;
}
PlayerPrefs.SetString(set_phonenum, set_phonenum);
//Application.streamingAssetsPath
//获取当前时间天数
DateTime now = DateTime.Now;
DateTimeOffset nowtimesss = DateTimeOffset.Now;
string nowtime = now.Day.ToString();
string filenames = Application.dataPath+"/num.txt";
//写入当前次数
//第一次创建文件
FileInfo file = new FileInfo(filenames);
if (!file.Exists)
{
file.CreateText().Close();
file.CreationTimeUtc = nowtimesss.UtcDateTime;
Debug.Log("第一次创建" + file.CreationTimeUtc);
string bb = file.CreationTime.ToString();
char[] ss = new char[] {'/'};
string[] nnn = bb.Split(ss);
Debug.Log(nnn[1]);
PlayerPrefs.SetString("FileTime", nnn[1]);
PlayerPrefs.SetInt("i", 0);
}
if (Convert.ToInt32(nowtime)!=(Convert.ToInt32(PlayerPrefs.GetString("FileTime"))))
{
//刷新次数
Debug.Log("刷新");
FileStream stream = File.Open(filenames, FileMode.OpenOrCreate, FileAccess.Write);
stream.Seek(0, SeekOrigin.Begin);
stream.SetLength(0);
stream.Close();
//重置次数和时间
PlayerPrefs.SetInt("i", 0);
PlayerPrefs.SetString("FileTime", nowtime);
}
//再判断次数
//如果是当天
if ((Convert.ToInt32(PlayerPrefs.GetString("FileTime")))== Convert.ToInt32(nowtime))
{
Debug.Log("执行");
if (PlayerPrefs.GetInt("i") > 2)
{
Debug.Log("次数已达上限");
mLoginUIPanel.ShowToast("次数已达上限,请明天再来!");
return true;
}
WriteIntoTxt(useNum, filenames, file);
//读取本地数据
ReadOutTxt(filenames);
//排序
Allmytxt.Sort();
//对当前号码取最大值存入
PlayerPrefs.SetInt("i", Allmytxt[Allmytxt.Count - 1]);
useNum++;
int a = 3 - Allmytxt[Allmytxt.Count - 1];
mLoginUIPanel.ShowToast("今天还剩下"+ a+ "次注册机会");
Debug.Log(PlayerPrefs.GetInt("i"));
// Debug.Log("当前文件日期" + Convert.ToInt32(PlayerPrefs.GetString("FileTime")));
//先判断时间
return false;
}
return false;
}
/**
* reset重置倒计时·
*/
public void ResetGetMsgCode()
{
btn_GetMsgCode.interactable = true;
txt_CountDownTimer.text = "获取验证码";
}
//把所有的数据写入文本中
public void WriteIntoTxt(int message,string filename,FileInfo file)
{
// FileInfo file = new FileInfo(filename);
//最后一次修改日期并存储
if (!file.Exists)
{
writer = file.CreateText();
}
else
{
writer = file.AppendText();
}
writer.WriteLine(message);
writer.Flush();
writer.Dispose();
writer.Close();
string bb = file.LastAccessTime.ToString();
char[] ss = new char[] { '/' };
string[] nnn = bb.Split(ss);
Debug.Log(nnn[1]);
PlayerPrefs.SetString("FileTime", nnn[1]);
}
//读取次数 存储到列表中
public void ReadOutTxt(string filename)
{
Allmytxt.Clear();
reader = new StreamReader(filename, Encoding.UTF8);
string text;
int line = 0;
while ((text = reader.ReadLine()) != null)
{
++line;
// Allmytxt.Add(int.Parse(text));
}
//利用文本的行数来判断次数
Allmytxt.Add(line);
Debug.Log(line);
reader.Dispose();
reader.Close();
}
来源:https://blog.csdn.net/qq_36907428/article/details/97413556
标签:Unity,验证码
0
投稿
猜你喜欢
Java环境配置与编译运行详解
2022-10-02 12:42:24
SpringMVC中Controller类数据响应的方法
2021-10-07 21:00:08
DataBinding onClick的七种点击方式
2021-12-08 01:23:22
java使用正则表达校验手机号码示例(手机号码正则)
2022-04-07 20:37:04
springBoot加入thymeleaf模板的方式
2023-11-25 14:31:23
Spring boot搭建邮件服务的完整步骤
2023-07-20 06:58:34
Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗
2023-03-08 14:15:44
Ubuntu中为Android实现Application Frameworks层增加硬件访问服务
2021-05-28 14:20:02
C#中神器类BlockingCollection的实现详解
2022-10-13 07:41:02
AOP从静态代理到动态代理(Emit实现)详解
2023-11-27 14:49:56
C#集合之不变集合的用法
2023-06-15 14:03:31
java 学习笔记(入门篇)_多选择结构switch语句
2023-02-04 11:35:59
Java DWR内存泄漏问题解决方案
2022-02-28 02:35:07
Mybatis源码解析之事务管理
2023-01-14 10:59:34
java 深拷贝与浅拷贝机制详解
2023-02-18 19:00:59
java实现猜拳游戏
2023-08-04 04:23:52
java synchronized用法详解
2022-06-22 00:38:03
Java如何将ResultSet结果集遍历到List中
2022-07-01 06:30:46
Java File类提供的方法与操作
2023-08-29 09:10:41
Java封装、继承、多态三大特征的理解
2023-07-16 14:26:46