//加载ProceduralMeshComponent插件
using UnrealBuildTool;
public class Cloud3D : ModuleRules
{
public Cloud3D(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
bUseRTTI = true;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { "Kernel3D", "UnrealPort", "ProceduralMeshComponent"});
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.Ad dRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
//头文件
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ProceduralMeshComponent.h"
#include "TestActor.generated.h"
UCLASS()
class CLOUD3D_API ATestActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ATestActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION(BlueprintCallable, Category = "CustomMeshActor")
void DrawBox(UMaterialInterface* InMaterial);
UPROPERTY()
UProceduralMeshComponent* DrawMeshComponent;
};
//cpp
#include "TestActor.h"
// Sets default values
ATestActor::ATestActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
RootComponent = CreateDefaultSubobject<USceneComponent>("Root");
DrawMeshComponent = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("DrawMeshComponent"));
DrawMeshComponent->SetupAttachment(RootComponent);
}
void ATestActor::DrawBox(UMaterialInterface* InMaterial)
{
TArray<FVector> vertices;
TArray<int32> triangles;
vertices.Add(FVector(0, 0, 0));
vertices.Add(FVector(100, 0, 0));
vertices.Add(FVector(100, -100, 0));
vertices.Add(FVector(0, -100, 0));
vertices.Add(FVector(0, 0, 0));
vertices.Add(FVector(0, 0, 100));
vertices.Add(FVector(100, 0, 100));
vertices.Add(FVector(100, -100, 100));
vertices.Add(FVector(0, -100, 100));
vertices.Add(FVector(0, 0, 100));
triangles.Add(0);
triangles.Add(1);
triangles.Add(2);
triangles.Add(2);
triangles.Add(3);
triangles.Add(4);
triangles.Add(5);
triangles.Add(6);
triangles.Add(7);
triangles.Add(7);
triangles.Add(8);
triangles.Add(9);
for (int i=0;i<4;i++)
{
triangles.Add(i);
triangles.Add(i+1);
triangles.Add(i+5);
triangles.Add(i+1);
triangles.Add(i+6);
triangles.Add(i+5);
}
TArray<FVector> normals;
TArray<FProcMeshTangent> tangents;
TArray<FLinearColor> vertexColors;
TArray<FVector2D> uvs;
DrawMeshComponent->CreateMeshSection_LinearColor(0, vertices, triangles, normals, uvs, vertexColors, tangents, true);
if (!InMaterial)
return;
DrawMeshComponent->SetMaterial(0, InMaterial);
}
绘制效果