圆形锤击生效,解决卡顿,并生成隆起

This commit is contained in:
zhangqing
2025-11-26 19:17:56 +08:00
parent eb35eedc13
commit 3a2605fbba
5 changed files with 0 additions and 98 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-98
View File
@@ -1,98 +0,0 @@
#pragma once
#include "CoreMinimal.h"
#include "GeometryScript/GeometryScriptSelectionTypes.h"
#include "GeometryScript/MeshDeformFunctions.h"
#include "GeometryScript/MeshSpatialFunctions.h"
#include "GeometryScript/MeshTransformFunctions.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "DeformAsyncTask.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDeformFinished, bool, ResultValue);
// .h 文件
UCLASS()
class UDeformAsyncTask : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
// 暴露给蓝图的静态工厂方法
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", Category = "AsyncTask", WorldContext = "WorldContextObject"))
static UDeformAsyncTask* StartCalculation(UObject* WorldContextObject,FGeometryScriptMeshSelection& InSelection,FVector& InLocalHitLocation,FVector& InLocaHitNormal);
// 成功回调引脚 (在游戏线程触发)
UPROPERTY(BlueprintAssignable)
FOnDeformFinished OnDeformFinish;
virtual void Activate() override;
private:
FGeometryScriptMeshSelection Selection;
FVector LocalHitLocation;
FVector LocaHitNormal;
// 核心计算逻辑,在工作线程中执行
void PerformBackgroundCalculation();
};
inline UDeformAsyncTask* UDeformAsyncTask::StartCalculation(UObject* WorldContextObject,
FGeometryScriptMeshSelection& InSelection, FVector& InLocalHitLocation, FVector& InLocaHitNormal)
{
// 1. 检查 WorldContextObject 是否有效,这是异步操作节点的标准做法
if (!WorldContextObject || !WorldContextObject->GetWorld())
{
return nullptr;
}
// 2. 创建 UCalculateAsyncTask 的实例
// 使用 NewObject 而非 new,以确保对象被 UE 的内存管理系统(GC)追踪
UDeformAsyncTask* Task = NewObject<UDeformAsyncTask>();
// 3. 存储输入参数
Task->Selection = InSelection;
Task->LocalHitLocation = InLocalHitLocation;
Task->LocaHitNormal = InLocaHitNormal;
// 4. 将实例的生命周期与 WorldContextObject 绑定,确保在关卡卸载时它能被回收
Task->RegisterWithGameInstance(WorldContextObject);
// 5. 调用 Activate() 启动实际的后台逻辑
// Activate() 才是真正执行后台任务的地方
Task->Activate();
// 6. 返回实例,在蓝图节点上显示回调引脚
return Task;
}
// .cpp 文件(在 Activate 中启动后台任务)
inline void UDeformAsyncTask::Activate()
{
// 启动一个后台任务,使用 UE 的 Task Graph
// 这里的 lambda 函数会在工作线程上运行
(new FAutoDeleteAsyncTask<TFunction<void()>>(
[this]()
{
PerformBackgroundCalculation(); // 耗时的计算在这里执行
// 切换回游戏线程执行回调
FFunctionGraphTask::CreateAndDispatchWhenReady(
[this]()
{
if (IsValid(this))
{
// 确保在游戏线程上触发蓝图回调
OnDeformFinish.Broadcast(true);
SetReadyToDestroy();
}
},
TStatId(),
nullptr,
ENamedThreads::GameThread // 确保在游戏线程回调
);
}
))->StartBackgroundTask();
}
inline void UDeformAsyncTask::PerformBackgroundCalculation()
{
UGeometryScriptLibrary_MeshTransformFunctions::TranslateMeshSelection()
}