添加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)
|
public BladeSmith(ReadOnlyTargetRules Target) : base(Target)
|
||||||
{
|
{
|
||||||
PrivateDependencyModuleNames.AddRange(new string[] { "GeometryScriptingCore" });
|
PrivateDependencyModuleNames.AddRange(new string[] {
|
||||||
|
"GeometryScriptingCore",
|
||||||
|
"GeometryFramework",
|
||||||
|
"DynamicMesh",
|
||||||
|
"GeometryCore",
|
||||||
|
"GeometryAlgorithms",
|
||||||
|
"ModelingComponents"
|
||||||
|
});
|
||||||
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||||
|
|
||||||
// 如果你的模块类型是 Runtime 或 Gameplay 相关的,则添加这行:
|
// 如果你的模块类型是 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