虚幻4C++小轮子

 

 

一些常用的虚幻c++轮子的用法和总结,方便以后查找使用。这篇文章将是一个小例子集合。以供未来翻阅免得又搜索半天或者是自己造,为以后省一些功夫吧。

  1. 文件读写

  2. FString拓展

  3. TArray Sort排序

 

【1】文件读写

头文件:

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyFileHelper.generated.h"

/**
 * 
 */
UCLASS()
class NEWVERSION_API UMyFileHelper : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public:
	
	UFUNCTION(BlueprintCallable)
	static void ReadTexFile(const FString& relativePath, FString& outString);

	UFUNCTION(BlueprintCallable)
	static void SaveTexFile(const FString& relativePath, const FString& inString);

};

源文件:

#include "MyFileHelper.h"
#include "Runtime/Core/Public/Misc/FileHelper.h"
#include "Runtime/Core/Public/Misc/Paths.h"

void UMyFileHelper::ReadTexFile(const FString& relativePath, FString& outString)
{
	if (relativePath.IsEmpty() == false)
	{
		FString absolutePath = FPaths::ProjectContentDir() + relativePath;
		//absolutePath = absolutePath.Replace(TEXT("/"), TEXT("\\"));
		FFileHelper::LoadFileToString(outString, absolutePath.GetCharArray().GetData());
	}
}

void UMyFileHelper::SaveTexFile(const FString& relativePath, const FString& inString)
{
	if (relativePath.IsEmpty() == false)
	{
		FString absolutePath = FPaths::ProjectContentDir() + relativePath;
		//absolutePath = absolutePath.Replace(TEXT("/"), TEXT("\\"));
		FFileHelper::SaveStringToFile(inString, absolutePath.GetCharArray().GetData());
	}
}

最后的结果:

这里用到了UE的两个轮子,一个是FileHelper,一个是FPaths。FileHelper封装了基本的IO功能,能方便读取,写入文本文件和二进制文件。FPaths内包含了大量和工程引擎路径相关的数据可以给我们提供路径信息。到FileHelper内部其实也可以很清楚理解其原理,只不过UE在这里帮我们做了很多封装。

 

【2】FString拓展

FString作为UE内部的字符串容器,其功能还是不够完善,所以我在这里给它写了些功能

(1)SplitAll

4.26版本的引擎默认有一个Split功能但是用起来还是不舒服

这个内置版本的split只能把字符串分割为左右两部分,比如AAA+BBB+CCC,以+号来分割字符串则会分割为AAA和BBB+CCC,这里我们需要把数据全部分开,所以我如下拓展,做了一个回调。

void SplitDeep(TArray<FString*>& splitSubString, FString& inString, const FString& signalString)
{
	if (inString.Contains(signalString))
	{
		FString* SL = new FString();
		FString* SR = new FString();
		inString.Split(signalString, SL, SR);
		splitSubString.Add(SL);
		if (SR->Len() > 0)
			SplitDeep(splitSubString, *SR, signalString);
	}
}

void UMyFileHelper::ReadTexFile(const FString& relativePath, FString& outString)
{
	if (relativePath.IsEmpty() == false)
	{
		FString absolutePath = FPaths::ProjectDir() + "Content/" + relativePath;
		FFileHelper::LoadFileToString(outString, absolutePath.GetCharArray().GetData());
		
		TArray<FString*>splitSubString;
		outString = outString.Replace(TEXT("\r\n"), TEXT("@"));
		
		SplitDeep(splitSubString, outString, "@");
	}
}

效果如下,这样就把它们分割到数组里了。

 

(2)RemoveAll

正常用户在调用remove的时候往往想要移除字符串的所有特定字符,然而UE的内置函数缺不是这样。我的修改如下

void RemoveDeep(FString& inString, const FString& subStringToMove)
{
	if (inString.Contains(subStringToMove))
	{
		int index = inString.Find(subStringToMove);
		inString.RemoveAt(index, subStringToMove.Len());
		RemoveDeep(inString, subStringToMove);
	}
}

void UMyFileHelper::ReadTexFile(const FString& relativePath, FString& outString)
{
	if (relativePath.IsEmpty() == false)
	{
		FString absolutePath = FPaths::ProjectDir() + "Content/" + relativePath;
		FFileHelper::LoadFileToString(outString, absolutePath.GetCharArray().GetData());
		
		TArray<FString*>splitSubString;
		outString = outString.Replace(TEXT("\r\n"), TEXT("@"));
		
		
		RemoveDeep(outString, "@");
		//SplitDeep(splitSubString, outString);
	}
}

效果如下:

 

(3)FindAll

同样UE缺乏寻找一个字符串里所有同类字符串的轮子,所以下面我撸了一个

void FindAll(TArray<int>& outPositionIndex, const FString& inString, const FString& signalString, int startPos = -1)
{
	if (inString.Contains(signalString) && startPos < inString.Len())
	{
		startPos = inString.Find(signalString, ESearchCase::IgnoreCase, ESearchDir::FromStart, startPos);
		outPositionIndex.Add(startPos);
		startPos+= signalString.Len();
		FindAll(outPositionIndex, inString, signalString, startPos);
	}
}

void UMyFileHelper::ReadTexFile(const FString& relativePath, FString& outString)
{
	TArray<int>FindPos;
	TArray<FString*>splitSubString;
	if (relativePath.IsEmpty() == false)
	{
		FString absolutePath = FPaths::ProjectDir() + "Content/" + relativePath;
		FFileHelper::LoadFileToString(outString, absolutePath.GetCharArray().GetData());
		outString = outString.Replace(TEXT("\r\n"), TEXT("@"));
		
		FindAll(FindPos, outString, "@");
		//RemoveDeep(outString, "@");
		//SplitDeep(splitSubString, outString, "@");
	}
}

效果如下

 

 

【3】TArray Sort排序

如果是我们自定义的类型,一个自定义类型的TArray对元素进行快排

struct MyStruct
{
	MyStruct(){}
	MyStruct(const float& indata){data = indata;}
	float data;
};

void UMyFileHelper::Test()
{
	TArray<MyStruct>arrayTest;
	arrayTest.Add(MyStruct(0));
	arrayTest.Add(MyStruct(2));
	arrayTest.Add(MyStruct(5));
	arrayTest.Add(MyStruct(7));
	arrayTest.Add(MyStruct(1));
	arrayTest.Add(MyStruct(3));

	arrayTest.Sort([](const MyStruct& A, const MyStruct& B){return A.data < B.data;});

}

效果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值