引擎:UE4 4.18.3
代码结构
运行图
PikaqiuThirdTestGameMode.h// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "PikaqiuThirdTestGameMode.generated.h"
UCLASS(minimalapi)
class APikaqiuThirdTestGameMode : public AGameModeBase
{
GENERATED_BODY()
//存储直线的地板
UPROPERTY()
TArray> pikaMidArr;
//存储左右的地板
UPROPERTY()
TArray> pikaLRArr;
public:
APikaqiuThirdTestGameMode();
virtual void BeginPlay() override;
//添加地板
void PikaAddFloor();
//打印测试
void PikaPirnt(FString piksStr);
TSubclassOf pikaNewFloor;
FTransform pikaNextTransforms;
//获取随机的地板
TSubclassOf PikaRandomInputFloor();
//将UI界面加载到屏幕上
void PikaUIAddToScreen();
//UI实例变量
UUserWidget *PikaMainUI;
TSubclassOf PikaUIMainInstance;
//确定金币的生成方向X轴或Y轴
//1:X轴负方向 2:Y轴负方向 3:X轴正方向 4:Y轴正方向
//LEFT -1 RIGHT +1
int32 IsX;
};
PikaqiuThirdTestGameMode.cpp// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#include "PikaqiuThirdTestGameMode.h"
#include "PikaqiuThirdTestCharacter.h"
#include "UObject/ConstructorHelpers.h"
#include "PikaFloor.h"
#include "PikaMainUI.h"
#include "Engine.h"
#include "PikaGameStateBase.h"
APikaqiuThirdTestGameMode::APikaqiuThirdTestGameMode()
{
// set default pawn class to our Blueprinted character
static ConstructorHelpers::FClassFinder PlayerPawnBPClass(TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"));
if (PlayerPawnBPClass.Class != NULL)
{
DefaultPawnClass = PlayerPawnBPClass.Class;
}
//初始化容器
pikaMidArr.Empty();
pikaLRArr.Empty();
//获取蓝图中的直线地板
TSubclassOf pikaFloorBP01 = LoadClass(NULL , TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP01.PikaFloorBP01_C'"));
pikaMidArr.Add(pikaFloorBP01);
TSubclassOf pikaFloorBP02 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP02.PikaFloorBP02_C'"));
pikaMidArr.Add(pikaFloorBP02);
TSubclassOf pikaFloorBP03 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP03.PikaFloorBP03_C'"));
pikaMidArr.Add(pikaFloorBP03);
//获取蓝图中的上下地板
TSubclassOf pikaFloorBP04 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP04.PikaFloorBP04_C'"));
pikaMidArr.Add(pikaFloorBP04);
TSubclassOf pikaFloorBP05 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP05.PikaFloorBP05_C'"));
pikaMidArr.Add(pikaFloorBP05);
//获取蓝图中的左右地板
TSubclassOf pikaFloorBP06 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP06.PikaFloorBP06_C'"));
pikaLRArr.Add(pikaFloorBP06);
TSubclassOf pikaFloorBP07 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP07.PikaFloorBP07_C'"));
pikaLRArr.Add(pikaFloorBP07);
//获取自定义的UI类实例
static ConstructorHelpers::FClassFinder PikaWidget(TEXT("/Game/UMG/PikaMainUI"));
PikaUIMainInstance = PikaWidget.Class;
//加载我们的GameState
GameStateClass = APikaGameStateBase::StaticClass();
IsX = 1;
}
void APikaqiuThirdTestGameMode::BeginPlay()
{
Super::BeginPlay();
if (GetWorld())
{
for (int32 i=0 ; i<10 ; i++)
{
PikaAddFloor();
}
}
//将UI界面加载到屏幕上
PikaUIAddToScreen();
}
void APikaqiuThirdTestGameMode::PikaAddFloor()
{
pikaNewFloor = PikaRandomInputFloor();
if (pikaNewFloor != NULL)
{
FVector const pikaLoction = pikaNextTransforms.GetLocation();
FRotator pikaRotation(pikaNextTransforms.Rotator());
//在场景中放入地板
APikaFloor *pikaFloor = GetWorld()->SpawnActor(pikaNewFloor, pikaLoction, pikaRotation);
//记录当前地板的位置,做为下一个生成的地板的初始位置
pikaNextTransforms = pikaFloor->PikaGetAttachToTransform();
//PikaPirnt(pikaNextTransforms.ToString());
}
}
void APikaqiuThirdTestGameMode::PikaPirnt(FString piksStr)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, piksStr);
}
}
//获取随机的地板
TSubclassOf APikaqiuThirdTestGameMode::PikaRandomInputFloor()
{
//return pikaMidArr[2];
int32 pikaRandom = FMath::RandRange(1, 100);
//生成直线地板(包括上下地板)的概率
int32 pikaProbMid = 60;
if (pikaRandom <= pikaProbMid)
{
//生成直线地板
int32 pikaSumMidArr = pikaMidArr.Num();
if (pikaSumMidArr)
{
//组数开始的下标为0
int32 pikaIndexMid = FMath::RandRange(0, pikaSumMidArr - 1);
return pikaMidArr[pikaIndexMid];
}
}
else
{
//生成左右地板
int32 pikaSumLRArr = pikaLRArr.Num();
if (pikaSumLRArr)
{
int32 pikaIndexLR = FMath::RandRange(0, pikaSumLRArr - 1);
return pikaLRArr[pikaIndexLR];
}
}
return NULL;
}
//将UI界面加载到屏幕上PikaMainUI
void APikaqiuThirdTestGameMode::PikaUIAddToScreen()
{
if (PikaUIMainInstance)
{
if (GetWorld())
{
PikaMainUI = CreateWidget(GetWorld(), PikaUIMainInstance);
if (PikaMainUI)
{
PikaMainUI->AddToViewport();
UPikaMainUI *PikaMain = Cast(PikaMainUI);
if (PikaMain)
{
//初始化金币数和步数
PikaMain->pikaCoinNum = FText::FromString(TEXT("0"));
PikaMain->pikaCharacterDistance = FText::FromString(TEXT("0"));
}
}
}
}
}
PikaqiuThirdTestCharacter.h// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PikaqiuThirdTestCharacter.generated.h"
UCLASS(config = Game)
class APikaqiuThirdTestCharacter : public ACharacter
{
GENERATED_BODY()
/** Camera boom positioning the camera behind the character */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
class USpringArmComponent* CameraBoom;
/** Follow camera */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
class UCameraComponent* FollowCamera;
public:
APikaqiuThirdTestCharacter();
/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
float BaseTurnRate;
/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
float BaseLookUpRate;
protected:
/** Resets HMD orientation in VR. */
void OnResetVR();
/** Called for forwards/backward input */
void MoveForward(float Value);
/** Called for side to side input */
void MoveRight(float Value);
/**
* Called via input to turn at a given rate.
* @param Rate This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
*/