1、UE4 error C4668: 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用“0”替换“#if/#elif
:如果使用了
官方的解释如下图。链接:https://docs.unrealengine.com/zh-CN/Programming/BuildTools/UnrealBuildTool/ThirdPartyLibraries/index.html
#include "AllowWindowsPlatformTypes.h"
#include
#include "HideWindowsPlatformTypes.h"
或者
#define WIN32_LEAN_AND_MEAN
#include "window.h"
在出现类似的报错或者警告时,还可以通过在build.cs中添加以下语句来解决
bEnableUndefinedIdentifierWarnings = false; //消除宏预定报错提示
2、向工程添加第三方库(API)
(1)在UE工程文件的.uproject同级目录中创建ThirdParty/lib_name文件夹,第三方库的bin 、include、libs三个文件添加到该文件加下
(2)在工程的.build.cs文件中添加代码,如下:即通过代码为第三方库中的文件添加路径。
using UnrealBuildTool;
using System.IO;
public class OVRLipSyncDemo : ModuleRules
{
private string ModulePath
{
get { return ModuleDirectory; }
}
private string ThirdPartyPath
{
get { return Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/")); }
}
private string LibraryPath
{
get { return Path.GetFullPath(Path.Combine(ThirdPartyPath, "lib_name/", "libs/")); }
}
private string IncludePath
{
get { return Path.GetFullPath(Path.Combine(ThirdPartyPath, "lib_name/", "include")); }
}
public OVRLipSyncDemo(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", CoreUObject", "Engine" });
PrivateDependencyModuleNames.AddRange(new string[] { });
PublicIncludePaths.Add(IncludePath);
PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "msc_x64.lib"));
PublicDelayLoadDLLs.Add(Path.Combine(LibraryPath, "msc_x64.dll"));
RuntimeDependencies.Add(new RuntimeDependency("$(ProjectDir)/Binaries/Win64/msc_x64.dll"));
}
}
(3)通过以上代码,在.h或.cpp文件中可以添加include文件中的头文件,可以编译通过,但是会报红色提示。
可以在属性-->NMake-->包含搜索路径 添加include的文件地址,F:\DSJ\UE4\UE4_file\OVRLip\ThirdParty\lib_name\include
3、“游戏模块”MyProject“不能可能存在操作系统错误或模块可能未正确设置“
方法一:检查bulid.cs中设置的路径中是否有文件。
方法二:编译通过,但是在打开UE4工程时,出现上面的问题,通过删除.vs,Biniaries,Intermediate三个文件,通过右键.uproject文件重新生成vs工程,然后编译代码。然后即可打开程序。
根据自己最后的操作来具体分析原因。
4、UE4中调用讯飞TTS时出现10102的错误代码。
修改session_begin_params中的tts_res_path路径设置为当前的路径。
参考:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=34502
5、UE4中调用讯飞TTS时无法对中文进行合成,出现中文乱码。
讯飞TTS的Demo中采用的为GB2312编码进行的,在UE4中,若采用FString来定义要合成的文本文字,需要进行编码方式转换,从TCHAR转到UTF8,然后UTF8转成GB2312。
//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
//////////////////////////////////////////////////////////
FString input_text=FString(TEXT("时间是宝贵的"));
std::string MyStdString(TCHAR_TO_UTF8(*input_text));
const char *text = MyStdString.c_str(); //在将FString转成char*时,采用此种方式不会出错,或者下边的方式。
text = U2G(text);//将UTF8编码转换成GB2312编码
//////////////////////////////////////////////////////////
FString str
string t = TCHAR_TO_UTF8(*str);
char * returnvalue = (char *)malloc(sizeof(char) * (t.length() + 1));
strncpy_s(returnvalue, t.length() , t.c_str(), t.length());
6、UE4编码问题相关问题
UE4中尽量使用UE4自带的数据类型,FString的定义方式如下,在找不到原因时,可以查看下变量的定义是否正确。
FString TestHUDString = FString(TEXT("This is my test FString."));
//无符号转有符号,可修改
char * Byte2SByte(TArray &data)
{
int32 sizess = data.Num();
char *sdata=new char[200];
for (int i = 0; i < sizess; i++)
{
if (data[i]>127)
{
sdata[i] = (int8)(data[i] - 256);
}
else
{
sdata[i] = (int8)data[i];
}
}
return sdata;
}
//string转TArray
TArray hexToBin(const std::string &hex)
{
// std::vector dest;
auto len = hex.size();
// dest.reserve(len / 2);
TArray dest;
for (decltype(len) i = 0; i < len; i += 2)
{
unsigned int element;
std ::istringstream strHex(hex.substr(i, 2));
strHex >> std::hex >> element;
// dest.push_back(static_cast(element));
dest.Add(static_cast(element));
}
return dest;
}
//byte数组转成十六进制字符串
FString byteToHexStr(TArray byte_arr)
{
FString hexstr;
for (int i = 0; i < byte_arr.Num(); i++)
{
char hex1;
char hex2;
int value = byte_arr[i]; //直接将unsigned char赋值给整型的值,强制转换
int v1 = value / 16;
int v2 = value % 16;
//将商转成字母
if (v1 >= 0 && v1 <= 9)
hex1 = (char)(48 + v1);
else
hex1 = (char)(55 + v1);
//将余数转成字母
if (v2 >= 0 && v2 <= 9)
hex2 = (char)(48 + v2);
else
hex2 = (char)(55 + v2);
//将字母连接成串
hexstr = hexstr + hex1 + hex2;
}
return hexstr;
}
//将UTF8编码转换成GB2312编码
char *U2G(const char *utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t *wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char *str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr)
delete[] wstr;
return str;
}
7、UE4中使用AES 的CFB模式进行加密的方法;
这里使用的是https://blog.csdn.net/Szu_IT_Man/article/details/78790408这篇博客中的内容,在输出之后英文是想要的加密结果,但是中文内用进行加密就完蛋了。经过反复的组合调试,需经过一下处理:
(1)工程的编码方式采用UTF-8带签名方式进行编码
(2)中文的内容通过一下方式进行定义,定义规范很重要
FString TestHUDString = FString(TEXT("你好呀"));
(4)在CFB_AESEncryptData()函数中,需要对传入的加密内容转换成UTF-8编码形式,将其中的 TCHAR_TO_ANSI换成TCHAR_TO_UTF8格式
(3)在加密之后输出的为十六进制的字符串,若要进行base64的加密,需要将其转换为无符号的字节数组,即TArray
8、UE4中使用AES 的CFB模式进行解密;
再对上述方式进行解码时,步骤为
(1)对加密信息进行base64解码,获取解码后的TArray
(2)将TArray
(3)在进行解码时,出现有时可以解码得到正确结果,有时得到的解码值位空。调试了很久,最终得出是因为在利用TCHAR_TO_UTF8对FString转化成char*时,UE4对较长的字符串转换的支持性不好。解决方法是将UE的数据类型转为c的string数据类型,然后再通过.c_str()转换成char*类型。
char* cipherText_=TCHAR_TO_UTF8(*aes_content);
将上述数据转换成以下方式
std::string cipherText(TCHAR_TO_UTF8(*aes_content));
char * cipherText_=cipherText.c_str();