注意事项
1)模块接口(API):对于一些需要被模块外部访问的函数和类,需要通过 *_API 的宏标记出来。每个被暴露在外的单项都会带来编译时间的额外消耗,因此请务必仅暴露出必须暴露的接口。如果外部只需要访问一个类中的某个函数,那么比起暴露整个类而言,仅暴露出这个函数能够节省出相当可观的编译时间。
2)在最最基本的层面上,任意可以被放置到关卡中的游戏物体都是一个 Actor。所有的 Actor 都是继承于 AActor 类,该类是所有可生成的游戏对象的基类。
3)Actor类里,PrimaryActorTick.bCanEverTick = true;// 将该Actor设置为每帧调用一次Tick()。如果您没有这个需要,可以将其关闭来改善性能。
在vc里定义一个能在编辑器下直接访问的属性
新建一个c++的Actor类


构造函数中设置上面两个变量的默认值


在vc里定义一个能被蓝图调用的函数
注:UFUNCTION里的函数不支持重载;



将蓝图里的参数传递到C++





name,text,string之间的相互转换
蓝图中的类型转换


C++中的类型转换


C++里调用蓝图里的函数





在C++创建一个能被蓝图调用的算数节点



蓝图里调用C++函数
注:只能在继承自本C++类的蓝图里调用;



调用时,如果函数里的参数里有结构体,该结构体在定义时需要加上BlueprintType关键字,且本函数需要有函数体



自定义枚举




UE4实例的获取
创建C++基础类

选择gameMode,并保存关卡



gameMode下需要加载的类

gameMode中加载上面创建的类

上图中的6个类,再加上gameInstance总共7个类,每个类文件里加一个打印函数

获取到实例后的运行效果如下图

代码如下
// Fill out your copyright notice in the Description page of Project Settings.
#include "TestActor001.h"
#include "testvcGameModeBase.h"
#include "PikaPlayerState.h"
#include "PikaPawn.h"
#include "PikaGameStateBase.h"
#include "PikaPlayerController.h"
#include "PikaHUD.h"
#include "PikaGameInstance.h"
// Sets default values
ATestActor001::ATestActor001()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void ATestActor001::BeginPlay()
{
Super::BeginPlay();
EventCurrent();
//通过GetWorld来获取实例
if (GetWorld())
{
//GameMode
AtestvcGameModeBase *pikaqiuGameMode = Cast<AtestvcGameModeBase>(GetWorld()->GetAuthGameMode());
if (pikaqiuGameMode)
{
pikaqiuGameMode->pikaPrint("pikaqiuGameMode");
}
//PikaPlayerState
APikaPlayerState *pikaPlayerStateVar = Cast<APikaPlayerState>(GetWorld()->GetFirstPlayerController()->PlayerState);
if (pikaPlayerStateVar)
{
pikaPlayerStateVar->pikaPrint("pikaPlayerState");
}
//PikaPlayerController
APikaPlayerController *pikaPlayerControllerVar = Cast<APikaPlayerController>(GetWorld()->GetFirstPlayerController());
if (pikaPlayerControllerVar)
{
pikaPlayerControllerVar->pikaPrint("pikaPlayerController");
}
//pikaPawn
APikaPawn *pikaPawnVar = Cast<APikaPawn>(GetWorld()->GetFirstPlayerController()->GetPawn());
if (pikaPawnVar)
{
pikaPawnVar->pikaPrint("pikaPawn");
}
//pikaHUD
APikaHUD *pikaHUDVar = Cast<APikaHUD>(GetWorld()->GetFirstPlayerController()->GetHUD());
if (pikaHUDVar)
{
pikaHUDVar->pikaPrint("pikaHUD");
}
//pikaGameStateBase
APikaGameStateBase *pikaGameStateBaseVar = Cast<APikaGameStateBase>(GetWorld()->GetGameState());
if (pikaGameStateBaseVar)
{
pikaGameStateBaseVar->pikaPrint("pikaGameStateBase");
}
//pikaGameInstance
UPikaGameInstance *pikaGameInstanceVar = Cast<UPikaGameInstance>(GetWorld()->GetGameInstance());
if (pikaGameInstanceVar)
{
pikaGameInstanceVar->pikaPrint("pikaGameInstance");
}
}
}
// Called every frame
void ATestActor001::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
float ATestActor001::pikaFloat(float pika1, float pika2)
{
return false;
}actor实例之间的相互获取
从PikaActorA里获取PikaActorB和PikaActorC的实例
创建三个c++的actor类,并为每个acotr创建一个基于本类的蓝图类


