添加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:
@@ -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 相关的,则添加这行:
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
Reference in New Issue
Block a user