UE4 运行时间导入外部CSV文件
由于引擎不支持仅使用Blueprints进行文件读写操作,因此我们将公开内置的File Helper函数,用于将文本文件从C ++读取到Blueprints,即使用编写C++类Blueprint Function Library来实现该功能。
-
新建C++类
File -> New C++ class
选择Blueprint Function Library,命名为LoadCsvFile
-
创建完成后会自动唤醒Visual Studio(如果之前配置好VS的话)
-
首先写好结构并编译
(1)以如下circle.csv文件的结构为例
(2)在LoadCsvFile.h中加入#include "Engine/DataTable.h"头文件与USTRUCT结构,代码如下:
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "LoadCsvFile.generated.h"
/**
*
*/
USTRUCT(BlueprintType)
struct FData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float InstanceX;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float InstanceY;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float NewX;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float NewY;
};
UCLASS()
class MYPROJECT6_API ULoadCsvFile : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
};
(3)在UE4中编译(注意先编译)
- 在UCLASS中加入Blueprint函数
UCLASS()
class MYPROJECT6_API ULoadCsvFile : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, meta = (DisplayName = "LoadExcel", Keywords = "LoadExcel"), Category = "Custom")
static TArray<FData> DataReadExcelFunction(FString name, int lie = 3);
};
- LoadCsvFile.cpp中加入代码
#include "LoadCsvFile.h"
#include "Misc/FileHelper.h"
#include "Misc/Paths.h"
#include "Serialization/Csv/CsvParser.h"
TArray<FData> ULoadCsvFile::DataReadExcelFunction(FString name, int lie )
{
FString csvFile = FPaths::GameDir() + name + ".csv";
TArray<FData> csvContent;
if (FPaths::FileExists(csvFile))
{
FString FileContent;
//Read the csv file
FFileHelper::LoadFileToString(FileContent, *csvFile);
FCsvParser* csvfiles = new FCsvParser(FileContent);
//csvfiles.
TArray<FString> t_str;
TArray<TArray<const TCHAR*>> content = csvfiles->GetRows();
for (TArray<const TCHAR*>& ite : content)
{
for (const TCHAR*& chr : ite)
{
//aa.Append(chr);
t_str.Add(chr);
}
}
int key = 0;
for (int i = 0; i < t_str.Num(); i++)
{
if (i % lie == 0)
{
if (key != 0)
{
FData tempdata;
tempdata.InstanceX = FCString::Atof(*t_str[i + 1]);
tempdata.InstanceY = FCString::Atof(*t_str[i + 2]);
tempdata.NewX = FCString::Atof(*t_str[i + 3]);
tempdata.NewY = FCString::Atof(*t_str[i + 4]);
csvContent.Add(tempdata);
}
key++;
}
}
return csvContent;
}
else {
return csvContent;
}
}
6.在UE4中重新编译完成后,重启UE4
7.在关卡蓝图中测试:
修改name为circle,修改lie为5,注意.csv文件放在content同目录
8.Play后按Num 1键即可输出文件中内容。