这个是官方的一个C++示范工程,一共有21个教学视频,总时长2个小时。从游戏逻辑上、引擎功能使用程度上来说,都属于比较简单的层次,不过以入门、了解虚幻4的C++特性为目的,这个还是不错的素材。最终效果见优酷链接。下面是主要代码,包含5个类:Pickup,BattertyPickup,BatteryCollectorCharacter,BatteryCollectorGameMode,SpawnVolume,还有少量UMG功能也使用了C++,这里不再列出。

Pickup类

Pickup.h

#include "GameFreamework/Actor.h"
#include "Pickup.generated.h"UCLASS()
class BATTERYCOLLECTOR_API APickup :public AActor
{GENERATED_BODY();public://构造函数,设置初始值APickup();//当游戏开始或者被spawn时函数被调用virtual void BeginPlay() override;//每帧调用virtual void Tick(float DeltaSeconds) override;//返回static mesh FORCEINLINE class UStaticMeshComponent* GetMesh() const {return PickupMesh;}//返回pickup当前状态UFUNCTION(BlueprintPure, Category = "Pickup")bool IsActive();//允许其他类安全的改变pickup的状态UFUNCTION(BlueprintCallable, Category = "Pickup")void SetActive(bool NewPickupState);//当pickup被拾取时调用UFUNCTION(BlueprintNativeEvent)void WasCollected();virtual void WasCollected_Implementation();protected://pickup 是否在激活状态bool bIsActive;private://static mesh 是pickup的实体表现UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pickup", meta = (AllowPrivateAccess = "true"))class UStaticMeshComponent* PickupMesh;
}

Pickup.cpp

#include "BatteryCollector.h"
#include "Pickup.h"APickup::APickup()
{PrimaryActorTick.bCanEverTick = false;//创建static mesh 组件,CreateDefaultSubobject<>()函数PickupMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PickupMesh"));RootComponent = PickupMesh;bIsActive = true;
}void APickup::BeginPlay()
{Super::BeginPlay();
}void APickup::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}bool APickup::IsActive()
{return bIsActive;
}void APickup::SetActive(bool NewPickupState)
{bIsActive = NewPickupState;
}
void APickup::WasCollected()
{Fstring PickupDebugString = GetName();UE_LOG(LogClass,Log, TEXT("You have collected %s",PickupDebugString));
}

BatteryPickup类

BatteryPickup.h

#include "Pickup.h"
#include "BatteryPickup.generated.h"UCLASS()
class BATTERYCOLLECTOR_API ABatteryPickup : public APickup
{GENERATED_BODY();
public:ABatteryPickup();void WasCollected_Implementation() override;float GetPower();
protected://BatteryPickup的能量值UPROPERTY(EditAnywhere,BlueprintReadWrite, Category = "Power" , meta = (BlueprintProtected = "true"));float BatteryPower
}

BatteryPickup.cpp

#include "BatteryCollector.h"
#include "BatteryPickup.h"ABatteryPickup::ABatteryPickup()
{//电池pickup子类,模拟物理效果GetMesh()->SetSimulatePhysics(true);BatteryPower = 150.f;
}void ABatteryPickup::WasCollected_Implementation()
{//使用基类的函数Super::WasCollected_Implementation();//销毁batteryDestroy();
}float ABatteryPickup::GetPower()
{return BatteryPower;
}

SpawnVolume类

SpawnVolume.h

