ue5 运行时大纲视图中的数据获取方法

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)

大纲视图需要treeview控件的树形结构展示,创建一个treeview需要两个要素:

1、Item:我称之为一组数据,就类似于一个actor中都包含哪些组件,或者是一个类与类中的成员。

2、treeview控件:实现树形结构的类,在这个类中将item作为数据添加到树形结构中,然后创建树形结构。

Item数据类的示例(没有什么复杂实现,所以只有一个.h就可以)

#pragma once

class FCustomItemClass : public TSharedFromThis<FCustomItemClass>
{
public:

	//
	FString Name;
	//
	TArray<TSharedPtr<FCustomItemClass>> Children;

	// 构造函数
	FCustomItemClass(const FString& InName) : Name(InName) { }	

	void addChild(TSharedPtr<FCustomItemClass> Child)
	{
		Children.Add(Child);
	}
};

treeview类的示例

#pragma once
#include "CustomItemClass.h"

class CUSTOMWINDOW_API SCustomOutliner : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SCustomOutliner){}

	SLATE_END_ARGS()

	void Construct(const FArguments& InArgs);

private:
	// 1. TreeView 必需的两个成员
	TSharedPtr<STreeView<TSharedPtr<FCustomItemClass>>> TreeViewWidget;  // TreeViewData
	TArray<TSharedPtr<FCustomItemClass>> RootItems;                      // 根节点数组

	// 2. TreeView 必需的两个回调函数
	TSharedRef<ITableRow> OnGenerateRow(TSharedPtr<FCustomItemClass> Item, const TSharedRef<STableViewBase>& OwnerTable);
	void OnGetChildren(TSharedPtr<FCustomItemClass> Item, TArray<TSharedPtr<FCustomItemClass>>& OutChildren);
	
};
#include "CustomOutliner.h"

#include "CustomItemClass.h"
#include "Kismet/GameplayStatics.h"
#include "GameFramework/Actor.h"

void SCustomOutliner::Construct(const FArguments& InArgs)
{
	UWorld* World = GEngine->GetWorldContexts()[0].World();
	if (World)
	{
		TSharedPtr<FCustomItemClass> RootActor = MakeShareable(new FCustomItemClass("SceneActor"));
		TArray<AActor*> AllActors;
		UGameplayStatics::GetAllActorsOfClass(World, AActor::StaticClass(), AllActors);
		//遍历容器内元素
		for (AActor* Actor : AllActors)
		{
			if (Actor)
			{
				TSharedPtr<FCustomItemClass> ActorItem = MakeShareable(new FCustomItemClass(Actor->GetName()));
				//用于存储和管理场景中的组件数组。它通常用于存储USceneComponent对象,这些对象代表了场景中的各种组件,如网格体、摄像机等。
				TInlineComponentArray<UActorComponent*> Components;
				Actor->GetComponents(Components);
				for (UActorComponent* Component : Components)
				{
					if (Component)
					{
						TSharedPtr<FCustomItemClass> ComponentItem = MakeShareable(
							new FCustomItemClass(Component->GetName()));
						ActorItem->addChild(ComponentItem);
					}
				}
				RootActor->addChild(ActorItem);
			}
		}
		RootItems.Add(RootActor);
	}

    //这里是最简树形结构的数据示例
	TSharedPtr<FCustomItemClass> Root = MakeShareable(new FCustomItemClass("A"));
	TSharedPtr<FCustomItemClass> A1 = MakeShareable(new FCustomItemClass("A1"));
	TSharedPtr<FCustomItemClass> A2 = MakeShareable(new FCustomItemClass("A1_1"));
	Root->addChild(A1);
	A1->addChild(A2);

	RootItems.Add(Root);

	ChildSlot
	[
		SAssignNew(TreeViewWidget, STreeView<TSharedPtr<FCustomItemClass>>)
		.TreeItemsSource(&RootItems)
		.OnGenerateRow(this, &SCustomOutliner::OnGenerateRow)
		.OnGetChildren(this, &SCustomOutliner::OnGetChildren)
	];
}

TSharedRef<ITableRow> SCustomOutliner::OnGenerateRow(TSharedPtr<FCustomItemClass> Item,
                                                     const TSharedRef<STableViewBase>& OwnerTable)
{
	return SNew(STableRow<TSharedPtr<FCustomItemClass>>, OwnerTable)
		[
			SNew(STextBlock).Text(FText::FromString(Item->Name))
		];
}

void SCustomOutliner::OnGetChildren(TSharedPtr<FCustomItemClass> Item,
                                    TArray<TSharedPtr<FCustomItemClass>>& OutChildren)
{
	OutChildren = Item->Children;
}

显示(调用)方法

return SNew(SDockTab)
                     .TabRole(ETabRole::PanelTab)
                     .Label(FText::FromString("OutlinerTabLabel")) //使用宏DefineLabel
                     .ToolTipText(FText::FromString("OutlinerTabToolTip"))
    [
        //创建一个树形结构类的实例
       SNew(SCustomOutliner)
    ];

网站公告

今日签到

点亮在社区的每一天
去签到