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());
}
相关推荐
十八度的天空2 分钟前
第01节 Python的基础语法
开发语言·python
谈笑也风生3 分钟前
经典算法题型之排序算法(三)
java·算法·排序算法
OliverH-yishuihan9 分钟前
在win10上借助WSL用VS2019开发跨平台项目实例
linux·c++·windows
yue00814 分钟前
C# 字符串倒序
开发语言·c#
强子感冒了21 分钟前
Java学习笔记:String、StringBuilder与StringBuffer
java·开发语言·笔记·学习
低保和光头哪个先来28 分钟前
场景6:对浏览器内核的理解
开发语言·前端·javascript·vue.js·前端框架
小北方城市网31 分钟前
Python + 前后端全栈进阶课程(共 10 节|完整版递进式|从技术深化→项目落地→就业进阶,无缝衔接基础课)
大数据·开发语言·网络·python·数据库架构
程序员JerrySUN36 分钟前
OP-TEE + YOLOv8:从“加密权重”到“内存中解密并推理”的完整实战记录
android·java·开发语言·redis·yolo·架构
阿里嘎多学长1 小时前
2025-12-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
汉克老师1 小时前
GESP2025年12月认证C++二级真题与解析(编程题1 (环保能量球))
c++·gesp二级·gesp2级