PikaActorB和PikaActorC里各加两个打印函数


注:GEngine需要包含Engine.h头文件;
蓝图的加载方式里,需要在蓝图里指定要获取的实例

运行效果如下:

加了迭代后的效果如下:

PikaActorA里的代码如下:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "PikaActorB.h"
#include "PikaActorC.h"
#include "PikaActorA.generated.h"
UCLASS()
class PIKAQIUTEST_API APikaActorA : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
APikaActorA();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
//从pikaActorA中获取pikaActorB和pikaActorC的实例
//方法一
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = UI)
APikaActorB *pikaActorBvar;
//方法二
TSubclassOf<AActor> getInstanceForC;
//APikaActorC *pikaActorCvar;
//通过迭代来获取场景中的实例
void GetInstanceFor();
void pikaPrint(FString pikaStr);
void pikaPrintSelf();
};
-------------------上面的PikaActorA.h文件,下面的PikaActorA.cpp文件
// Fill out your copyright notice in the Description page of Project Settings.
#include "PikaActorA.h"
#include "Engine.h"
// Sets default values
APikaActorA::APikaActorA()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
static ConstructorHelpers::FClassFinder<AActor> pikaActorCTemp(TEXT("/Game/MyPikaActorC"));
getInstanceForC = pikaActorCTemp.Class;
}
// Called when the game starts or when spawned
void APikaActorA::BeginPlay()
{
Super::BeginPlay();
if (GetWorld())
{
//从pikaActorA中获取pikaActorB的实例,该方法需要在蓝图下指定要获取的实例
if (pikaActorBvar)
{
APikaActorB *pikaActorBInstance = Cast<APikaActorB>(pikaActorBvar);
if (pikaActorBInstance)
{
pikaActorBInstance->pikaPrintSelf();
}
}
//从pikaActorA中获取pikaActorC的实例,需要在上面的构造函数里获取pikaActorC实例的路径
AActor *pikaActorCvar = GetWorld()->SpawnActor<AActor>(getInstanceForC, FVector::ZeroVector, FRotator::ZeroRotator);
if (pikaActorCvar)
{
APikaActorC *pikaActorCInstance = Cast<APikaActorC>(pikaActorCvar);
if (pikaActorCInstance)
{
pikaActorCInstance->pikaPrintSelf();
}
}
}
//调用迭代获取实例的函数
GetInstanceFor();
}
// Called every frame
void APikaActorA::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void APikaActorA::GetInstanceFor()
{
AActor *tempPointer = NULL;
//TObjectIterator它可以获取的到我们场景里面的Object实例
int pikaInt = 0;
for (TObjectIterator<AActor>It;It;++It)
{
tempPointer = *It;
if (tempPointer)
{
APikaActorA *pikaActorAInstance = Cast<APikaActorA>(tempPointer);
if (pikaActorAInstance)
{
pikaActorAInstance->pikaPrintSelf();
}
APikaActorB *pikaActorBInstance = Cast<APikaActorB>(tempPointer);
if (pikaActorBInstance)
{
pikaActorBInstance->pikaPrintSelf();
}
APikaActorC *pikaActorCInstance = Cast<APikaActorC>(tempPointer);
if (pikaActorCInstance)
{
pikaActorCInstance->pikaPrintSelf();
}
}
++pikaInt;
}
pikaPrint(FString::FromInt(pikaInt));
};
void APikaActorA::pikaPrint(FString pikaStr)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, pikaStr);
}
};
void APikaActorA::pikaPrintSelf()
{
pikaPrint("PikaActorA");
}写一个能被蓝图调用的C++类
1)创建一个蓝图函数类