#include "GameFramework/Actor.h"
#include "SpawnVolume.generated.h"UCLASS()
class BATTERYCOLLECTOR_API ASpawnVolume : public AActor
{GENERATED_BODY()public:ASpawnVolume();virtual void BeginPlay() override;virtual void Tick(float DeltaSeconds) override;//返回GetWhereToSpawn组件FORCEINLIE class UBoxComponent* GetWhereToSpawn() const { return WhereToSpawn;}//返回spawnvolume中任意一点UFUNCTION(BlueprintPure, Category = "Spawning")FVector GetRandomPointInVolume();//设置是否可以spawnUFUNCTION(BlueprintCallable, Category = "Spawning")void SetSpawningActive(bool bShouldSpawn);
private://box component 实例化pick up的地点UPROPERTY(VisibleAnywhere,BlueprintReanOnly,Category = "Spawning", meta = (AllowPrivateAccess = "true"))class UBoxComponent* WhereToSpawn;//void SpawnPickup();//当前spawn的时间间隔float SpawnDelay;
protected://spawn的pickup类UPROPERTYY(EditAnywhere, Category = "Spawning")TSubclassof<class APickup> WhatToSpawn;FTimerHandle SpawnTimer;//spawn 时间间隔UPROPERTY(EditAnywhere,BlueprintReadWrite,category = "Spawning")float SpawnDelayRangeHigh;UPROPERTY(EditAnywhere,BlueprintReadWrite,category = "Spawning")float SpawnDelayRangeLow
}

SpawnVolume.cpp

