添加DynamicIronBlock类,实现继承自ADynamicMeshActor的动态铁块

- 创建DynamicIronBlock类,支持动态Box网格生成
- 集成BVH加速结构用于快速空间查询
- 添加可配置的Box大小和细分参数
- 更新Build.cs添加GeometryScript相关依赖模块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-06 00:42:23 +08:00
parent 6151105119
commit 39512c45b6
3 changed files with 172 additions and 1 deletions
+8 -1
View File
@@ -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 相关的,则添加这行:
+115
View File
@@ -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"));
}
+49
View File
@@ -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();
};