UE4 根据配置读取DataTable配表

主要是两个类 一个是UMySingleTonGlobal 用来作为全局单例 获得DataTable的instance

二 是UMyConfigData 用来加载DataTable 并从中读取相关数据

以下代码可能有错误 主要介绍思路

UCLASS(config = Game)
class My_API UMyingleTonGlobal : public UObject
{
	GENERATED_BODY()
public:
	static UMyingleTonGlobal* Get();

	bool LoadConfigData();
	const UMyConfigData* GetConfigData()const;
	
protected:

	UPROPERTY()
	UMyConfigData* ConfigData;

	UPROPERTY(config)
		FSoftObjectPath ConfigDataRef;
	
};

这里注意config 通过配置config 我们可以直接在DefaultGame.ini中对ConfigDataRef进行配置
UMyingleTonGlobal* UMyingleTonGlobal::Get()
{
	return Cast<UMyingleTonGlobal>(GEngine->GameSingleton);
}
//根据ini文件中设置的路径进行加载
bool UMyingleTonGlobal::LoadConfigData()
{
	if (ConfigData)
		ConfigData = nullptr;
	if (ConfigDataRef.GetAssetPathName() == NAME_None)
	{
		UE_LOG(LogTemp, Error, TEXT("ConfigData Path is null, please config at DefaultEngine.ini singleTonGlobal Section"));
		return false;
	}
	ConfigData = LoadObject<UMyConfigData>(NULL, *ConfigDataRef.ToString());
	if (!ConfigData)
	{
		UE_LOG(LogTemp, Error, TEXT("ConfigData Path is Error, please config at DefaultEngine.ini singleTonGlobal Section"));
		return false;
	}
	ConfigData->LoadData();
	return true;
}

const UMyConfigData* UMyingleTonGlobal::GetConfigData() const
{
	return ConfigData;
}
/**
 * 角色的属性基类
 */
USTRUCT(BlueprintType)
struct FPersonCategory :public FTableRowBase
{
	GENERATED_BODY()
public:
	/** 角色名称 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Person)
		FText PersonName;
	/** 角色血量 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Person)
	float HP;
	/** 最大速度 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Person)
		float MaxSpeed;
};

/**
 * 保存配表的数据
 */
UCLASS()
class My_API UMyConfigData : public UDataAsset
{
	GENERATED_BODY()
public:
	
	void LoadData();

	UPROPERTY(EditAnywhere, Category = ConfigData)
		FSoftObjectPath PersonCategoryRef;


	const FPersonCategory* GetPersonByID(const FName& PersonID) const;
	
protected:
	UDataTable* PersonCategoryDatas;

};
void UMyConfigData::LoadData()
{
	if (PersonCategoryRef.IsValid())
	{
		PersonCategoryDatas = LoadObject<UDataTable>(NULL, *PersonCategoryRef.ToString());
	}
	if (ThugCategoryRef.IsValid())
	{
		ThugCategoryDatas = LoadObject<UDataTable>(NULL, *ThugCategoryRef.ToString());
	}
	if (WeaponCategoryRef.IsValid())
	{
		WeaponCategoryDatas = LoadObject<UDataTable>(NULL, *WeaponCategoryRef.ToString());
	}
}

const FPersonCategory* UMyConfigData::GetPersonByID(const FName& PersonID) const
{
	if (PersonCategoryDatas)
	{
		return PersonCategoryDatas->FindRow<FPersonCategory>(PersonID, nullptr);
	}
	return nullptr;
}

在合适的地方进行初始化

UMyingleTonGlobal::Get()->LoadConfigData();

获得数据

const FPersonCategory* Test = UMyingleTonGlobal::Get()->GetConfigData()->GetPersonByID(FName(*FString(TEXT("Person1"))));

ini文件中的配置

[/Script/工程名.MyingleTonGlobal]
ConfigDataRef=ConfigData'/Game/Data/ConfigData.ConfigData'  //这个就是你的资源路径

发布了144 篇原创文章 · 获赞 15 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/maxiaosheng521/article/details/103315140
今日推荐