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