【UE4】获取13位时间戳_ue4 时间戳_Goulandis的博客-程序员秘密

技术标签: UE4  ue4  

UE4自身提供了一个FDateTime::ToUnixTimestamp函数可以将系统时间转换位时间戳,但是FDateTime::ToUnixTimestamp只能提供10位的时间错,翻阅了FDateTime中并没有提供13位的时间戳,且查看FDateTime::ToUnixTimestamp的源码,确实只精确到秒。

FString UBPFunctionLibrary::GetTimestamp()
{
	FString Timestamp;
    FDateTime Time = FDateTime::UtcNow();
    int64 unixTimestamp = Time.ToUnixTimestamp();
    Timestamp = FString::Printf(TEXT("%lld"), unixTimestamp);
    UE_LOG(LogTemp, Log, TEXT("Timestamp:%s"), *Timestamp);
    return Timestamp
}

输出:

LogTemp: Timestamp:1651734043

当我们需要使用13位的时间戳时UE似乎就提供不了,所以只能通过C++的手段来获取。

#include <windows.h>
//...
FString UBPFunctionLibrary::GetTimestamp()
{
	string nowTimeUnix;
	string cs_uninxtime;
	string cs_milliseconds;
	SYSTEMTIME sysTime;
	GetLocalTime(&sysTime);
	time_t unixTime;
	time(&unixTime);
	char buf[30], bufms[30];
	sprintf_s(buf, sizeof(buf), "%I64d", (INT64)unixTime);
	sprintf_s(bufms, sizeof(bufms), "%03I64d", (INT64)sysTime.wMilliseconds);
	nowTimeUnix = string(buf) + string(bufms);
    FString Timestamp = FString(nowTimeUnix.c_str());
    UE_LOG(LogTemp, Log, TEXT("Timestamp:%s"), *Timestamp);
	return Timestamp;
}

输出:

LogTemp: Timestamp:1751734043331

上面这种方法只能在Windows上使用,如果需要在Andriod上使用,则可以直接封装java的库函数。然后通过UE4的JNI框架去调用java函数,以达到在Android上获取13位的时间戳的效果。

UE4调用java的函数通过一个中间XML文件来实现,我们将需要调用的函数在XML中用java函数进行一层封装,然后再在UE4中调用这个封装函数来实现间接调用。

首先创建一个XML文件,这里命名为:JavaTest.xml:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:android="http://schemas.android.com/apk/res/android">
    <gameActivityClassAdditions>
        <insert>
            <![CDATA[
            public String getSystemTimestamp()
            {
                long now = System.currentTimeMillis();
                return String.valueOf(now);
            }
   		]]>
        </insert>
    </gameActivityClassAdditions>
</root>

将我们的封装函数写在gameActivityClassAdditions标签里,这里直接调用Android的库函数获取当前时间戳。

然后我们需要在.Build.cs文件里注明这个XML文件:

using UnrealBuildTool;
using System.IO;

public class JavaTest423 : ModuleRules
{
	public JavaTest423(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

        if (Target.Platform == UnrealTargetPlatform.Android)
        {
            PrivateDependencyModuleNames.Add("Launch");
            AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(ModuleDirectory, "JavaTest.xml"));
        }
    }
}

由于只需要运行在Android上,所以这里做了平台判断。

然后创建一个Actor—JavaTest,在Actor中调用这个java函数:

#include "JavaTest.h"
#include "Kismet/KismetSystemLibrary.h"

#if PLATFORM_ANDROID
#include "Android/AndroidApplication.h"
#include "Android/AndroidJavaEnv.h"
#include "../Source/Runtime/Launch/Public/Android/AndroidJNI.h"
#endif
AJavaTest::AJavaTest()
{
	PrimaryActorTick.bCanEverTick = true;
}
void AJavaTest::BeginPlay()
{
	Super::BeginPlay();
    Timestamp();
}
void AJavaTest::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}
FString AJavaTest::Timestamp()
{
    FString Timestamp;
#if PLATFORM_ANDROID
    jstring JavaString = NULL;
    if (JNIEnv* Env = FAndroidApplication::GetJavaEnv(true))
    {
        //寻找方法的地址
        static jmethodID MethonId = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "getSystemTimestamp", "()Ljava/lang/String;", false);
        //通过地址调用方法
        JavaString = (jstring)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, MethonId);
        if (JavaString != NULL)
        {
            const char* JavaChars = Env->GetStringUTFChars(JavaString, JNI_FALSE);
            Timestamp = FString(UTF8_TO_TCHAR(JavaChars));
            Env->ReleaseStringUTFChars(JavaString, JavaChars);
            Env->DeleteLocalRef(JavaString);
        }
    }
#endif
    UE_LOG(LogTemp, Log, TEXT("Timestamp:%s"), *Timestamp);
    return Timestamp;
}

然后打一个Android包,安装到手机上运行,查看一下打印的日志:

830: 05-06 20:38:28.134  5103  5159 D UE4     : [2022.05.06-20.38.28:134][  0]LogTemp: Timestamp:1651840708134
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39108291/article/details/124618338

智能推荐

小程序申请流程解读:如何申请百度智能小程序_zxclclciop的博客-程序员秘密

