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'  //这个就是你的资源路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值