[Unity] UE4 C++算法生成城市建筑群
主建筑 周边建筑 道路等

    代码.txt (2021-1-26 12:05 上传)

    4.69 KB, 下载次数: 570

大佬,牛批
  • 板凳 CloudHu
  • 2021-1-26 21:05:30
[mw_shl_code=cpptrue]// Fill out your copyright notice in the Deion page of Project Settings.


#include \"GamePController.h\"
#include \"Engine/Engine.h\"
#include \"UObject/ConstructorHelpers.h\"
#include \"IndustrialPark/Actors/Actor_Building.h\"
#include \"IndustrialPark/Util/DataFunc.h\"
#include \"Components/SceneComponent.h\"
#include \"UObject/ConstructorHelpers.h\"
AGamePController::AGamePController() {
   //

       
}

void AGamePController::BeginPlay()
{
        Super::BeginPlay();

        CreateOutSideBuilding();
}


void AGamePController::CreateOutSideBuilding() {
        // SpawnActor<AActor_Building>(FVector::ZeroVector FRotator::ZeroRotator NULL NULL true);
        UWorld* const World = GetWorld(); // get a reference to the world  

        //获取蓝图对象
                FString PathRoadCenter=\"Blueprint\'/Game/Blueprints/Actors/RoadCenter.RoadCenter_C\'\";
                FString PathRoadRow = \"Blueprint\'/Game/Blueprints/Actors/RoadSigleRow.RoadSigleRow_C\'\";
                FString PathRoadColum = \"Blueprint\'/Game/Blueprints/Actors/RoadSigleColum.RoadSigleColum_C\'\";
                TSubclassOf<AActor> BlueprintRow = TSoftClassPtr<AActor>(PathRoadRow).LoadSynchronous();
                TSubclassOf<AActor> BlueprintColum = TSoftClassPtr<AActor>(PathRoadColum).LoadSynchronous();
                TSubclassOf<AActor> BlueprintCenter = TSoftClassPtr<AActor>(PathRoadCenter).LoadSynchronous();
        if (World)
        {
                //格子 100*100
                int gridCount = 100;
                //每个格子间隔200
                float space = 200.0f;

                //整体建筑中间留白格子数量4*4
                int blankLen = 10;
                int blankMin = (gridCount - blankLen) / 2;
                int blankMax = blankMin + blankLen;
                //道路占格子
                int roadLen = 1;
                //道路间隔格子
                int roadBetween = 20;


                FActorSpawnParameters Params;//持有者
                Params.Owner = this;//设置为当前类
                for (int i = 0; i < gridCount; i++) {
                        for (int j = 0; j < gridCount; j++)
                        {
                                bool inCenter = (j >= blankMin && j <= blankMax) && (i >= blankMin && i <= blankMax);
                                bool inRoad = (j % roadBetween < roadLen || i % roadBetween < roadLen);
                                if (!inCenter && !inRoad)
                                {
                                        FVector Vc(space*i space*j 0.0f);
                                        Vc -= FVector(space*gridCount / 2 space*gridCount / 2 0);
                                        AActor_Building*ab = World->SpawnActor<AActor_Building>(ActorBuilding Vc FRotator::ZeroRotator Params);//生成Actor在Hit点上
                                        ab->SetMeshRender(UDataFunc::ReadData());
                                        ABs.Add(ab);
                                }

                                else if (inRoad&&!inCenter) {
                                        bool row = j % roadBetween < roadLen;
                                        bool colum = i % roadBetween < roadLen;
                                        bool both = row * colum;

                                        if (j % roadBetween < roadLen&&!both)
                                        {
                                                FVector Vc(space*i space*j 0.0f);
                                                Vc -= FVector(space*gridCount / 2 space*gridCount / 2 0);
                                                AActor* NewActor3 = World->SpawnActor<AActor>(BlueprintRow Vc FRotator::ZeroRotator Params);
                                        }
                                        if (i % roadBetween < roadLen) {
                                                FVector Vc(space*i space*j 0.0f);
                                                Vc -= FVector(space*gridCount / 2 space*gridCount / 2 0);
                                                AActor* NewActor3 = World->SpawnActor<AActor>(BlueprintColum Vc FRotator::ZeroRotator Params);
                                        }
                                        if (both) {
                                                FVector Vc(space*i space*j 0.0f);
                                                Vc -= FVector(space*gridCount / 2 space*gridCount / 2 0);
                                                AActor* NewActor3 = World->SpawnActor<AActor>(BlueprintCenter Vc FRotator::ZeroRotator Params);
                                        }

                                }
                                else if (inCenter) {
                                        //\"Blueprint\'/Game/Blueprints/Buildings/BuildCenter_0.BuildCenter_0\'\"
                                        int dex = FMath::RandRange(0 12);
                                        FString frontStr = \"Blueprint\'/Game/Blueprints/Buildings/\";
                                        FString fName = \"BuildCenter_\" + FString::FromInt(dex) + \".\" + \"BuildCenter_\" + FString::FromInt(dex) + \"_C\'\";

                                        FString TatolPath = frontStr + fName;
                                        TSubclassOf<AActor> BuildCenter = TSoftClassPtr<AActor>(TatolPath).LoadSynchronous();
                                        FVector Vc(space*i space*j 0.0f);
                                        Vc -= FVector(space*gridCount / 2 space*gridCount / 2 0);
                                       
                                        int rindex = FMath::RandRange(0 3);
                                        FRotator Frotate(0 90 0);
                                        AActor* NewActor3 = World->SpawnActor<AActor>(BuildCenter Vc Frotate*rindex Params);
                                }

                        }
                }
                UE_LOG(LogTemp Warning TEXT(\"World\"));
        }
}



FString AGamePController::ReadDate() {
        UObject *UObj = StaticLoadObject(UDataTable::StaticClass() NULL TEXT(\"DataTable\'/Game/Blueprints/Info/Build_DataTable.Build_DataTable\'\"));
        UDataTable *BuildInfo = Cast<UDataTable>(UObj);
        int dex = FMath::RandRange(1  34);
        FString FFString = \"S\"+ FString::FromInt(dex);// FString::SanitizeFloat
   //UE_LOG(LogTemp Warning TEXT(FText::FromString(FFString)));
        FBuildingInfo *Row = BuildInfo->FindRow<FBuildingInfo>(FName(*FFString) TEXT(\"LookUpCBuildInfo\"));
        if (Row) {       
                //GEngine->AddOnScreenDebugMessage(INDEX_NONE 5.0f FColor::Green Row->BuildingName);
                return Row->BuildingName;
        }
        return \"\";
}
[/mw_shl_code]
666666666666666666
可以的  
  • 6# AAWW
  • 2021-1-27 13:57:10
大佬,厉害
6666666666666666666666666
{:104:}{:104:}
Unity UE4 C++算法生成城市建筑群
牛的一批
这个东西不错啊!
巨佬,牛!!!!!!
6666666dingguagua
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
66666666666666666666666
12下一页