类图:
流程图:
在创建初始化HitProxy的下面的函数注释掉WITH_EDITOR
宏
SetHitProxy函数注释掉WITH_EDITOR
宏
声明MeshPass的地方注释掉WITH_EDITOR
宏
在对应的名字匹配的地方也注释掉WITH_EDITOR
宏
去除类FHitProxyMeshProcessor
的WITH_EDITOR
宏约束,去除该文件下的所有WITH_EDITOR
宏
去除该文件下的所有WITH_EDITOR
宏,并且修改下面的判断:
在HitProxy Pass添加静态网格的地方去掉WITH_EDITOR
宏
在HitProxy Pass添加动态网格的地方去掉WITH_EDITOR
宏
其他需要取消注释的地方
其他需要取消注释的地方
去除WITH_EDITOR
去掉注释
取消注释
文件UnrealClient.h
声明:\Source\Runtime\Engine\Private\GameViewportClient.h
将GameViewportClient
类中的函数Draw()
内容复制到该函数DrawHitProxy
,修改下面的的地方:
修改返回值为true
,路径:\Source\Runtime\Engine\Private\GameViewportClient.h
virtual bool RequiresHitProxyStorage() override { return true; }
在GetRawHitProxyData
函数中进行以下的修改:Engine\Source\Runtime\Engine\Private\UnrealClient.cpp
可以使用以下的代码
UGameViewportClient* gameViewport = GWorld->GetGameViewport();
gameViewport->GetViewportSize(viewportSize); // 获取视口大小
TArray<FColor> outData;
FIntRect rect(0, 0, viewportSize.X, viewportSize.Y);
TSet<AActor*> OutActors;
TSet<UModel*> OutModels;
// 设置获取HitProxy的请求
GWorld->GetGameViewport()->GetEngineShowFlags()->HitProxies = true;
gameViewport->Viewport->InvalidateHitProxy(); // 请求刷新HitProxy
// 获取指定像素的HitProxy
HHitProxy* hitProxy = gameViewport->Viewport->GetHitProxy(viewportSize.X / 2, viewportSize.Y / 2);
// 获取当前视口下所有可见的Actor与Models
// gameViewport->Viewport->GetActorsAndModelsInHitProxy(rect, OutActors, OutModels);
// 获取指定矩阵下的所有像素的HitProxy
// TArray<HHitProxy*> outMap;
// gameViewport->Viewport->GetHitProxyMap(FIntRect(100, 100), outMap);
// 关闭HitProxy的请求
GWorld->GetGameViewport()->GetEngineShowFlags()->HitProxies = false;
if(hitProxy)
GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, FString::Printf(TEXT("HitProxy Name: x: %s;Pos (%f,%f)"), *static_cast<HActor*>(hitProxy)->Actor->GetName(), MousePosition.X, MousePosition.Y));