Files
BladeSmith/Source/BladeSmith/DynamicIronBlock.cpp
T
starmen1265 39512c45b6 添加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>
2025-12-06 00:42:23 +08:00

115 lines
2.8 KiB
C++

// 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"));
}