Skip to content

UE基础

简述

初次接触UE编程,很多问题都不清楚,做此积累

问题

UE集成GDAL

https://blog.csdn.net/panpan143/article/details/126705294

编译时会有C的文件报错,不让编译,可以选择删掉这部分文件,目前还看到有什么影响

vs 设置

https://zhuanlan.zhihu.com/p/266199524 根据自己理解酌情设置,并不是所有的都需要设置

FString 转 const char*

TCHAR_TO_UTF8

其他类型转FString

c++
//int
FString NewString = FString::FromInt(MyInt);
//float //double    ----只能精确到小数点后6位
FString VeryCleanString = FString::SanitizeFloat(MyFloat);
//bool
FString MyFString = MyBool?TEXT("true") :TEXT("false");
//FVector
FString MyFString = MyVector.ToString();
//FVector2D
FString MyFString = MyVector2D.ToString();
//FRotator
FString MyFString = MyRotator.ToString();
//FLinearColor
FString MyFString = MyLinearColor.ToString();
//UObject
FString MyFString = (MyObj != NULL) ? MyObj->GetName() : FString(TEXT("None"));
//FMatrix
FMatrix rotationMatrix(FPlane(0,1,2,3),FPlane(4,5,6,7),FPlane(8,9,10,11),FPlane(12,13,14,15));
FString str = rotationMatrix.ToString();

手写归一化

c++
  FVector3f targetVector = FVector3f(0.5,0.50.5);
  float targetLength = sqrt(targetVector.X * targetVector.X + targetVector.Y * targetVector.Y + targetVector.Z * targetVector.Z);
  targetLength = 1 / targetLength;
  targetVector.X *= targetLength;
  targetVector.Y *= targetLength;
  targetVector.Z *= targetLength;

TMap 获取值问题

js
TMap<FString, FString> kv;
kv = {
  {TEXT("A"), TEXT("A")},
}
FString a = kv["A"]; // A
FString b = kv["B"] // 报错,报错原因是空指针问题
FString c = kv.Find("B") //报错,报错原因是返回类型不是FString,类型不一致。const char * 与 ValueType *
FString *d = kv.Find("B") // 不再报错 Empty

窗口化时标题设置

编辑>项目设置 中搜索 标题,出现两个设置,项目显示标题项目调试标题信息 前者可以写系统名称,后者写版本号或者其他,如果不写他会显示其他内容,所以最好不要让它为空。

打包后的窗口化和全屏化设置

试过一些方法,最靠谱的是在 Config文件夹下创建DefaultGameUserSetting.ini 文件,如果有直接覆盖相应属性即可

全屏写法:

ini
[/Script/Engine.GameUserSettings]
FullscreenMode=1
Version=5

窗口写法:

ini
[/Script/Engine.GameUserSettings]
bUseVSync=False
ResolutionSizeX=1920
ResolutionSizeY=1080
LastUserConfirmedResolutionSizeX=1920
LastUserConfirmedResolutionSizeY=1080
WindowPosX=-1
WindowPosY=-1
FullscreenMode=2
LastConfirmedFullscreenMode=2
Version=5
PreferredFullscreenMode=2

设置窗口全屏

c++
// 蓝图写法
// 获取用户游戏设置
GetGameUserSetting // 返回 gameUserSetting对象引用
// 设置全屏模式
SetFullscreenMode // 有三个枚举类型:全屏、窗口全屏、窗口,选择窗口全屏
// 获取桌面分辨率
GetDesktopResolution //gameUserSetting的方法,返回桌面的分辨率
// 设置屏幕分辨率
SetScreenResolution // gameUserSetting的方法,参数为上一步获取的分辨率
// 应用设置
ApplySettings // gameUserSetting的方法,check for command line overrides打勾

这么写会生效,但是打包后该配置文件存在哪里还不清楚,打包目录下有同名文件,但是配置内容并不相同

获取机器码

js
FPlatformMisc::GetMachineId().ToString()

http请求

  1. 在.h、RPipeCreatorUnreal.Build.cs中引入相关模块
c++
// .h
#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"
c++
PublicDependencyModuleNames.AddRange(new string[] { ... "HTTP" });
  1. 声明变量和枚举
c++
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPromise, const FString&, ResponseString);
// 枚举 get post
UENUM(BlueprintType)
enum class RequestType:uint8
{
	GET UMETA(DisplayName = "GET"),
	POST UMETA(DisplayName = "POST"),
};
  1. 请求函数
c++
// 开始请求
void APipeMenu::httpRequest(const FString &u, RequestType type, TArray<FString> requestBody)
{
  // requset
	TSharedRef<IHttpRequest> Request = FHttpModule::Get().CreateRequest();
  // 设置回调,callback是自己创建的函数
	Request->OnProcessRequestComplete().BindUObject(this, &APipeMenu::callback);
  // 设置请求头
	Request->SetHeader(TEXT("Content-Type"), TEXT("application/json; charset=utf-8"));
  // 设置请求地址
	Request->SetURL(u);
  // post get
	Request->SetVerb(type == RequestType::GET ? TEXT("GET") : TEXT("POST"));
  // 如果是post需要设置参数
	if (type == RequestType::POST)
	{
		TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
    // requsetBody 是传进来的参数,为[参数名,参数值,参数名,参数值...]
    // 这里因人而异,能把参数写进去就行
		for (int i = 0; i < requestBody.Num(); i += 2)
		{
			JsonObject->SetStringField(requestBody[i], requestBody[i + 1]);
		}

		// Convert the JSON object to a string
		FString RequestBody;
		TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&RequestBody);
		FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
    // 设置请求体
		Request->SetContentAsString(RequestBody);
	}
  // 发出请求
	Request->ProcessRequest();
}
// 请求回到
void APipeMenu::callback(FHttpRequestPtr request, FHttpResponsePtr response, bool bSuccess)
{
  // 是否请求成功
	if (bSuccess && response.IsValid())
	{
    // 成功后将返回内容作为字符串存入promise,类似与js中成功回调
		FString content = response->GetContentAsString();
		promise.Broadcast(content);
	}
}

打开文件(夹)

js
// 文件
	TArray<FString> OutFiles;
	TArray<FString> path;																													 // 选中文件路径
	FString fileType = TEXT("Shape (*.shp)|*.shp");																 // 过滤文件类型
	FString defaultPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()); // 文件选择窗口默认开启路径
	IDesktopPlatform *DesktopPlatform = FDesktopPlatformModule::Get();
	// 找到父窗体,如果不设置,那么在选择文件后会失去焦点
	DesktopPlatform->OpenFileDialog(FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr), TEXT("shp导入"), defaultPath, TEXT(""), *fileType, EFileDialogFlags::None, path);
	FString uri;
	if (path.Num() > 0)
	{
		uri = path[0];
	}

	return uri;
js
// 文件夹
	TArray<FString> OutFiles;
	// TArray<FString> path;																													 // 选中文件路径
	FString path;
	FString fileType = TEXT("Shape (*.shp)|*.shp");																 // 过滤文件类型
	FString defaultPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()); // 文件选择窗口默认开启路径
	// IDesktopPlatform *DesktopPlatform = FDesktopPlatformModule::Get();

	FDesktopPlatformModule::Get()->OpenDirectoryDialog(FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr), TEXT("3dTile导出"), defaultPath, path);

更新于:

夜茶 2020 ~ 2026