#include "BatteryCollector.h"
#include "SpawnVolume.h"
#include "Kismet/KismetMathLiibrary.h"
#include "Pickup.h"ASpawnVolume::ASpawnVolume()
{PrimaryActorTick.bCanEverTick = false;WhereToSpawn = CreateDefaultSubobject<UBoxComponent>(TEXT("WhereToSpawn"));RooComponent = WhereToSpawn;SpawnDelayRangeLow = 1.0f;SpawnDelayRangeHigh = 4.5f;}void ASpawnVolume::BeginPlay()
{Super::BeginPlay();}FVector ASpawnVolume::GetRandomPointInVolume()
{FVector SpawnOrigin = WhereToSpawn->Bounds.Origin;Fvector SpawnExtent = WhereToSpawn->Bounds.BoxExtent;//返回box  component内任意一点return UKismetMathLibrary::RandomPointInBoundingBox(SpawnOrigin,SpawnExtent);
}void ASpawnVolume::SetSpawningActive(bool bShouldSpawn)
{if(bShouldSpawn){//如果spawn时,通过timer定时器不断激活SpawnPickup()函数SpawnDelay = FMath::FRandRange(SpawnDelayRangeLow,SpawnDelayRangeHigh);GetWorldTimerManager().SetTimer(SpawnTimer,this,&ASpawnVolume::SpawnPickup,SpawnDelay,false);}else{//不spawn时,清除定时器即可GetWorldTimerManager().ClearTimer(SpawnTimer);}
}void ASpawnVolume::SpawnPickup()
{//pickup是否存在if(WhatToSpawn != NULL){//当前世界是否有效UWorld* const World = GetWorld();if(World){//设置spawn参数FActorSpawnParameters SpawnParams;SpawnParams.Owner = this;SpawnParams.Instigator = Instigator;Fvector SpawnLocation = GetRandomPointInVolume();FRotator SpawnRotation;SpawnRotation.Yaw = FMath::FRand()*360.fSpawnRotation.Pitch = FMath::FRand()*360.fSpawnRotation.Roll = FMath::FRand()*360.f//生成pickupAPickup* const SpawnedPickup = World->SpawnActor<APickup>(WhatToSpawn,SpawnLocation,SpawnRotation,SpawnParams);}}
}

BatteryCollectorCharacter类
限于篇幅,不再摘抄Character类自带的大量代码,只显示新增的代码

BatteryCollectorCharacter.h

#include "BatteryCollectorCharacter.generated.h"UCLASS(config=Game)
{
private://pickup接触到的范围UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = Camera)class USphereComponent* CollectionSphere;//当前能量值UPROPERTY(VisibleAnywhere, Category = "Power")float CharecterPower;public;ABatteryCollectorCharacter();FORCEINLINE class USphereComponent* GetCollectionSphere const { return CollectionSphere;}UFUNCTION(BlueprintPure,Category = "Power")float GetInitialPower();UFUNCTION(BlueprintPure,Category = "Power")float GetCharecterPower();//更新当前能量值UFUNCTION(BlueprintCallable, Category = "Power")void UpdatePower(float PowerChange);protected://当按下按键开始收集pickupUFUNCTION(BlueprintCallable, Category = "Pickups")void CollectPickups();//初始能量值UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Power", Meta  = (BlueprintProtected = "true"))float InitialPower;//玩家速度影响因子UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Power", Meta  = (BlueprintProtected = "true"))float SpeedFactor;//玩家初始速度UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Power", Meta  = (BlueprintProtected = "true"))float BaseSpeed;//UFUNCTION(BlueprintImplementableEvent,Category = "Power")void PowerChangeEffect();
}

BatteryCollectorCharacter.cpp

#include "BatteryCollector.h"
#include "BatteryCollectorCharacter.h"
#include "BatteryPickup.h"ABatteryCollectorCharacter::ABatteryCollectorCharater()
{CollectionSphere = CreatDefaultSubobject<USphereComponent>(TEXT("CollectionSphere"));CollectionSphere->AttachTo(RootComponent);CollectionSphere->SetSphereRadius(200.f);InitialPower = 200.0f;CharacterPower = InitialPower;SpeedFactor = 0.75f;BaseSpeed = 10.0f
}void ABatteryCollectorCharacter::SetupPlayerInputComponent(class UIputComponent* InputComponent)
{InputComponent->BindAction("Collect",IE_Pressed,this,&ABatteryCollectorCharacter::CollectPickups);
}void ABatteryCollectorCharacter::CollectPickups()
{//得到所有overlapping的物体TArray<AActor*> CollectedActors;CollectionSphere->GetOverlappingActors(CollectedActors);//记录获得的能量值float CollectedPower = 0;//遍历得到的物体,转换为 APickup类for(int32 iCollected = 0; iCollected < CollectedActors.Num(); ++iCollected){APickup* const TestPickup = Cast<APickup> (CollectedActors[iCollected]);if(TestPickup && !TestPickup->IsPendingKill() && TestPickup->IsActive()){//调用pickup类的WasCollected()函数TestPickup->WasCollected();ABatteryPickup* const TestBattery= Cast<ABatteryPickup>(TestPickup);if(TestBattery){CollectedPower += TestBattery->GetPower();}TestPickup->SetActive(false);}}if(CollectedPower > 0){UpdatePower(CollectedPower);}
}float ABatteryCollectorCharacter::GetInitialPower()
{return InitialPower;
}float ABatteryCollectorCharacter::GetCharacterPower()
{return CharacterPower;
}void ABatteryCollectorCharacter::UpdatePower(float PowerChange)
{CharacterPower = CharacterPower + PowerChange;GetCharacterMovement()->MaxWalkSpeed = BaseSpeed + SpeedFactor*CharacterPower;//视觉效果PowerChangeEffect();
}

BatteryCollectorGameMode类

BatteryCollectorGameMode.h

#include "GameFramework/GameMode.h"
#include "BatteryCollectorGameMode.generated.h"UENUM(BlueprintType)
enum class EBatteryPlayState
{EPlaying,EGameOver,EWon,EUnknown
};UCLASS(minimalapi)
class ABatteryCollectorGameMode :public AGameMode
{GENERATED_BODY()
public:ABatteryCollectorGameMode();virtual void Tick(float DeltaTime)UFUNCTION(BlueprintPure, Category = "Power")float GetPowerTowin() const();virtual void BeginPlay() override;UFUNCTION(BlueprintPure, Category = "Power")EBatteryPlayState GetCurrentState();void  SetCurrentState(EBatteryPlayState NewState);protected://玩家角色能量值减少频率UPROPERTY(EditDefaultOnly, BlueprintReadWrite, Category = "Power", BlueprintProtected = "true")float DecayRate;    //玩家获胜的能量值UPROPERTY(EditDefaultOnly, BlueprintReadWrite, Category = "Power", BlueprintProtected = "true")float PowerToWin;private:EBatteryPlayState CurrentState;TArray<class ASpawnVolume*> SpawnVolumeActors;//改变statevoid HandleNewState(EBatteryPlayState NewState);
}

BatteryCollectorGameMode.cpp

#include "BatteryCollector.h"
#include "BatteryCollectorGameMode.h"
#include "BatteryCollectorCharacter.h"
#include "Kismet/GameplayStatics.h"ABatteryCollectorGameMode:: ABatteryCollectorGameMode()
{DecayRate = 0.01f;
}void ABatteryCollectorGameMode ::BeginPlay()
{Super::BeginPlay();//从场景内找到所有SpawnVolume类TArray<AActors*> FoundActors;UGameplayStatics::GetAllActorsOfClass(GetWorld(),ASpawnVolume::StaticClass(),FoundActors);for(auto Actor :FoundActors){ASpawnVolume* SpawnVolumeActor = Cast<ASpawnVolume>(Actor);if(SpawnVolumeActor){SpawnVolumeActors.AddUnique(SpawnVolumeActor);}}
}SetCurrentState(EBatteryPlayState::EPlaying);ABatteryCollectorCharacter* MyCharacter = Cast<ABatteryCollectorCharacter>(UGameplayStatics::GetPlayerPawn(this,0));if(MyCharacter){PowerToWin = MyCharacter->GetInitialPower()*1.25f;}void ABatteryCollectorGameMode::Tick(float DeltaTime)
{Super::Tick(DeltaTime);ABatteryCollectorCharacter* MyCharacter = Cast<ABatteryCollectorCharacter>(UGameplayStatics::GetPlayerPawn(this,0));if(MyCharacter){if(MyCharacter->GetCurrentPower() > PowerToWin){SetCurrentState(EBatteryPlayState::EWon);}else if(MyCharacter->GetPlayerPower() > 0){MyCharacter->UpdatePower(-DeltaTime*DecayRate*(MyCharacter->GetInitialPower()));}else {SetCurrentState(EBatteryPlayState::EGameOver);}}
}EBatteryPlayState ABatteryCollectorGameMode::GetCurrentState() const
{return CurrentState;
}
void ABatteryCollectorGameMode::SetCurrentState(EBatteryPlayState NewState)
{CurrentState = NewState;HandleNewState(CurrentState);
}//切换游戏状态
void ABatteryCollectorGameMode::HandleNewState(EBatteryPlayState NewState)
{switch(NewState){case EBatteryPlayState::EPlaying:{//激活spawnvolumefor(ASpawnVolume* Volume : SpawnVolumeActors){Volume->SetSpawningActive(true);}}break;case EBatteryPlayState::EWon:{for(ASpawnVolume* Volume : SpawnVolumeActors){Volume->SetSpawningActive(false);}//关闭player的输入接收APlayerController* PlayerController = UGameplayStatics::GetPlayerController(this,0);if(PlayerController){PlayerController->SetCinematicMode(true,false,false,true);}//ragdoll ,最后玩家没电时的瘫痪效果ACharacter* MyCharacter = UGameplayStatics::GetPlayerCharacter(this,0);if(MyCharacter){MyCharacter->GetMesh()->SetSimulatePhysics(true);MyCharacter->GetMovementComponent->MovementState.bCanJump = false;}}break;case EBatteryPlayState::EGameOver:{for(ASpawnVolume* Volume : SpawnVolumeActors){Volume->SetSpawningActive(false);}}break;case EBatteryPlayState::EUnknown:{}break;}
}

UE4 C++示例工程Battery Collector(4.10版本又更名为3rd Person Power-up)相关推荐

  1. android 工程搭建,Android ApiDemo示例工程的创建

    一般SDK中都会带有一些示例程序,说明具体用法,Android SDK也是如此.它提供了一些ApiDemo示例,详细说明了Android中主要API,分为以下几大类: 1.App 2.Content ...

  2. activiti-explorer mysql_Activiti explorer.war示例工程使用过程图解

    Activiti explorer.war示例工程使用过程图解 发布时间:2020-09-03 07:26:22 来源:脚本之家 阅读:98 作者:yaominghui 工作流主要解决的主要问题是:为 ...

  3. spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程

    徒手撸一个扫码登录示例工程 不知道是不是微信的原因,现在出现扫码登录的场景越来越多了,作为一个有追求.有理想新四好码农,当然得紧跟时代的潮流,得徒手撸一个以儆效尤 本篇示例工程,主要用到以下技术栈 q ...

  4. 大恒相机+VS开发+Qt 跑通示例工程

    直接复制和调试大恒相机自带的C++开发软件开发说明书中的示例工程,报错众多,无从下手. 终于经过注释多处代码,跑通了!以此为记,再接再厉. #include <QDebug> #inclu ...

  5. 百度鹰眼服务安卓端示例工程使用流程

    需求 最近出了个记录道路路长&河道河长的巡路巡河轨迹的需求. 大致需要达到如下图所示的效果: 未接入第三方 最开始没使用第三方SDK,应用直接监听系统位置变动事件来做的,效果不是很理想. 定位 ...

  6. VS2019编译MQTT库 C/C++(超详细,含示例工程)

    目录 前言 一.前期准备 1.1 获取mqtt库 1.2 安装openssl 1.3 安装cmake-gui 二.生成C工程代码 三.编译C库 3.1 创建工程目录 3.2 修改输出目录 四.生成C+ ...

  7. 构建施耐德楼控系统数据库后台服务器示例工程二(数据库查询编写)

    构建施耐德楼控系统数据库后台服务器示例工程-(工程创建)记录了一个Spring.Hibernate.Rest的工程如何创建,这篇将简单介绍在这个框架下如何利用注释编程. 1.Spring注释 Spri ...

  8. Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

    GTX IP配置完了,你不得搞个回环测试一番? 汇总篇: Xilinx FPGA平台GTX简易使用教程(汇总篇) 目录 前言 一.示例工程Example Design 1.1 gtx_support模 ...

  9. cocos2d-x 3.10版本 使用BabeLua调试

    cocos2d-x 3.10在"simulator\win32\"有一份src和res, 为避免混乱最好在删除副本文件夹,做法参考 cocos2d-x 3.10版本 Lua 删除工 ...

最新文章

  1. Windows下PCL1.9.1配置(编译源码)
  2. ReentrantLock+线程池+同步+线程锁
  3. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析 检测点3.1
  4. 第四节:IO、序列化和反序列化、加密解密技术
  5. 高并发和分布式中的幂等处理
  6. 高性能服务器存储服务器,高性能存储服务器
  7. Spark Java API:Action
  8. python之lambda
  9. 第36课 天连碧水碧连天 《小学生C++趣味编程》
  10. Python string生成随机数
  11. signature=0d9b3a8f96c5f64e92cd85aaf7e70ac0,Scale controller
  12. P4172 [WC2006]水管局长 LCT维护最小生成树
  13. Column name pattern can not be NULL or empty.
  14. 去除div css背景,jQuery-拖动div CSS背景
  15. HttpClient的3种超时
  16. 解决IE、firefox浏览器下JS的new Date()的值为Invalid Date、NaN-NaN的问题
  17. mysql 查询密码 cmd
  18. ASP.NET CORE MVC 2.0 发布到IIS 配置问题
  19. Go语言核心之美 4.1-函数声明
  20. gstreamer: 官方参考内容 gst-launch-1.0命令行工具

热门文章

  1. MapleSim在模型方程的妙用
  2. 一个会展论坛进行的全息营销“策划” -王甲佳全息营销系列08
  3. 面试突击25:sleep和wait有什么区别
  4. w10系统mysql_win10系统mysql安装及配置
  5. 怎么建立网站?如何写网站建设策划方案?
  6. 随机生成数据字母混合的兑换码(优惠券码红包码)
  7. 关于sublime text 4 的注册破解
  8. ssh_crm:用户注册、登陆校验拦截器、员工拜访客户功能
  9. 糖豆人android,糖豆人免费版
  10. RT-Thread设备和驱动总结