记录UE4的坑——笔记

1、UE4 error C4668: 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用“0”替换“#if/#elif

:如果使用了头文件,可在UE4中,屏蔽系统库,最后再解除屏蔽。

官方的解释如下图。链接: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"

记录UE4的坑——笔记_第1张图片 

在出现类似的报错或者警告时,还可以通过在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

记录UE4的坑——笔记_第2张图片

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转成16进制字符串FString,作为AES解码的输入

(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();

 

 

 

你可能感兴趣的:(UE4)