Unity登录注册时限制发送验证码次数功能的解决方法

所属分类: 软件编程 / C#教程 阅读数: 87
收藏 0 赞 0 分享

当我们需要在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();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C#获取并修改文件扩展名的方法

这篇文章主要介绍了C#获取并修改文件扩展名的方法,实例分析了C#编程方式修改文件扩展名的技巧,涉及Path类的使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历操作系统下所有驱动器的方法

这篇文章主要介绍了C#遍历操作系统下所有驱动器的方法,涉及C#中DriveInfo类GetDrivers方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历指定目录下所有文件的方法

这篇文章主要介绍了C#遍历指定目录下所有文件的方法,实例分析了C#中GetFiles()方法遍历文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#拷贝文件简单实现方法

这篇文章主要介绍了C#拷贝文件简单实现方法,主要分析了FileInfo类中CopyTo方法针对文件复制的操作技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#获取文件相关信息的方法

这篇文章主要介绍了C#获取文件相关信息的方法,涉及C#中FileInfo类的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#交错数组用法实例

这篇文章主要介绍了C#交错数组用法,较为详细的分析了交错数组的概念、用法并实例分析了交错数组的使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现在前端网页弹出警告对话框(alert)的方法

这篇文章主要介绍了C#实现在前端网页弹出警告对话框(alert)的方法,涉及C#通过自定义函数调用window.alert方法弹出对话框的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现控制Windows系统关机、重启和注销的方法

这篇文章主要介绍了C#实现控制Windows系统关机、重启和注销的方法,涉及C#调用windows系统命令实现控制开机、关机等操作的技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取Excel并转化成XML的方法

这篇文章主要介绍了C#读取Excel并转化成XML的方法,实例分析了C#操作Excel及XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#创建一个Word并打开的方法

这篇文章主要介绍了C#创建一个Word并打开的方法,实例分析了C#操作word的常用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多