本文实例为大家分享了Unity3D获取时间戳或北京时间的具体代码,供大家参考,具体内容如下 单机游戏因为没有服务器下发时间戳所以要自己获取,当然也可以用现成的时间API来获取。 如果获取本地时间,会导致玩家随意修改日期来达到数据更改,如每日奖品、每日奖励等等。 单机游戏本来就不要网络的,可是获取时间需要网络,这有点矛盾,有没有谁有更好的解决方案呢? using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Text.Reg 在Unity3D中,开发单机游戏时,获取准确的时间戳和北京时间是非常重要的,特别是当涉及到游戏内的一些计时机制,如每日奖励、活动计时等。然而,由于单机游戏通常不依赖网络,直接获取本地时间容易被玩家通过修改系统时间来作弊。因此,我们需要寻找一种方式来获取不受本地时间影响的准确时间。 本实例提供了一个使用Unity3D获取北京时间的解决方案,主要通过向网络请求获取服务器时间来避免玩家篡改。以下是实现这一功能的关键代码: ```csharp using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine(GetBeiJingTime()); Console.ReadKey(); } public static string GetBeiJingTime() { bool isget = false; string result = string.Empty; try { // 创建一个HTTP Web请求到百度的北京时间API HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://open.baidu.com/special/time/"); // 添加请求头,指定内容类型 req.Headers.Add("content", "text/html; charset=gbk"); // 获取响应 HttpWebResponse res = (HttpWebResponse)req.GetResponse(); // 从响应中读取流并解码为GBK编码的字符串 Stream stream = res.GetResponseStream(); StreamReader sr = new StreamReader(stream, Encoding.GetEncoding("gbk")); string html = sr.ReadToEnd(); // 使用正则表达式提取HTML中的时间戳 Func<string, string> f1 = (p) => { Regex reg = new Regex("(?<=baidu_time\\().*?(?=\\))"); return reg.Matches(p)[0].Value; }; // 提取的时间戳是2000年之后的秒数,将其转换为完整的毫秒数 string time = f1(html).Substring(0, 10); long lTime = long.Parse(time + "0000000"); // 将时间戳转换为DateTime对象 DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); TimeSpan toNow = new TimeSpan(lTime); result = dtStart.Add(toNow).ToString("yyyyMMdd"); // 如果成功获取时间,设置标志为true isget = true; } catch (Exception) { } finally { // 如果无法获取网络时间,返回默认值19700101 if (!isget) result = "19700101"; } return result; } } } ``` 这段代码首先创建了一个`HttpWebRequest`对象,指向百度提供的一个公开的北京时间API。接着,它设置了请求头,并发送请求获取响应。一旦收到响应,代码将读取响应流并使用GBK编码解析HTML内容。然后,利用正则表达式从HTML中提取出表示时间戳的字符串,并将其转换为毫秒级的时间跨度。通过将这个时间跨度加到1970年1月1日的日期上,得到当前的日期(格式为yyyyMMdd)。 这种方法巧妙地解决了单机游戏中获取准确时间的问题,但需要注意的是,它依赖于网络连接和外部服务器的稳定性。如果网络不可用,代码会返回默认值"19700101",这可能会导致游戏功能的异常。在实际应用中,可以考虑添加更完善的错误处理和重试机制,以提高用户体验。 此外,对于单机游戏,也可以考虑在游戏启动时获取一次服务器时间,然后在本地进行计时,这样即使后续失去网络连接,也能基于已知的初始时间来计算时间差,从而减少对网络的依赖。当然,这种做法对游戏设计和逻辑会有一定要求,需要权衡利弊。













- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 人工智能产业分析.doc
- 物联网基础作业题目(改).doc
- 基于区块链技术的财务共享模式优化研究.docx
- 蓝天酒业企业融资租赁项目管理风险管理探析.doc
- MongoDB运维最佳实践.pptx
- 基于布鲁姆教育目标分类法的大学英语网络教学探索.docx
- VB中的界面设计原则和编程技巧.docx
- 基于混合高斯模型的目标检测方法研究
- 基于工程监理与工程项目管理及施工阶段的质量控制分析.docx
- 互联网科技创业计划书优秀ppt模板课件【精选模板】.ppt
- 大数据平台技术选型与场景运用.docx
- 广东广东电视大学2019年下半年期末考试-项目管理-试题-工商管理专科专业.doc
- 电子商务下零售业顾客忠诚度的建立.doc
- 数据通信及网络技术2.ppt
- WebLogic-Web服务器安全配置基线.doc
- 网络英语资源在大学英语视听教学中的实践与应用-杂志网.docx


