UE4和C++ 开发-编程基础记录(UE4+代码基础知识)

1、UE4基础元素

①Actor

我们又见面了Actor,Actor是在一个关卡中持续存在的,通常他包含几个Actor组件。支持网络复制和多人游戏。

Actor不包含位置,方向。这些东西在Root Component中存储。对于UE3 中的Pawn也由PlayerCharacter继承了,因为他有MovementComponent包含跳跃,速度等属性
由SpawnActor() 生成

必须由Destroy来销毁

在游戏中不能被垃圾回收
** 
②什么是ActorComponent?**

能被复用的功能可以添加进入Actor

包含一些最有趣的函数和事件

能被Blueprint访问~

③组件例子

Scene Component 添加形状和连接

Primitive Component 添加碰撞和渲染

UAudioComponent,UArrowComponent,UInputComponent,ULightComponent,UMeshComponent,UParticleSystemComponent等等...

写过UnrealScript会对组件深有体会

④PrimitiveComponent组件事件举例

Hit- 再碰到强的时候调用

Begin/EndOverlap -进出一个Trigger

Begin/EndCursorOver 没用过

Clicked/Released 不解释

InputTouchBegin/End

Begin/EndTouchOver

2:代码基础知识
类命名前缀

虚幻引擎为您提供在构建过程中生成代码的工具。这些工具拥有一些类命名规则。如命名与规则不符,将触发警告或错误。下方的类前缀列表说明了命名的规则。

派生自 Actor 的类前缀为 A,如 AController。
派生自 对象 的类前缀为 U,如 UComponent。
枚举 的前缀为 E,如 EFortificationType。
接口 类的前缀通常为 I,如 IAbilitySystemInterface。
模板 类的前缀为 T,如 TArray。
派生自 SWidget(Slate UI)的类前缀为 S,如 SButton。
其余类的前缀均为 字母 F ,如 FVector。

3、虚幻C++部分代码解释

#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public: 
    // 设置该 actor 属性的默认值
    AMyActor();
    // 游戏开始时或生成时调用
    virtual void BeginPlay() override;

    // 每帧调用
    virtual void Tick( float DeltaSeconds ) override;
};

AMyActor::AMyActor()

{

// 将此 actor 设为每帧调用 Tick()。不需要时可将bCanEverTick设置为false以关闭此功能,来提高性能。

PrimaryActorTick.bCanEverTick = true;

}

3.1、使属性出现在编辑器中

类创建好之后。现在可以创建一些属(设计师可是虚幻编辑器中设置这些属性)。可以使用 特殊宏 UPROPERTY() 来轻松的将属性公开至编辑器中可视。比如:UPROPERTY(EditAnywhere) 宏即可。

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)
    int32 TotalDamage;

    ...
};

之后。你就可以在编辑器中看到变量TotalDamage对应的数值。并且可以对数值进行调节。

除此之外还可以加入其他的属性。

除此之外,还可以通过宏定义来是一些属性在其关联属性被更改的时候也做出相应的改变:

void AMyActor::PostInitProperties()
{
    Super::PostInitProperties();

    CalculateValues();
}

void AMyActor::CalculateValues()
{
    DamagePerSecond = TotalDamage / DamageTimeInSeconds;
}
//通过WITH_EDITOR定义使这个函数的目标对象在编辑器中被更改时引擎将通知和运行这个函数。
#if WITH_EDITOR
void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
    CalculateValues();

    Super::PostEditChangeProperty(PropertyChangedEvent);
}
#endif

3.2、蓝图调用C++中的函数

上面说了如果对蓝图公开属性。那函数呢?对呀函数我们又得需要另一个宏来定义。

UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();

如上。 可以通过 UFUNCTION来把C++函数对反射系统公开。 而BlueprintCallable将其对蓝图虚拟机公开。这样在在蓝图中,右键点击快捷键菜单就可以使用这个函数。

3.3、AActor简单介绍

AActor 这个 类,被作为游戏场景中一个基本的对象。所以可以放在关卡场景中的对象都可延展自这个类,比如:AStaticMeshActor、ACameraActor 和 APointLight 等等 actor。

这个类派生在 UObject。

AActor 的生命周期为:

3.4、虚幻反射系统

再用UE4 C++ 编程的时候。同会看到好多非C++ 语句的字段。例如,他会在一个类上加上UCLASS() 等等。这些都是UE4使用其自身的反射实现,来启动动态功能,比如,垃圾回收,序列化,网络复制和蓝图/C++通信。这些功能你可以根据需求选择的加入,只要为相应的类型添加正确的标记就可生成反射数据。 一下是一些基础标记

#include "MyObject.generated.h" //这个头文件包含虚幻引擎所有反射数据。必须在声明类型的头文件中将此文件作为最后的 include 包含。

UCLASS(Blueprintable)
class UMyObject : public UObject
{
    GENERATED_BODY()

public:
    MyUObject();

    UPROPERTY(BlueprintReadOnly, EditAnywhere)
    float ExampleProperty;

    UFUNCTION(BlueprintCallable)
    void ExampleFunction();
};

您还会注意到,可以在标记上添加额外的说明符。此处已添加部分常用说明符用于展示。通过说明符可对类型拥有的特定行为进行说明。

Blueprintable - 此类可由蓝图延展。

BlueprintReadOnly - 此属性只可从蓝图读取,不可写入。

Category - 定义此属性出现在编辑器 Details 视图下的部分。用于组织。

BlueprintCallable - 可从蓝图调用此函数。

说明符太多,无法一一列举于此,以下链接可用作参考:

UCLASS 说明符列表

UPROPERTY 说明符列表

UFUNCTION 说明符列表

USTRUCT 说明符列表

3.5、对象/Actor 迭代器

就是 对应 U3D 的 for 循环。先查找关卡中所以的派生自UObject的 类的实例。然后遍历他们。

// 将找到当前所有的 UObjects(此处可以写入你自定义的类的类名) 实例
for (TObjectIterator<UObject> It; It; ++It)
{
    UObject* CurrentObject = *It;
    UE_LOG(LogTemp, Log, TEXT("Found UObject named:%s"), *CurrentObject.GetName());
}
相关推荐
q567315232 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
白榆maple9 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少14 分钟前
数据结构——线性表与链表
数据结构·c++·算法
许野平27 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨30 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar38 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧1 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式