From 39512c45b6ed1fe5c65d8a6c12aa45b35b40fd72 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Sat, 6 Dec 2025 00:42:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0DynamicIronBlock=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E5=AE=9E=E7=8E=B0=E7=BB=A7=E6=89=BF=E8=87=AAADynamicM?= =?UTF-8?q?eshActor=E7=9A=84=E5=8A=A8=E6=80=81=E9=93=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建DynamicIronBlock类,支持动态Box网格生成 - 集成BVH加速结构用于快速空间查询 - 添加可配置的Box大小和细分参数 - 更新Build.cs添加GeometryScript相关依赖模块 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Source/BladeSmith/BladeSmith.Build.cs | 9 +- Source/BladeSmith/DynamicIronBlock.cpp | 115 +++++++++++++++++++++++++ Source/BladeSmith/DynamicIronBlock.h | 49 +++++++++++ 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 Source/BladeSmith/DynamicIronBlock.cpp create mode 100644 Source/BladeSmith/DynamicIronBlock.h diff --git a/Source/BladeSmith/BladeSmith.Build.cs b/Source/BladeSmith/BladeSmith.Build.cs index 59e84f4..0ebe6a0 100644 --- a/Source/BladeSmith/BladeSmith.Build.cs +++ b/Source/BladeSmith/BladeSmith.Build.cs @@ -6,7 +6,14 @@ public class BladeSmith : ModuleRules { public BladeSmith(ReadOnlyTargetRules Target) : base(Target) { - PrivateDependencyModuleNames.AddRange(new string[] { "GeometryScriptingCore" }); + PrivateDependencyModuleNames.AddRange(new string[] { + "GeometryScriptingCore", + "GeometryFramework", + "DynamicMesh", + "GeometryCore", + "GeometryAlgorithms", + "ModelingComponents" + }); PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; // 如果你的模块类型是 Runtime 或 Gameplay 相关的,则添加这行: diff --git a/Source/BladeSmith/DynamicIronBlock.cpp b/Source/BladeSmith/DynamicIronBlock.cpp new file mode 100644 index 0000000..f6b9db3 --- /dev/null +++ b/Source/BladeSmith/DynamicIronBlock.cpp @@ -0,0 +1,115 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "DynamicIronBlock.h" + +#include "Components/DynamicMeshComponent.h" +#include "DynamicMesh/DynamicMesh3.h" +#include "GeometryScript/MeshPrimitiveFunctions.h" +#include "GeometryScript/MeshSpatialFunctions.h" +#include "GeometryScript/MeshBasicEditFunctions.h" + +ADynamicIronBlock::ADynamicIronBlock() +{ + // 设置此 Actor 在每帧调用 Tick() + PrimaryActorTick.bCanEverTick = false; + + // 设置默认的 Box 大小 + BoxSize = FVector(100.0f, 100.0f, 100.0f); + + // 设置 BVH 快速构建选项 + bEnableFastBuild = true; +} + +void ADynamicIronBlock::BeginPlay() +{ + Super::BeginPlay(); +} + +void ADynamicIronBlock::OnConstruction(const FTransform& Transform) +{ + Super::OnConstruction(Transform); + + // 初始化 Box 网格 + InitializeBoxMesh(); +} + +void ADynamicIronBlock::InitializeBoxMesh() +{ + // 获取 DynamicMeshComponent + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent")); + return; + } + + // 获取 DynamicMesh + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh")); + return; + } + + // 清除现有网格 + DynMesh->Reset(); + + // 设置 Box 的选项 + FGeometryScriptPrimitiveOptions PrimitiveOptions; + PrimitiveOptions.PolygroupMode = EGeometryScriptPrimitivePolygroupMode::SingleGroup; + PrimitiveOptions.bFlipOrientation = false; + + // 创建 Box 的变换 + FTransform BoxTransform = FTransform::Identity; + + // 添加 Box 到网格 + UGeometryScriptLibrary_MeshPrimitiveFunctions::AppendBox( + DynMesh, + PrimitiveOptions, + BoxTransform, + BoxSize.X, + BoxSize.Y, + BoxSize.Z, + NumSubDivide.X, NumSubDivide.Y, NumSubDivide.Z // X, Y, Z 轴的细分数 + ); + + // 通知组件网格已更新 + DynMeshComp->NotifyMeshUpdated(); + + // 生成 BVH + GenerateBVH(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Box mesh initialized with size (%f, %f, %f)"), + BoxSize.X, BoxSize.Y, BoxSize.Z); +} + +void ADynamicIronBlock::GenerateBVH() +{ + // 获取 DynamicMeshComponent + UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent(); + if (!DynMeshComp) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent for BVH generation")); + return; + } + + // 获取 DynamicMesh + UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh(); + if (!DynMesh) + { + UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh for BVH generation")); + return; + } + + // 构建 BVH + FGeometryScriptDynamicMeshBVH BVH; + UGeometryScriptLibrary_MeshSpatial::BuildBVHForMesh( + DynMesh, + BVH + ); + + // 可选:重置碰撞 + DynMeshComp->UpdateCollision(); + + UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: BVH generated successfully")); +} \ No newline at end of file diff --git a/Source/BladeSmith/DynamicIronBlock.h b/Source/BladeSmith/DynamicIronBlock.h new file mode 100644 index 0000000..d36e9e6 --- /dev/null +++ b/Source/BladeSmith/DynamicIronBlock.h @@ -0,0 +1,49 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "DynamicMeshActor.h" +#include "DynamicIronBlock.generated.h" + +/** + * 动态铁块Actor,继承自ADynamicMeshActor + * 用于模拟铁匠打铁游戏中的铁块,支持动态变形 + */ +UCLASS() +class BLADESMITH_API ADynamicIronBlock : public ADynamicMeshActor +{ + GENERATED_BODY() + +public: + // 构造函数 + ADynamicIronBlock(); + + // Box的大小 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + FVector BoxSize = FVector(100.0f, 100.0f, 100.0f); + // Box的细分数 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + FVector NumSubDivide = FVector(1.0f, 1.0f, 1.0f); + // BVH参数 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Iron Block") + bool bEnableFastBuild; + +protected: + // 当游戏开始或生成时调用 + virtual void BeginPlay() override; + + // 初始化时调用,用于设置Box网格和BVH + virtual void OnConstruction(const FTransform& Transform) override; + +private: + /** + * 创建Box网格并生成BVH + */ + void InitializeBoxMesh(); + + /** + * 生成BVH加速结构 + */ + void GenerateBVH(); +}; \ No newline at end of file