[UE4]C++合并StaticMesh,SkeletonMesh,Landscape的方法

1.合并多个StaticMesh

这个比较简单

#include "Public/EditorLevelLibrary.h"

.cs里面加入“EditorScriptingUtilities"

TArray<AStaticMeshActor*>ActorsToMerge;

FEditorScriptingMergeStaticMeshActorOptions MergeOptions;

FEdtiorScriptingCreateProxyMeshActorOptions CreateOptions;

AStaticMeshActor* OutMergeActor;

MergeOptions.MeshMergingSettings.bPivotPointAtZero = true;

將需要合并的StaticMeshActors添加進ActorsToMerge(這裏省略)

方法1.

UEditorLevelLibrary::CreateProxyMeshActor(ActorsToMerge, CreateOptions, OutMergeActor);

方法2.

UEditorLevelLibrary::MergeStaticMeshActors(ActorsToMerge, MergeOptions, OutMergeActor);

方法3:

const IMeshMergeUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked<IMeshMergeModule>("MeshMergeUtilities").GetUtilities();
 

MeshUtilities.MergeComponentsToStaticMesh(AllComponents, world, MergeOptions.MeshMergingSettings, nullptr, nullptr, PackageName, OutAssetsToSync, MergedActorLocation, ScreenAreaSize, true);
 

 

 

 

 

2.合并多个Landscape

方法同合并多个StaticMesh类似,只是需要先生成一步

Landscape LOD,得到每一块地形的StaticMesh,再合并

不同的是添加ActorsToMerge這裏

for(TActorIterator<ALandscapeMeshProxyActor> ActorItr(World); ActorItr; ++ActorItr)

{

AStaticMeshActor* StaticMeshActor = World->SpawnActor<AStaticMeshActor>(ActorItr->GetActorLocation(), ActorItr->GetActorRotation());

StaticMeshActor->GetStaticMeshComponent()->SetStaticMesh(ActorItr->GetLandscapeMeshProxyComponent()->GetStaticMesh());

ActorsToMerge.Add(StaticMeshActor);

}

 

 

3.合并多個SplineMeshActor

 

TArray<UPrimitiveComponent*>AllComponents;

for(TActorIterator<ASplineMeshActor> SMA(World); SMA; ++SMA)

{

AllComponents.Add(SMA->GetSplineMeshComponent());

}

const IMeshMergeUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked<IMeshMergeModule>("MeshMergeUtilities").GetUtilities();

FEditorScriptingMergeStaticMeshActorsOptions MergeOptions;

FString FailureReason;

FString PackageName = EditorScriptingUtils::ConvertAnyPathToLongPackagePath(MergeOptions.BasePackageName, FailureReason);

FVector MergedActorLocation;

TArray<UObject*>CreatedAssets;

const float ScreenAreaSize = TNumericLimits<float>::Max();

MeshUtilities.MergeComponentsToStaticMesh(AllComponents, World, MergeOptions.MeshMergingSettings, nullptr, nullptr, PackageName, CreatedAssets, MergedActorLocation, ScreenAreaSize, true);

 

4.合并多个SkeletonMesh

bool AwwaCharacter::MyMerge2Char(AActor* PlayerPawn, TArray<USkeletalMesh*> SrcMeshList, USkeletalMeshComponent* SkeletalComp)
{
    if (!PlayerPawn || !SkeletalComp || SrcMeshList.Num() == 0) return false;
    
    TArray<USkeletalMesh*>& SourceMeshList = SrcMeshList;
    auto CompositeMesh = NewObject<USkeletalMesh>(GetTransientPackage(), NAME_None, RF_Transient);
    TArray<FSkelMeshMergeSectionMapping> InForceSectionMapping;
    FSkeletalMeshMerge MeshMergeUtil(CompositeMesh, SourceMeshList, InForceSectionMapping, 0);
    if (!MeshMergeUtil.DoMerge())
    {
        UE_LOG(LogTemp, Log, TEXT("DoMerge Error: Merge Mesh Test Failed"));
        return false;
    }
    CompositeMesh->Skeleton = SkeletalComp->SkeletalMesh->Skeleton; //设置新的 *SkeletalMesh* 的骨架
    SkeletalComp->SetSkeletalMesh(CompositeMesh); //用新组合成的 SkeletalMesh 替换旧的
    return true;
}

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在UE5中,通过C++代码改变Landscape的地形,可以使用Landscape Editing API。可以通过以下步骤进行操作: 1. 获取Landscape对象 首先需要获取到Landscape对象,可以使用以下代码获取到当前关卡中第一个Landscape对象: ```cpp ALandscapeProxy* Landscape = Cast<ALandscapeProxy>(UGameplayStatics::GetActorOfClass(GetWorld(), ALandscapeProxy::StaticClass())); ``` 2. 修改Landscape高度图数据 通过Landscape Editing API中的SetHeightData函数,可以修改Landscape的高度图数据,从而改变地形的形状。以下是一个示例代码: ```cpp // 获取Landscape高度图数据 TArray<uint16> HeightData; Landscape->ExportHeightmap(0, 0, Landscape->GetLandscapeComponent()->GetNumSections(), Landscape->GetLandscapeComponent()->GetNumSections(), HeightData); // 修改高度图数据 for (int32 i = 0; i < HeightData.Num(); i++) { HeightData[i] += 100; } // 将修改后的高度图数据设置到LandscapeLandscape->SetHeightData(0, 0, HeightData.GetData(), false); ``` 3. 更新Landscape渲染 修改高度图数据后,需要调用Landscape的UpdateAllComponentRenderBounds函数,来更新Landscape的渲染。示例代码如下: ```cpp Landscape->UpdateAllComponentRenderBounds(); ``` 4. 可选步骤:修改地形材质 如果需要修改Landscape的地形材质,可以使用以下代码: ```cpp UMaterialInterface* NewMaterial = LoadObject<UMaterialInterface>(nullptr, TEXT("Material'/Game/NewMaterial.NewMaterial'")); Landscape->LandscapeMaterial = NewMaterial; Landscape->EditorApplyMaterialToAllComponent(); ``` 以上就是通过C++代码改变Landscape的地形的步骤。需要注意的是,修改Landscape高度图数据会对性能产生一定影响,因此需要在合适的时机进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值