到目前为止,我们通过官方上面所展示的信息和他邀请机制所能够加入到百度小程序,名录当中并没有个人,而且尤其在官网的首页明确的指出,个人是无法加入到百度智能小程序当中去的,由此可见,个人是不能开发百度智能小程序的,必须依托一个组织或者一个公司,企业乃至一个主体才能够进行,百度的智能小程序的申请和开发。请注意上面标红的红黄和箭头上面,特别标明非个人,组织和个人不能。由此可见,个人是无法参与到百度智能...

在Lu脚本中绘制分裂视图_forcal的博客-程序员秘密

欢迎访问Lu程序设计 在Lu脚本中绘制分裂视图目  录1 基础知识绘制分裂视图的基础知识。2 分裂模式例举多种分裂模式。3 设置属性给分裂视图设置属性。虽然可以通过右键菜单设置属性,但这里是通过脚本函数设置属性。4 让某一个子图动起来在分裂视图的某一个子图中动态显示图形。5 设置子图显示

ArcGIS API for JS中的goTo方法总结_arcgis goto_海马区的博客-程序员秘密

goTo方法的参数可以是两个或一个。当只有一个参数时,是一个数组;当是两个参数时,第一个参数是数组(一维或二维)或对象或某个图层的graphics,第二个参数是duration。示例: view.goTo([112.6, 22.542]) ------------------------------------------mapView.goTo([113.6042903, 22.5501197], { duration: 2000 //视角跳转时长为2秒})-----------------

线性表之循环链表_顾小豆的博客-程序员秘密

循环链表单链表的局限:单链表可以用于表示任意的线性关系,有些线性关系是循环的,即没有队尾元素。由于单链表的局限性,我们在单链表的基础上做了加强,让其形成循环链。循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素。循环链表可以完全取代单链表的使用。循环链表的Next和Current操作可以高效的遍历链表中的所有元素。循环链表拥有单链表的所有操作

FileUpload文件上传_RyanJJ_的博客-程序员秘密

1.进行文件上传时,表单需要做的准备:1).请求方式为POST:&lt;form action="uploadServlet" method="post"....&gt;2).使用file的表单域:&lt;input type="file" name="file" /&gt;3).请求的编码方式:&lt;form action="uploadServlet" method="post" en...

shell入门系列(六)vmstat_shell vmstat_suveng的博客-程序员秘密

title: shell入门系列( 六 )vmstatdate: 2019-01-09 10:00:00 +0800update: 2019-01-09 10:00:00 +0800author: mecover: https://ws1.sinaimg.cn/large/006jIRTegy1fz08m96klgj31z4140aqo.jpgpreview: 这是Linux命令和性能...

随便推点

python:网络爬虫之正则获取电影名称和封面_番茄牛腩不吃番茄的博客-程序员秘密

利用正则表达式查找电影名称和电影封面示例代码显示如下:import reimport sslimport urllib.requestfrom bs4 import BeautifulSoupurl = "https://movie.douban.com/chart"headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36...

Jmeter插件下载及md5函数、base64Decode函数、base64Encode函数的安装_oceancsdn的博客-程序员秘密

Jmeter第三方插件jmeter-plugins.org下载及base64Decode函数、base64Encode安装1、下载地址:jmeter-plugins.org安装:下载后文件为plugins-manager.jar格式,将其放入jmeter安装目录下的lib/ext目录2、重启jmeter,启动jemter,点击【选项】,最下面出现该插件,如图所示:3、点击...

主机无线上网VMware虚拟机centos7联网的设置_江南老画船的博客-程序员秘密

首次使用CentOS7系统,在做网络配置时遇到不少问题。特写此博客,记录问题的解决方法,欢迎各位大佬指正。一、虚拟机设置VMware界面最上面,选择虚拟机-&amp;gt;设置:将网络连接改为桥接模式,如下图所示:二、查看主机DNS地址win+R 输入cmd,启动命令行界面,输入ipconfig/all,查看主机DNS服务器地址,如下图所示:注意,由于本机是无线上网,此处为无线...

Linux coredump解决流程_dengdun6257的博客-程序员秘密

一、打开core文件限制a.sudo vi /etc/profileb.文件末尾添加ulimit -c unlimitedsource /etc/profile把文件重新加载到内存[email protected]:~/code# ulimit -cunlimited说明core文件限制已经去处。二、让core文件生成在进程当前目录echo "core...

Git(15)- Git 分支 - 分支开发工作流_BugMiaowu2021的博客-程序员秘密

文章目录长期分支主题分支超详细 Git 图文版小白教程(持续更新)现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常见的利用分支进行开发的工作流程。而正是由于分支管理的便捷, 才衍生出这些典型的工作模式,你可以根据项目实际情况选择一种用用看。长期分支因为 Git 使用简单的三方合并,所以就算在一段较长的时间内,反复把一个分支合并入另一个分支,也不是什么难事。 也就是说,在整个项目开发周期的不同阶段,你可以同时拥有多个开放的分支;你可以定期地把某些主题分支合并

Maven配置和打包以及使用Eclipse构建Maven项目_Android进阶的博客-程序员秘密

Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包。本文仅对Eclipse中如何安装、配置和使用Maven进行了介绍。完全step by step。如果觉得本文对你有用,请移步到:http://download.csdn.net/detail/qjyong/5582071 下载PDF版,http://download.csdn.net/de