UE4 C++ 笔记

摘要:
1.获取当前的GameMode:GameMode=Cast<您的GameModel类名>(UGameplayStatistics::GetGameMod(this));2.输出日志DebugUE_ Log(LogTemp,Log,TEXT(“起点:%s”),*StarPoint。ToString());%D表示根据整数数据的实际长度输出数据,%c用于输出字符,%s用于输出字符串,%x

1.获取当前的GameMode:GameMode = Cast<你GameMode的类名>( UGameplayStatics::GetGameMode(this));

2.输出日志DebugUE_LOG(LogTemp, Log, TEXT("StartPoint:%s"), *StarPoint.ToString());%d表示按整型数据的实际长度输出数据、%c用来输出一个字符、%s用来输出一个字符串、%x表示以十六进制数形式输出整数。

UE4 C++ 笔记第1张

3.给碰撞组件动态绑定碰撞函数:GetCapsuleComponent()->OnComponentBeginOverlap.AddDynamic(this, &你的类名::你的函数名);

4.Character键值绑定,键轴绑定:

void APacManCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);

PlayerInputComponent->BindAxis("MoveX", this, &你的character类::MoveXAxis);
PlayerInputComponent->BindAxis("MoveY", this, &你的character类::MoveYAxis);
PlayerInputComponent->BindAction("NewGame",IE_Pressed, this, &你的character类::NewG);
PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &你的character类::RS);
PlayerInputComponent->BindAction("Pause", IE_Pressed, this, &你的character类::Pa);

}

5.添加队列,遍历每个元素:定义头文件TArray<class AEnemy*> Enemys; 在cpp里引入头文件 #include"Public/EngineUtils.h" 然后在队列里添加元素

for (TActorIterator<AEnemy> EnemyItr(GetWorld()); EnemyItr; ++EnemyItr)
{
AEnemy* enemy = Cast<AEnemy>(*EnemyItr);
if (enemy)
{
Enemys.Add(enemy);
}
}

遍历列表中的每个元素,调用每个元素的方法

for (auto Iter(Enemys.CreateIterator()); Iter; Iter++)
{
(*Iter)->Destroy();
}

6.FORCEINLINE内联函数,目的是为了提高函数的执行效率。声明类型后再直接在头文件下面添加FORCEINLINE关键字:

EGameState GetCurrentState() const;

FORCEINLINE EGameState 你的GameMode类名::GetCurrentState() const
{
return currentState;
}

7.定时器:在头文件里定义一个FTimerHandle TimeVulnerable; 在cpp里引入头文件#include"Public/TimerManager.h"

GetWorldTimerManager().SetTimer(TimeVulnerable, this, &你的类::时间结束后执行的函数, 你的时间.0f, bool是否循环);

8.利用ConstructorHelpers来找资源:引入头文件#include"UObject/ConstructorHelpers.h"

然后开始找资源 例如 static ConstructorHelpers::FObjectFinder<UStaticMesh> CylinderObj(TEXT("'/Game/StarterContent/Shapes/Shape_Cylinder'"));

安全校验 如果查找成功if (CylinderObj.Succeeded())

9.创建一个staticmeshcomponent:在头文件里定义一个指针变量UStaticMeshComponent* EnemyBody; 然后在cpp里引入头文件#include"Components/StaticMeshComponent.h"

再在构造函数里创建mesh资源 EnemyBody = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Body"));

10.C++AI,继承AAIController 可重写两个虚函数

.h头文件里重写 virtual void Possess(class APawn* InPawn) override; 相当于beginplay 游戏刚开始的时候调用的函数

.cpp里实现函数前要先调用父类的方法Super::Possess(InPawn);

void AAIEnemy::Possess(class APawn* InPawn)

{
Super::Possess(InPawn);

}

第二个是重写移动完成后的函数

.h头文件里重写virtual void OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult& Result) override; 参数尽量保持一致

