版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
最近项目中涉及到一个功能:一天内生成的随机数不能重复,随机数取值范围为001到999,这就需要把Unity程序每次运行产生的随机数储存起来,这里我用的是把数据存储为Json对象,每次运行进行读取判断是否是同一天,如果是同一天那如何不产生重复的随机数?如果不是同一天清除掉前天的数据依次循环。
首先把创建Json文件放在Assets/StreamingAssets文件夹里命名 :JsonTest.json,格式如下:
上图为8月13号的json数据信息。8月14号运行之后如下
同一天继续运行一次,日期属性不变,随机数数量加1且不重复。
以此类推,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
//要存储为json的对象
[Serializable]
public class DayRangeMessage
{
public string date_time;//存储当天的日期
public List<int> rangelist; //一天之内每次运行程序生成的随机数列表
}
public class CreateNum : MonoBehaviour
{
string Todaydate;
string last_date;
string JsonPath;
string Id;
int max_Range;
//生成的随机数
int rangeNubers;
DayRangeMessage dayrangeMessagetemp;//要读取出来的对象
private void Start()
{
max_Range = 1000;//随机数取值范围的右区间最大值渠道999 UnityEngine.Random.Range(1, max_Range);
GetTodayDate();//获取当天日期
JsonPath = Application.streamingAssetsPath + "/JsonTest.json";
ReadJson();
}
//从本地读取json数据
public void ReadJson()
{
if (!File.Exists(JsonPath))
{
Debug.LogError("读取的文件不存在!");
return;
}
string json = File.ReadAllText(JsonPath);
dayrangeMessagetemp = JsonUtility.FromJson<DayRangeMessage>(json);
last_date = dayrangeMessagetemp.date_time;
if (last_date != Todaydate)
{
Debug.LogError("不是同一天");
dayrangeMessagetemp.date_time = Todaydate;//
dayrangeMessagetemp.rangelist.Clear();//不是同一天清除json文件里原先生成的随机数
CreateRangeNum();
}
else
{
Debug.LogError("是同一天");
CreateRangeNum();
}
////获取第二个属性:
//for (int j = 0; j < dayrangeMessagetemp.rangelist.Count; j++)
//{
// Debug.Log(dayrangeMessagetemp.rangelist[j]);
//}
}
public void SaveJson()
{
//如果本地没有对应的json 文件,重新创建
if (!File.Exists(JsonPath))
{
File.Create(JsonPath);
}
string json = JsonUtility.ToJson(dayrangeMessagetemp, true);
File.WriteAllText(JsonPath, json);
Debug.Log("保存成功");
}
#region 同一天内每运行一次生成一个随机数存到本地Json数据里
//产生的随机数放在列表里
public void CreateRangeNum()
{
while (dayrangeMessagetemp.rangelist.Count < max_Range)
{
rangeNubers = UnityEngine.Random.Range(0, max_Range);//随机数取值范围是0到999
if (!dayrangeMessagetemp.rangelist.Contains(rangeNubers))
{
dayrangeMessagetemp.rangelist.Add(rangeNubers);
//rangeNubers.ToString().Length判断随机数是个位数还是十位数
switch (rangeNubers.ToString().Length)
{
case 1:
Id = "00" + rangeNubers.ToString();
break;
case 2:
Id = "0" + rangeNubers.ToString();
break;
case 3:
Id = rangeNubers.ToString();
break;
}
Debug.LogError(Id + "身份证明");
return;//找到满足条件后结束循环,否则继续循环
}
else
{
continue;
}
}
if (dayrangeMessagetemp.rangelist.Count >= max_Range)
{
Debug.LogError("超出了随机数的最大取值");
}
}
private void OnDisable()
{
SaveJson();//程序关闭自动保存数据
}
#endregion
/// <summary>
/// 获取当天日期
/// </summary>
public void GetTodayDate()
{
DateTime nowDateTime = DateTime.Now;
int int_NewYear = nowDateTime.Year;
int int_NewMouth = nowDateTime.Month;
int int_NewDay = nowDateTime.Day;
Todaydate = int_NewYear + "年" + int_NewMouth + "月" + int_NewDay + "号";
}
#region 初始化Json格式用的
//DayRangeMessage dayrangeMessage;//要存起来的对象
//void InitJsonData()
//{
// dayrangeMessage = new DayRangeMessage();//实例化对象
// //给DayRangeMessage对象的第一个属性date_time赋值
// dayrangeMessage.date_time = Todaydate;
// //给DayRangeMessage对象的第二个属性rangelist赋值
// dayrangeMessage.rangelist = new List<int>();
// dayrangeMessage.rangelist.Add(10);
// dayrangeMessage.rangelist.Add(12);
//}
#endregion
}