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;
    }


}
复制代码

 

posted @   WalkingSnail  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-03-16 Unity+Android+讯飞离线命令词识别(HLYH)
点击右上角即可分享
微信分享提示