使用 C++ 编写一个可以在 Unreal Engine 中使用的类,它具有以下功能:

  1. 有两个浮点数输入接口,分别是坐标 x 和坐标 y,可以根据输入的值定义一个二维区域。
  2. 根据定义的二维区域,生成与整数坐标值对应的点。
  3. 为生成的点添加随机的高度值,范围是 0~255。
  4. 根据调整后的点生成 mesh。
  5. 要提供完整代码,包括 cpp 和头文件代码内容:

头文件代码:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ProceduralMeshComponent.h"
#include "MyProceduralMeshActor.generated.h"

UCLASS()
class YOURPROJECT_API AMyProceduralMeshActor : public AActor
{
    GENERATED_BODY()

public:
    // Sets default values for this actor's properties
    AMyProceduralMeshActor();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    float XSize;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    float YSize;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    int32 NumX;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    int32 NumY;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    bool bSmoothNormals;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
    UMaterialInterface* Material;

    UFUNCTION(BlueprintCallable, Category = 'Procedural Mesh')
    void GenerateMesh();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = 'Procedural Mesh')
    UProceduralMeshComponent* Mesh;

private:
    TArray<FVector> Vertices;
    TArray<int32> Triangles;
    TArray<FVector2D> UVs;
    TArray<FVector> Normals;

    void AddTriangle(int32 V1, int32 V2, int32 V3);
};

实现代码:

#include "MyProceduralMeshActor.h"

// Sets default values
AMyProceduralMeshActor::AMyProceduralMeshActor()
{
    XSize = 100.0f;
    YSize = 100.0f;
    NumX = 10;
    NumY = 10;
    bSmoothNormals = false;

    Mesh = CreateDefaultSubobject<UProceduralMeshComponent>('ProceduralMesh');
    RootComponent = Mesh;
}

// Called when the game starts or when spawned
void AMyProceduralMeshActor::BeginPlay()
{
    Super::BeginPlay();
}

void AMyProceduralMeshActor::GenerateMesh()
{
    Vertices.Empty();
    Triangles.Empty();
    UVs.Empty();
    Normals.Empty();

    // Generate vertices
    for (int32 Y = 0; Y <= NumY; ++Y)
    {
        for (int32 X = 0; X <= NumX; ++X)
        {
            FVector Vertex((float)X / (float)NumX * XSize, (float)Y / (float)NumY * YSize, 0.0f);
            Vertex.Z = FMath::RandRange(0.0f, 255.0f);
            Vertices.Add(Vertex);

            FVector2D UV((float)X / (float)NumX, (float)Y / (float)NumY);
            UVs.Add(UV);

            Normals.Add(FVector(0.0f, 0.0f, 1.0f));
        }
    }

    // Generate triangles
    for (int32 Y = 0; Y < NumY; ++Y)
    {
        for (int32 X = 0; X < NumX; ++X)
        {
            int32 V1 = Y * (NumX + 1) + X;
            int32 V2 = (Y + 1) * (NumX + 1) + X;
            int32 V3 = V1 + 1;
            int32 V4 = V2 + 1;

            AddTriangle(V1, V2, V3);
            AddTriangle(V3, V2, V4);
        }
    }

    Mesh->CreateMeshSection(0, Vertices, Triangles, Normals, UVs, TArray<FColor>(), TArray<FProcMeshTangent>(), bSmoothNormals);
    Mesh->SetMaterial(0, Material);
}

void AMyProceduralMeshActor::AddTriangle(int32 V1, int32 V2, int32 V3)
{
    Triangles.Add(V1);
    Triangles.Add(V2);
    Triangles.Add(V3);
}

该代码创建了一个名为 AMyProceduralMeshActor 的类,该类继承自 AActor 类,并包含生成随机高度的二维区域网格的必要功能。

代码中的 GenerateMesh 函数首先清空 VerticesTrianglesUVsNormals 数组。然后,它循环遍历每个点,根据 XSizeYSizeNumXNumY 计算点的位置,并添加随机的高度值。最后,它生成三角形,并使用 CreateMeshSection 函数创建网格。

该类提供了一个可配置的接口,可以调整网格的大小、密度和材质。它也可以轻松地扩展以支持其他功能,例如生成纹理或使用其他方法生成高度值。

注意: 在使用该类之前,需要确保您的项目中已包含 ProceduralMeshComponent 类。

Unreal Engine C++ 类:生成随机高度的二维区域网格

原文地址: https://www.cveoy.top/t/topic/nal8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录