【发布时间】:2021-11-10 07:23:52
【问题描述】:
如果这看起来微不足道,我深表歉意,但我已经搜索了一段时间的答案,但似乎找不到解决方案。
我有一个结构列表(确切地说是TArray 结构。)代表我的游戏中的高分。 (每个结构代表一个高分,字段类似于“姓名、日期、玩家分数、游戏模式等”我使用thisSaveGame 方法将我的高分数组加载到文件中和从文件中保存。
我将它与模拟值一起使用并且系统正常工作,现在我想创建一个 UMG 小部件,它将显示高分列表,这就是我遇到障碍的地方。
我想使用 ListView 将每个结构显示为 ListViewEntry。据我了解(我正在关注this 教程),UMG 列表视图需要它的条目小部件来实现IUserObjectListEntry,特别是必须实现OnListItemObjectSet (UObject* ListItemObject) 方法。此方法负责将对象分配给 Listview 条目并将其字段映射到各种可视小部件。你现在可以看到我的问题了,我有一个 UStructs 列表,这个方法需要一个 UObject 指针。
我真的不知道我需要做什么才能使用 UStruct 进行这项工作。没有创建一个与我的结构几乎相同的虚拟 UObject,并且在将结构传递给此函数之前,我需要将其字段复制到虚拟 UObject 中并改为传递它。我认为这种方法非常不雅。一定有更好的方法。你知道吗?
我想避免仅仅为了将它传递给这个函数而创建一个虚拟的 UObject。
我尝试使用 UObjects 数组而不是 Structs 数组,但问题是,UObjects 数组始终是指针数组,当它被保存时,指针被保存而不是实际数据,所以加载后数据无用。
也许有一个可以为ListViewEntry 小部件实现的特定于结构的接口?或者也许有一种方法可以在保存 Uobjects 数组的指针之前取消引用它们?
TL;DR
我有以下结构:
c++
USTRUCT()
class FHighScoreEntry
{
GENERATED_BODY()
public:
//Player name
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString PlayerName;
//Player Score
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 PlayerScore;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FDateTime CurrentDateTime;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TEnumAsByte<EGameType> GameType;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 AccuracyTrialMaxTries;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 TimeTrialMaxTime;
}
在下面的数组中;
c++
TArray<FHighScoreEntry> HighScores;
我想在 UMG ListView 中显示高分数组。 ListView 需要其入口实现User List Object 接口,该接口有这个功能:
如您所见,该事件仅接受 UObject。这就是我的问题。
【问题讨论】:
-
@JeJo 如果我理解正确,您建议从
UObject派生FHighScoreEntry。正如我在帖子中解释的那样,我已经尝试过了,我遇到了一个问题,即UObject的TArray必须是指针数组TArray<UObject*> FHighScoreEntries。如果它是一个指针数组,我在将其保存到文件时遇到问题,就像我在帖子中解释的那样,它只是保存指针而不是数据。
标签: c++ unreal-engine4 unreal-umg