unity+时间戳的应用
时间戳场景:报一串数字,当听到数字“1”敲一下桌子,需要将敲桌子的时间戳与开始读语音的时间戳的差值给到服务端。后端实现念到数字1时,ui有闪动的效果
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class MOCAOperation11 : MonoBehaviour { /// <summary> /// 敲击桌子时间点 /// </summary> public string CurrentStrikeTimePoint; /// <summary> /// 起始位置时间戳毫秒 /// </summary> long StartTimestamp; /// <summary> /// 当前时间戳(毫秒) /// </summary> long currentTimestamp; long currentSubMilliSeconds; // Start is called before the first frame update void Start() { AudioPlayRecord.Instance.PlayAudio(MOCASceneModelManage.Instance.audio_Title); ////获取当前时间戳 //long unixTime = ConvertDateTimep(DateTime.Now); //Debug.Log(unixTime); //将时间戳转换为DateTime //Debug.Log(GetTime(unixTime.ToString()).ToString()); StartTimestamp = GetTime(); //Debug.Log("初始时间戳毫秒"+ StartTimestamp); //Debug.Log(GetTime(unixTime.ToString()).Year); //Debug.Log(GetTime(unixTime.ToString()).Month); //Debug.Log(GetTime(unixTime.ToString()).Day); //Debug.Log(GetTime(unixTime.ToString()).Hour); //Debug.Log(GetTime(unixTime.ToString()).Minute); //Debug.Log(GetTime(unixTime.ToString()).Second); } /// <summary> /// 获取时间戳(精确到秒) /// TimeTool.ConvertDateTimep(DateTime.Now) /// </summary> /// <param name="time">时间</param> public static long ConvertDateTimep(DateTime time) { return ((time.ToUniversalTime().Ticks - 621355968000000000) / 10000000); //等价于: //return ((time.ToUniversalTime().Ticks - new DateTime(1970, 1, 1, 0, 0, 0, 0).Ticks) / 10000000) * 1000; } /// <summary> /// 获得时间戳 (毫秒) /// </summary> /// <returns></returns> private long GetTime() { //精确到毫秒 //return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); } /// <summary> /// 时间戳转为C#格式时间 /// TimeTool.GetTime(TimeTool.ConvertDateTiemp(DateTime.Now).ToString()) /// </summary> /// <param name="timeStamp">时间戳</param> /// <returns></returns> public static DateTime GetTime(string timeStamp) { if (timeStamp.Length > 10) { timeStamp = timeStamp.Substring(0, 10); } DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dateTimeStart.Add(toNow); } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.P)) { ClickTable(); } if (Input.GetKeyDown(KeyCode.U)) { Debug.LogError("敲击桌子MOCALeftTable:"); ClickTable(); } if (Input.GetKeyDown(KeyCode.I)) { Debug.LogError("敲击桌子MOCARightTable:"); ClickTable(); } } /// <summary> /// 敲桌子效果,以及记录时间戳差值 /// </summary> private void ClickTable() { //获取当前时间,并打印当前时间与开始时间相差秒数(以秒为单位) MOCASceneModelManage.Instance.PlayAudio(MOCASceneModelManage.Instance.audio_Effect); //DateTime curtimer = DateTime.Now; //Debug.Log(curtimer); //int timer = GetSubSeconds(startTime, curtimer); //Debug.Log(timer); //Debug.LogError("敲击桌子MOCALeftTable:" + timer); currentTimestamp = GetTime(); //Debug.Log("当前时间戳毫秒" + currentTimestamp); currentSubMilliSeconds = GetSubMilliSeconds(StartTimestamp, currentTimestamp); //Debug.LogError("时间戳差值:"+ currentSubMilliSeconds); CurrentStrikeTimePoint += currentSubMilliSeconds + ","; CurrentStrikeTimePoint.TrimEnd(',');//末尾有多个逗号,会全部删除. //Debug.LogError("时间戳差值str CurrentStrikeTimePoint:" + CurrentStrikeTimePoint); } private void OnCollisionEnter(Collision collision) { Debug.LogError(collision.gameObject.name); switch (collision.gameObject.name) { case "MOCALeftTable": Debug.LogError("敲击桌子MOCALeftTable Enter:" ); ClickTable(); //AddUserAnswers(InteractionState.Place); break; case "MOCARightTable": Debug.LogError("敲击桌子MOCARightTable Enter:" ); ClickTable(); break; default: break; } } private void OnCollisionExit(Collision collision) { switch (collision.gameObject.name) { case "MOCALeftTable": Debug.LogError("MOCALeftTable Exit"); MOCASceneModelManage.Instance.StopAudio(); //AddUserAnswers(InteractionState.Place); break; case "MOCARightTable": Debug.LogError("MOCARightTable Exit"); MOCASceneModelManage.Instance.StopAudio(); break; default: break; } } /// <summary> /// 获取间隔毫秒数 /// </summary> /// <param name="startTimer"></param> /// <param name="endTimer"></param> /// <returns></returns> public long GetSubMilliSeconds(long startTimer, long endTimer) { //TimeSpan startSpan = new TimeSpan(startTimer); //TimeSpan nowSpan = new TimeSpan(endTimer); //TimeSpan subTimer = nowSpan.Subtract(startSpan).Duration(); //Debug.LogError("startSpan:"+ startSpan+ "nowSpan:"+ nowSpan+ "subTimer:"+ subTimer); ////返回间隔秒数(不算差的分钟和小时等,仅返回秒与秒之间的差) ////return subTimer.Seconds; ////返回相差时长(算上分、时的差值,返回相差的总毫秒秒数) //return (long)subTimer.TotalMilliseconds; return endTimer - startTimer; } /// <summary> /// 获取间隔秒数 /// </summary> /// <param name="startTimer"></param> /// <param name="endTimer"></param> /// <returns></returns> public int GetSubSeconds(DateTime startTimer, DateTime endTimer) { TimeSpan startSpan = new TimeSpan(startTimer.Ticks); TimeSpan nowSpan = new TimeSpan(endTimer.Ticks); TimeSpan subTimer = nowSpan.Subtract(startSpan).Duration(); //返回间隔秒数(不算差的分钟和小时等,仅返回秒与秒之间的差) //return subTimer.Seconds; //返回相差时长(算上分、时的差值,返回相差的总秒数) return (int)subTimer.TotalSeconds; } /// <summary> /// 获取两个时间的相差多少分钟 /// </summary> /// <param name="startTimer"></param> /// <param name="endTimer"></param> /// <returns></returns> public int GetSubMinutes(DateTime startTimer, DateTime endTimer) { TimeSpan startSpan = new TimeSpan(startTimer.Ticks); TimeSpan nowSpan = new TimeSpan(endTimer.Ticks); TimeSpan subTimer = nowSpan.Subtract(startSpan).Duration(); //返回相差时长(仅返回相差的分钟数) //return subTimer.Minutes; //返回相差时长(仅返回相差的总分钟数) return (int)subTimer.TotalMinutes; } /// <summary> /// 获取两个时间的相差多少小时 /// </summary> /// <param name="startTimer"></param> /// <param name="endTimer"></param> /// <returns></returns> public int GetSubHours(DateTime startTimer, DateTime endTimer) { TimeSpan startSpan = new TimeSpan(startTimer.Ticks); TimeSpan nowSpan = new TimeSpan(endTimer.Ticks); TimeSpan subTimer = nowSpan.Subtract(startSpan).Duration(); //返回相差时长(仅返回相差的小时) //return subTimer.Hours; //返回相差时长(返回相差的总小时数) return (int)subTimer.TotalHours; } /// <summary> /// 获取两个时间的相差多少天 /// </summary> /// <param name="startTimer"></param> /// <param name="endTimer"></param> /// <returns></returns> public int GetSubDays(DateTime startTimer, DateTime endTimer) { TimeSpan startSpan = new TimeSpan(startTimer.Ticks); TimeSpan nowSpan = new TimeSpan(endTimer.Ticks); TimeSpan subTimer = nowSpan.Subtract(startSpan).Duration(); //返回相差时长(仅返回相差的天数) //return subTimer.Days; //返回相差时长(返回相差的总天数) return (int)subTimer.TotalDays; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-03-16 Unity+Android+讯飞离线命令词识别(HLYH)