上一篇中我们实现用本地文件实现了持久化类的保存,当然小型数据用PlayerPrefs存储,或者采用XML服务器持久化也行。因为我涉及的角色类和玩家类数据比较多,加上项目要求尽量少与服务器交互,所以采用了本地持久化。废话不多说,进入主题

一、应用场景

  

  项目要实现这么一个每日登陆的功能,设计如下:

  我们假设每天9点刷新登陆奖励,中断一天则从第一天开始:

  

  初步设想是每日登陆奖励必须有网的情况下才能领取,通过服务器逻辑验证上一次领取时间和登陆时间,产生对应的奖励界面。

  至于领取时间可以采用服务器自动刷新和玩家手动刷新,这里我选择了手动刷新。

  注意,最好不要采用本地时间为基准。

二、设计思路

  玩家持久化类中增加一个领取奖励时间变量,规则如下:

  在每次登陆游戏联网的时候得到服务器的标准网络时间,和上一次的领取奖励时间进行逻辑判断。

  有以下三种情况:

  领取奖励时间为null:

  领取奖励时间和联网验证时间在同一天:

  领取奖励时间和联网验证时间不在同一天:

  逻辑图如下:

  

  

  至于领取时间刷新,则如下图所示有两种情况:

  一、服务器判断逻辑之后自动给客户端刷新

  二、客户端手动刷新

  

三、核心代码

  //进行联网验证

  

