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

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

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

(0)

相关推荐

  • Unity工具类之生成文本验证码

    本文实例为大家分享了Unity生成文本验证码的具体代码,供大家参考,具体内容如下 文本验证码 由于我经常使用Unity进行webgl版本的开发,看到网站上面用户登录有很多的验证码验证.借鉴相关博客,写了Unity的工具类文本验证码,代码如下: 工具类:VerificationCode using System.Collections; using System.Collections.Generic; using System.Text; /// <summary> /// 该工具类为:生成验

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

    当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到服务端消息,只涉及到本地存储,以下是我的解决方案: 直接上代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UniRx; using System; using System.IO; us

  • Vue简易注册页面+发送验证码功能的实现示例

    目录 1. 效果展示 2. 增强版验证码及邮件推送管理(见以后的博客) 3. 大致思路 4. 前期准备 5. 前端代码 6. 后端 1. 效果展示 2. 增强版验证码及邮件推送管理(见以后的博客) 3. 大致思路 用户角度分析一下注册时候的步骤: 填写自己的邮箱号 点击"发送验证码"按钮 邮箱中收到验证码 填写其余注册信息并填写验证码 注册成功! 系统设计者角度分析一下步骤: 系统随机生成六位数 根据用户提供的邮箱号将验证码发送到其邮箱 根据用户提供的信息,进行验证码的校验 如果校验成

  • jQuery实现订单提交页发送短信功能前端处理方法

    本文实例讲述了jQuery实现订单提交页发送短信功能前端处理方法.分享给大家供大家参考,具体如下: 1.效果如图所示: 2.html代码: <div class="indFpho" > <p>手机号码:</p> <p> <input type="text" name="telphone" id="telphone" value="{$order_info.cons

  • 输入法的回车与消息发送快捷键回车的冲突解决方法

    问题:在中文输入法输入文字时按ENTER键:绑定keyup事件会将输入法中的英文文字输入到文字框并直接触发发送按钮 键盘事件: 当一个按键被pressed或者released,在每一个浏览器中都可能会触发三种键盘事件 keydown keypress keyup keydown事件发生在按键被按下的时候,接着触发keypress,松开按键的时候触发keyup事件 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发keydown.keyup,回车

  • thinkphp,onethink和thinkox中验证码不显示的解决方法分析

    本文实例讲述了thinkphp,onethink和thinkox中验证码不显示的解决方法.分享给大家供大家参考,具体如下: 使用验证码的时候,一开始正常,后来不显示了 网上说是utf-8的编码问题,什么bom去掉,转化为无bom的格式 我都试了,没用 后来知道是在调用验证码的地方  写上 Public function verify(){ import('ORG.Util.Image'); Image::buildImageVerify(); } 改成这样就行了: Public function

  • thinkPHP显示不出验证码的原因与解决方法分析

    本文实例讲述了thinkPHP显示不出验证码的原因与解决方法.分享给大家供大家参考,具体如下: 今天到公司,svn update代码后,在浏览器上输入域名后,在验证码那块显示不出,找了半个上午,后来仔细看了下apache的配置文件 <VirtualHost *:80> ServerName admin.exam.com DocumentRoot E:/www/exam/trunk/server/Admin/ <Directory E:/www/exam/trunk/server/apps

  • C#验证码问题的快速解决方法

    代码如下: string ss = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; Random a = new Random(); int b; string yan = ""; for (int i = 0; i < 4; i++) { b = a.Next(62); yan += ss.Substring(b, 1); } Console.WriteLine("

  • Java实现发送短信验证码+redis限制发送的次数功能

    java实现短信验证码发送,由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册.这样的平台有很多,有的平台在新建账号的时候会附带赠几条免费短信.这里我仅做测试使用(具体哪个平台见参考三,很简单,注册账号就行,记得添加短信签名). 另外,在实际项目中,如果有人恶意攻击,不停的发送短信验证码,就会造成很大的损失.故对发送次数做一定的限制就非常必要,这里我们限制一个手机号一天可以发多少短信和短信平台无关. 这里采用的是存redis来实现这一个功能.就是每次调用发送验证码这个接口

  • vue3发送验证码倒计时功能的实现(防止连点、封装复用)

    目录 一.实现思路 二.实现一个简单的验证码倒计时 三.优化 四.逻辑封装 补充 mobileRule 一.实现思路 倒计时 流程图 二.实现一个简单的验证码倒计时 //倒计时初始变量 const codeNum = ref(60); // 定时器id let clearId: number; // 发送验证码 const sendCode = async () => { // 防止下次点击 如果倒计时的时间不是60 就不执行下面逻辑 if (codeNum.value != 60) retur

  • Rxjava实现发送验证码倒计时功能

    本文为大家分享了使用Rxjava做一个发送验证码倒计时,供大家参考,具体内容如下 首先在gradle添加依赖: compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.6' xml布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

随机推荐