.cpp里实现移动完成后寻找下一个点

void AAIEnemy::OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult & Result)
{

SearchNewPoint();

}

10.导航网格实现路径寻找:

void AAIEnemy::SearchNewPoint()
{

UNavigationSystem* NavMesh = UNavigationSystem::GetCurrent(this);
if (NavMesh)
{

const float SearchRadius = 10000.0f; //搜寻半径
FNavLocation RamdomPt;
const bool bFound = NavMesh->GetRandomReachablePointInRadius(Bot->GetActorLocation(),SearchRadius,RamdomPt);
if (bFound)
{
MoveToLocation(RamdomPt);
}
}

11.C++绘制HUD:新建一个C++类继承AHUD类 头文件重写DrawHUD函数virtual void DrawHUD() override;

然后在cpp里实现在屏幕上中央打印文字

DrawText(TEXT("Hello")
, FColor::White, (Canvas->SizeX) / 2.0f-150, (Canvas->SizeY) / 2.0f-100, HUDFont);

12.获取当前角色character:你的Character类* Man = Cast<你的Character类>(UGameplayStatics::GetPlayerPawn(this, 0))

13.物体碰撞函数及参数设置:

UFUNCTION()
void OnCollision(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComponent, int OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult);

实现:

void AEnemy::OnCollision(UPrimitiveComponent * HitComp, AActor * OtherActor, UPrimitiveComponent * OtherComponent, int OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
if (OtherActor->IsA(你的Character类::StaticClass())) //判断碰到的物体是不是主角
}

免责声明:文章转载自《UE4 C++ 笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下查看Tomcat的版本信息Docker环境 ELK 快速部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UE4-动画/蒙太奇/融合(Animation/montage/blend)相关笔记

Q.定义状态机动画蓝图事件:   Q.Animation/Montage指定帧触发事件(Event): (注意:单帧动画需要取消勾选Teleport to Explicit Time,否则无法触发帧事件) Q.C++自定义 Animation Blueprint(动画蓝图) 自己很少用C++写Skeleton动画相关的逻辑,通常Anim的BP满足大部分...

UE4笔记-Plugins插件应用相关记录

UE4 Plugins插件相关的一些小技巧 Q.UE4中支持自定义插件在Editor中进行配置: 主要思路: 使用UCLASS 和UPROPERTY 的config 宏,UHT会自动将相关的属性值或引用的对象写入到关联的 .ini中.并在在创建时会自动使用Ini的信息进行初始化   Note:     根据于UCLASS 的config的配置,会将配置项写...

UE4渲染笔记

Lightmass 实时渲染光影效果对性能有很大影响,可利用lightmass预先生成光影贴图,然后在游戏中使用。将场景光照结果完全烘焙到模型贴图上,从而完完全全的假冒现实光照效果。文档上是 lightmass global illumination,可见生成的是全局光照贴图。 光源的移动性 静态照明仅使用光照贴图,阴影在游戏前烘焙。 固定光源的直接光照...

UE4 Subsystems

  《InsideUE4》GamePlay架构(十一)Subsystems - 知乎 (zhihu.com) 引言 非常惭愧,自从我更新完GamePlay架构十篇之后,我就断更了许久。如今说再多缘由也是借口,借着假期,在家继续重操旧业,继续写写技术文章。 UE在4.22版本的时候,开始引入Subsystems,然后在4.24完善。写本篇文章的一个原因是S...

UE4 Virtual Reality Input输入配置表导入

[/Script/Engine.InputSettings]AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) Axis...

[UE4][Custom Animation Graph Node]Evaluate Pose by Curve

目的:根据曲线值获得当前动作帧。用于实现各种通过曲线同步的功能。 方法:继承FAnimNode_Base创建自定义动画节点。重写Evaluate部分。创建相应的AnimGraphNode。可参考前一篇http://blog.csdn.net/u010831746/article/details/50733287 Evaluate : 1. 根据曲线Valu...