if (DebugUtils.HasConnection() && Globals.Me != null)
{ Globals.NetWorkAvailable = true;
//请求服务器刷新
StartCoroutine(UpdateLoginTime());
} public IEnumerator UpdateLoginTime()
{
Debug.Log("privious time is " + Globals.Me.LoginDateTime);
if (!Globals.NetWorkAvailable)
yield break; WWW www = new WWW(GameUrl.Time_Url);
yield return www;
//有错误
#region
if (www.error != null)
{
Utils.WriteLog("UpdateLoginTime" + www.error);
MsgBox.Show("亲 网络有问题哦");
Globals.NetWorkAvailable = false;
}
#endregion
else
{
//解析网络时间
#region
string[] tempArray = www.text.Split(';');
for (int i = ; i < tempArray.Length; i++)
{
tempArray[i] = tempArray[i].Replace("\r\n", "");
}
string year = tempArray[].Split('=')[];
string month = tempArray[].Split('=')[];
string day = tempArray[].Split('=')[];
string hour = tempArray[].Split('=')[];
string minite = tempArray[].Split('=')[];
string second = tempArray[].Split('=')[];
DateTime tmp = DateTime.Parse(year + "-" + month + "-" + day + " " + hour + ":" + minite + ":" + second);
#endregion
Debug.Log("update time" + tmp);
//第一次更新
//这里是服务器逻辑判断
#region
if (Globals.Me.LoginDateTime == null)
{
//调用第一天第一次奖励
if (!PlayerPrefs.HasKey("Reward_Level")){
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("first" + PlayerPrefs.GetInt("Reward_Level"));
}
else {
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("first" + PlayerPrefs.GetInt("Reward_Level"));
}
Create_Login_Reward(tmp);
}
#endregion
//不是第一次
else {
//不是同一天更新
#region
if (!isSameDay(tmp))
{
//是连续更新
#region
if (isContinue(tmp))
{
PlayerPrefs.SetInt("Reward_Level", ((PlayerPrefs.GetInt("Reward_Level") + ) % ));
Debug.Log("then" + PlayerPrefs.GetInt("Reward_Level"));
}
#endregion
//不是连续更新
#region
else
{
//调用第一天奖励
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("Reset" + PlayerPrefs.GetInt("Reward_Level"));
}
#endregion Create_Login_Reward(tmp);
}
#endregion
//同一天
#region
else
{
Create_Normal();
}
#endregion }
}
}

  //根据联网的服务器逻辑产生对应的奖励列表

 //satisfy update reward condition
//called by other
public void Update_Reward(DateTime updatetime)
{ #region
foreach (Transform child in transform)
{
if (child.name.Contains("_"))
{
int Reward_Level = PlayerPrefs.GetInt("Reward_Level");
//check Reward_Level day
#region
if (int.Parse(child.name.Split('_')[]) == Reward_Level)
{
child.GetChild().active = true;
Set_Refresh(int.Parse(child.name.Split('_')[]) * , updatetime);
}
else
{
child.GetChild().active = false;
}
#endregion //yellow <= Reward_Level
//blue > Reward_Level
#region
if (int.Parse(child.name.Split('_')[]) <= Reward_Level)
{
//yellow
child.GetComponent<ButtonNormal>().OnMouseDown();
}
else
{
//blue
child.GetComponent<ButtonNormal>().OnMouseUpAsButton();
}
#endregion
}
}
#endregion
} public void Set_Refresh(int Add_Number,DateTime RefreshDateTime) {
UI_Get_LoginReword tmp = transform.Find("Get").GetComponent<UI_Get_LoginReword>();
tmp.Add_Number = Add_Number;
tmp.RefreshDateTime = RefreshDateTime;
}

  //采用手动刷新 这里是按下领取奖励按钮之后

public void OnMouseUpAsButton()
{ //print("you enter is " + transform.name);
base.OnMouseUpAsButton(); if (Add_Number != && RefreshDateTime!=DateTime.MinValue) {
//print(Add_Number + "add is ");
//Globals.Me.LoginDateTime = new Nullable<DateTime>(currentTime);
Globals.Me.LoginDateTime = RefreshDateTime;
print("RefreshDateTime is " + Globals.Me.LoginDateTime);
Globals.Me.Gold_Number += Add_Number;
}
}

四、总结

  这里把服务器逻辑放在本地,其实应该放在服务器上的,后期可以考虑采用服务器判断。

  

  

Unity3D 游戏开发应用篇——每日登陆(持久化类实现)的更多相关文章

  1. 【Unity3D游戏开发】之全局管理类的几种方式 (十六)

    如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...

  2. unity3D游戏开发之详解Animation类和Animator类

    详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...

  3. [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读

    ---------------------------------------------------------------------------------------------------- ...

  4. NHibernate 之持久化类、拦截器 (第二篇)

    一.持久化类中成员标量的要求 作为被NHibernate使用的持久化类,必须满足以下几点要求: 1.声明读写属性 在NHibernate的使用中,持久化类的成员变量必须声明对应的属性,NHiberna ...

  5. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  6. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  7. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  8. [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

    大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...

  9. [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. MYSQL序言

    我写MYSQL的文章主要的原因:我发现网上关于MYSQL的文章比较少,而且很多都是参差不齐,几乎找不到可以比较全面的介绍:例如一篇文章介绍如何增删改查,却没有介绍批量新增:于是下次工作中用到的时候又要 ...

  2. android 数据库的增删改查的另一种方式

    老师笔记 # 3 Android下另外一种增删改查方式         1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象 2.使用Sq ...

  3. IE Problem : inetcpl.cpl

    从windows8升级windows8.1后每次关闭ie11浏览器总是跳出出现一个问题导致关闭,我都快疯了,以前windows8一点问题都没有.这是怎么回事?还有能回到ie10吗?(张浩228) 小昕 ...

  4. 《squid网卡代理的实现》RHEL6.3——条理清晰,步骤明确

    网卡的代理和FQ差不多一个道理.ping 不通不代表不能上网. 实验的目的: 打开2台虚拟主机,一台2个网卡(这台为服务器):一台一个网卡: 2块网卡的服务器使用静态ip可以上网,也就是说网段为1的可 ...

  5. VHDL基本常识

    std_logic_vector和integer需要通过signed或unsigned进行间接转换(强制转换) a_std <= std_logic_vector(to_unsigned(a_i ...

  6. Source Insight建工程之Kernel

     不管你是从事于Linux内核工作还是出于兴趣爱好,Linux内核源码都是非常好的学习资源.意味着就要经常的和内核源码大交道,那么软件工具就是少不了的.在Windows系统上确实有着许多好用的软件 ...

  7. HTML5+CSS3+JQuery打造自定义视频播放器

    来源:http://www.html5china.com/HTML5features/video/201109206_1994.html 简介HTML5的<video>标签已经被目前大多数 ...

  8. 【zendstudio】如何利用zendstudio新建 或导入php项目

    一.利用ZendStudio创建 PHP Project 1. 打开ZendStudio, 选择:File à New à PHP Project, 如下图所示: 于是弹出如下界面: 在”Projec ...

  9. vmware虚拟机上网:host-only

    host-only配置 首先主机:vmware1要能共享本地连接这个网络,共享后vmware的ip会自动设置为如图 其次,vmware网络设置如图 最后,虚拟机设置如图 这样,主机与虚拟机之间就能pi ...

  10. How to force to Fullscreen Form

    Is it possibile by code resize a form to fullscreen? (like button Maximize) ? // VAR Changed on 10 J ...