圆形锤击生效,解决卡顿,并生成隆起
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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()
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user