1

如果这看起来微不足道,我深表歉意,但我已经搜索了一段时间的答案,但似乎找不到解决方案。

我有一个结构列表(TArray确切地说是结构。)代表我的游戏中的高分。(每个结构代表一个高分,字段类似于“名称、日期、玩家分数、游戏模式等”我使用这个SaveGame 方法将我的高分数组保存到文件中和从文件中读取。

我将它与模拟值一起使用并且系统正常工作,现在我想创建一个 UMG 小部件,它将显示高分列表,这就是我遇到障碍的地方。

我想使用 ListView 将每个结构显示为 ListViewEntry。据我了解(我正在关注教程),UMG 列表视图需要它的条目小部件来实现IUserObjectListEntry ,特别是必须实现该OnListItemObjectSet (UObject* ListItemObject)方法。此方法负责将对象分配给 Listview 条目并将其字段映射到各种可视小部件。你现在可以看到我的问题了,我有一个 UStructs 列表,这个方法需要一个 UObject 指针。

我真的不知道我需要做些什么才能使用 UStruct 进行这项工作。没有创建一个与我的结构几乎相同的虚拟 UObject,并且在将结构传递给此函数之前,我需要将其字段复制到虚拟 UObject 中并改为传递它。我认为这种方法非常不雅。一定有更好的方法。你知道任何?

我想避免仅仅为了将它传递给这个函数而创建一个虚拟的 UObject。

我尝试使用 UObjects 数组而不是 Structs 数组,但问题是,UObjects 数组始终是指针数组,当它被保存时,指针被保存而不是实际数据,所以当它被加载时数据没用。

也许有一个可以为ListViewEntry小部件实现的特定于结构的接口?或者也许有一种方法可以在保存 Uobjects 数组的指针之前取消引用它们?

TL;博士

我有以下结构:

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。因此我的问题。

4

1 回答 1

0

ListView被用来表示唯一的对象,所以它的项目需要是UObject,这就是列表视图类的制作方式。

这是因为添加/删除/查找项目的小部件需要非常快。对象指针只是一个内存地址,因此可以快速找到一个项目,并且您可以确保它们是唯一的(您的列表不会意外地为同一个对象显示两个小部件)。另一方面,结构是任意数据,可能很长(取决于它们包含的内容)。因此,除非您制作散列算法,否则查找结构是否已经在列表中是非常昂贵的。

因此,根据您的需要,您可以使用对象而不是结构来显示高分。例如,每个玩家的对象,因为玩家可能已经是对象。然后小部件可以在 时投射到播放器类on item object set,并获取播放器的高分变量来显示它。

如果你想使用结构,你可以创建一个自定义小部件来显示高分。要制作一个垂直列表,只需使用节点(或在 cpp 中)VerticalBox在您的父小部件中制作一个,并为列表中的每个项目制作一些小部件。然后,使用该函数将您的小部件添加为垂直框的子级。create widget from class NewObject add child to vertical box

于 2021-12-16T08:41:57.480 回答