UE 基础

函数,事件,宏

functions:
不能使用 latent 函数,如 delay,timeline
可以 private,外部不能调用
可以使用 local variable
可以有返回值 return value

event:
可以使用时间函数
不能 private
可以 replicated

macro:
不能在外部被调用
可以使用时间函数
multiple execution pins

将属性公开给编辑器

// EditAnywhere:公开给编辑器中任何可编辑属性的地方
// BlueprintReadWrite:可在蓝图中拉出 GET SET NODE
UPROPERTY(EditAnywhere, BlueprintReadWrite)

将函数公开给蓝图,蓝图只能调用

UFUNCTION(BlueprintCallable)
void CountdownHasFinished();

将函数公开给蓝图,cpp中提供默认实现,允许蓝图对其覆盖

UFUNCTION(BlueprintNativeEvent)
void CountdownHasFinished();
// _Implementation 后缀是固定格式
virtual void CountdownHasFinished_Implementation();

在 cpp 中只需实现 _Implementation 的版本

// 在cpp中定义默认行为
void ACountdown::CountdownHasFinished_Implementation()
{
    CountdownText->SetText(TEXT("GO!"));
}

在蓝图中实现函数,让 cpp 进行调用
先在 cpp 中声明函数

UFUNCTION(BlueprintImplementableEvent)
void CalledFromCpp();

在蓝图中实现该函数UE 基础_第1张图片
在 cpp 中合适的地方调用

void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	CalledFromCpp();
}

多播委托与事件
多播委托就是可以绑定多个函数(使用ADD(),或在蓝图中绑定),多播委托函数不能使用返回值
事件是一种特殊类型的多播委托,只能在声明类中访问 Broadcast()、IsBound() 和 Clear() 函数。(和 C# 事件与委托关系一样?)
声明为动态委托可序列化,在蓝图中其函数可按命名查找,但其执行速度比常规委托慢

// 声明委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPlayerDieDelegate);
// BlueprintAssignable 只能与组播委托共用, 公开属性给蓝图绑定委托
UPROPERTY(BlueprintAssignable)
FPlayerDieDelegate OnPlayerDie;

蓝图中绑定委托,需使用自定事件
UE 基础_第2张图片
另外发现继承 component 组件声明的委托,在蓝图中直接拉出来用不需要 Bind…Node?

执行多播委托

void AMyActor::PlayerDie()
{
	OnPlayerDie.Broadcast();
}

对象引用与类引用

UDamageType* damType; // object reference
UClass* damType; // class reference
TSubclassOf<UDamageType> damType; // class reference

第一个是对象指针,指向在 runtime 中已创建的对象实例
第二个是类型指针,指向编辑器中的资源,用于创建新对象

蓝图访问 cpp 自定义组件函数

// 声明组件时,必须是蓝图可读
UPROPERTY(BlueprintReadOnly)
UCustomComponent* CustomComponent;

// .h
// 函数必须也是指定为可调用
UFUNCTION(BlueprintCallable)
void FuncToCall(float Throw);

在 cpp 中获取蓝图中组件的引用

// .h
UCustomComponent* CustomComponent;

方式一:使用构造函数直接创建后拿到引用

// .cpp
CustomComponent= CreateDefaultSubobject<UCustomComponent(FName("CustomComponent"));

方式二:在 BeginPlay (运行时)中查找组件

// .cpp
void ATank::BeginPlay()
{
	Super::BeginPlay();
	CustomComponent = FindComponentByClass<CustomComponent>();
}

方式三:通过蓝图(构造函数或BeginPlay函数)调用 Set 函数

// .h
UFUNCTION(BlueprintCallable)
void SetCustomMesh(UCustomComponent* Comp);

// .cpp
void SetCustomMesh(UCustomComponent* Comp)
{
	CustomComponent= Comp;
}

在 cpp 调用碰撞回调函数

在UE中调用碰撞回调函数需要手动绑定到委托(Unity只要实现相应方法即可)

// 定义要绑定的函数(参数签名必须符合对应的委托)
// 以下是 OnComponentHit 的参数签名
// .h
UFUNCTION()
void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, 
UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

// .cpp
// 在构造函数中绑定
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(FName("Mesh"));
Mesh->OnComponentHit.AddDynamic(this, &AExample::OnHit);

其他 OnOverlapBegin 等也是一样,只需要注意签名的不同

你可能感兴趣的:(游戏,ue4)