Unity3D 游戏开发应用篇——每日登陆(持久化类实现)
上一篇中我们实现用本地文件实现了持久化类的保存,当然小型数据用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 游戏开发应用篇——每日登陆(持久化类实现)的更多相关文章
- 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...
- unity3D游戏开发之详解Animation类和Animator类
详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读
---------------------------------------------------------------------------------------------------- ...
- NHibernate 之持久化类、拦截器 (第二篇)
一.持久化类中成员标量的要求 作为被NHibernate使用的持久化类,必须满足以下几点要求: 1.声明读写属性 在NHibernate的使用中,持久化类的成员变量必须声明对应的属性,NHiberna ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...
- [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse
---------------------------------------------------------------------------------------------------- ...
随机推荐
- AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出
概述 在使用Atomikos为ActiveMQ提供JTA支持时,Atomikos在控制台打印了繁琐的日志.这里介绍如何控制Atomikos日志输出的粒度. 解决方案 基于以下三个事实: Atomiko ...
- XForms标准介绍
XForms标准是真正实现展现与模型分离的.与客户端无关的展现服务标准. 1.XForms标准 XForms是W3C组织所推荐的下一代在线展现服务标准(早在2003年10月14日就被W3C推荐),它吸 ...
- .Net的基础概念
1,参数传递. 默认都是按值传递(无论引用还是值类型),也就意味着传递参数的一个副本给方法.之后在方法体内对参数的更改,对原始参数没有影响. 使用ref/out可以按引用传递,直接影响原始参数变量.两 ...
- 20140912-关于.NET技术体系的思维导图
逛园子时看到的. 关于.NET技术体系的思维导图
- Tomcat找不到service.bat文件
说明:我们给客户做安装包,Tomcat我们设置了编码和端口,所以用绿色版的,同时又要注册成windows服务.但是bin下面没有service.bat文件(tomcat6.exe,tomcat6x.e ...
- linux系统启动流程
BIOS: (Basic Input Output System)基本输入输出系统,一般保存在主板上的BIOS芯片中 BIOS是计算机启动时运行的第一个程序,负责检查硬件并且查找可启动设备. 可启动设 ...
- Sql 执行删除修改之前添加备份
backyw备份滴数据库名称,w20151124sendmaster 表名称 select * into backyw..w20151124sendmaster from Logistics.E ...
- 如何查看 Apache 的版本
查看 Apache 服务器版本的命令行为: httpd -v 或者 apachectl -v 例如:用 Xshell 连接到服务器后,输入:httpd -v 或者:apachectl -v 返回: S ...
- nginx配置:支持phpfastcgi,nginx和php-cgi通信,部分nginx常量解释
支持phpfastcgi的配置如下: server { listen 8000; server_name localhost; root F:/home/projects/test; i ...
- ASP.NET中的TextBox下划线
看到园子里一位同行写的 http://www.cnblogs.com/xiaopeng84/archive/2007/04/10/707093.html 但是没有贴出效果图,自己练了一下,贴出代码和效 ...