使用 C++ 为 UE5 蓝图创建生成随机地形的节点

本文将详细介绍如何在 UE5 中使用 C++ 创建一个自定义节点,该节点接收 X、Y 值作为面积和 Height 值作为高度,并根据这些值生成随机地形。

步骤一:创建 C++ 项目并创建新类

  1. 在 UE5 中创建一个新的 C++ 项目。
  2. 创建一个继承自 UE5 的 Actor 类的新类,例如命名为 TerrainGenerator

步骤二:定义函数和头文件

  1. 头文件 (TerrainGenerator.h)

    #pragma once
    
    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "TerrainGenerator.generated.h"
    
    UCLASS()
    class YOURPROJECTNAME_API ATerrainGenerator : public AActor
    {
        GENERATED_BODY()
    
    public:
        // 生成随机地形的函数
        UFUNCTION(BlueprintCallable, Category = "Terrain")
        void GenerateTerrain(float X, float Y, float Height);
    };
    
  2. CPP 文件 (TerrainGenerator.cpp)

    #include "TerrainGenerator.h"
    #include "Components/TerrainComponent.h"
    #include "Kismet/GameplayStatics.h"
    #include "Engine/World.h"
    
    void ATerrainGenerator::GenerateTerrain(float X, float Y, float Height)
    {
        // 创建 TerrainComponent
        UTerrainComponent* TerrainComp = NewObject<UTerrainComponent>(this);
        TerrainComp->RegisterComponent();
        AttachToComponent(TerrainComp, FAttachmentTransformRules::KeepRelativeTransform);
    
        // 设置 TerrainComponent 的大小
        TerrainComp->SetSize(FIntVector(X, Y, 1));
    
        // 获取世界和随机数生成器
        UWorld* World = GetWorld();
        FRandomStream RandomStream(UGameplayStatics::GetGameTimeSinceStartup(World));
    
        // 生成随机地形
        for (int32 i = 0; i < X; i++)
        {
            for (int32 j = 0; j < Y; j++)
            {
                // 生成随机高度
                float RandomHeight = RandomStream.FRandRange(0.0f, Height);
    
                // 设置地形的高度
                TerrainComp->SetHeightAtLocation(FVector(i, j, RandomHeight));
            }
        }
    }
    

步骤三:注册类为蓝图节点

  1. TerrainGenerator.cpp 文件中添加以下代码,将该类注册为蓝图节点:

    #if WITH_EDITOR
    static ConstructorHelpers::FObjectFinder<UClass> TerrainGeneratorClass(TEXT("/Game/YourProject/YourActor/TerrainGenerator.TerrainGenerator_C"));
    if (TerrainGeneratorClass.Succeeded())
    {
        UClass* Class = TerrainGeneratorClass.Object;
        UProperty* Property = FindField<UProperty>(Class, TEXT("GenerateTerrain"));
        if (Property != nullptr)
        {
            UFunction* Function = Property->GetOwnerFunction();
            if (Function != nullptr)
            {
                FString FunctionName = Function->GetName();
                FString Category = Function->GetCategory();
                UEdGraphSchema_K2::RegisterKismetTypeForBPFunction(FunctionName, Category, Class);
            }
        }
    }
    #endif
    

步骤四:启用 Landscape 模块

  1. 在 UE5 的项目设置中,启用 Landscape 模块。

使用示例

  1. 在 UE5 蓝图中放置一个 TerrainGenerator 类的 Actor。
  2. 调用 GenerateTerrain 函数,传入 X、Y 和 Height 值。

注意

  1. 确保在项目中包含必要的头文件。
  2. 在使用 TerrainComponent 时,需要启用 Landscape 模块。
  3. 此代码示例仅提供基本框架,您可以根据需要进行修改和扩展。

代码解释

  1. GenerateTerrain 函数接收 X、Y 和 Height 值作为参数。
  2. 它创建一个 TerrainComponent 对象,并将其附加到 Actor 上。
  3. 它设置 TerrainComponent 的大小。
  4. 它使用随机数生成器生成随机高度值,并将其应用到 TerrainComponent 上。
  5. 为了让蓝图能够调用 GenerateTerrain 函数,需要将其声明为 BlueprintCallable

总结

通过以上步骤,您可以在 UE5 蓝图中使用自定义 C++ 节点生成随机地形。您可以根据实际需求对代码进行修改和扩展,以实现更复杂的地形生成逻辑。

UE5 蓝图自定义节点:使用 C++ 生成随机地形

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

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