UE5【C++】 UPROPERTY和UFUNCTION介绍

本文介绍了UE5中C++的UPROPERTY和UFUNCTION的使用,包括常见属性说明符和使用示例。UPROPERTY用于定义变量的元数据,允许在编辑器和蓝图中进行编辑。UFUNCTION则用于标记可从蓝图调用的函数,提供了多种调用属性。此外,文章还讨论了虚幻引擎中的Actor和组件的概念,如RootComponent、ActorComponent和SceneComponent,以及它们在游戏开发中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


UPROPERTY介绍

属性使用标准的C++变星语法声明,前面用UPROPERTY宏来定义属性元数据和变量说明符。UPROPERTY的作用是将变量公开到编辑器或蓝图。

常见属性说明符

  1. VisiableAnyWhere: 如果给一个变量声明了此关键词,那么它会出现在蓝图编辑器的右边和主编辑器上。(只是显示,不能编辑)
  2. VisibleDefaultsOnly: 在主编辑器中不显示,但是在蓝图编辑器中显示(不可编辑),Default默认是蓝图编译器。
  3. EditDefaultsOnly: 在蓝图中可以编辑,但是在主编辑器中不显示所以不可编辑,只在类默认设置中可见。
  4. EditAnywhere: 在主编辑器和蓝图编辑器中都显示并且都可以编辑。
  5. EditInstanceOnly: 在蓝图编辑器中不可修改但是可见,只有当蓝图实例化到场景中点击该组件才会出现相应的设置,实例化之后可以修改。但只能在原型上进行。

使用示例

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyCategory")
int MyInt;

在这个示例中,MyInt 是一个整数类型的属性,它被定义为可以在蓝图编辑器和主编辑器中都被编辑,并且可以在蓝图中被读写。

UFUNCTION介绍

使用 UFUNCTION 宏可以方便地为我们的函数添加元数据和属性,使得它们可以在蓝图中方便地使用和调用。

常见属性说明符

  • BlueprintCallable:此函数可在蓝图或关卡蓝图图表中执行。此函数不对拥有它的对象产生任何影响,可在蓝图或关卡蓝图图表中执行。
  • BlueprintPure:此函数可在蓝图或关卡蓝图图表中执行。此函数不对拥有它的对象产生任何影响,可在蓝图或关卡蓝图图表中执行。
  • BlueprintlmplementableEvent:需要在蓝图里面重载。此函数旨在被蓝图覆盖掉,但是也具有默认原生实现。用于声明名称与主函数相同的附加函数,但是末尾添加了Implementation,是写入代码的位置。如果未找到任何蓝图覆盖,该自动生成的代码将调用Implementation方法。
  • BlueprintReadOnly:蓝图只读
  • BlueprintReadWrite:蓝图可读可写
  • BlueprintNativeEvent:可通过细节(Details) 面板中的按钮在编辑器中的选定实例上调用此函数。
  • CallnEditor:可通过细节(Details) 面板中的按钮在编辑器中的选定实例上调用此函数。
  • ServerClient :表示这个函数是由服务器或客户端调用的。

使用示例

UFUNCTION(BlueprintCallable, Category = "MyCategory")
void MyFunction(int MyInt, FString MyString);

在这个示例中,MyFunction 是一个没有返回值的函数,它被定义为可以在蓝图中被调用,并且属于 MyCategory 类别。这个函数接受两个参数,一个整数类型的参数 MyInt 和一个字符串类型的参数 MyString

  • BlueprintCallable 表示这个函数可以在蓝图中被调用。
  • Category 表示这个函数属于哪个类别,可以在蓝图编辑器中方便地对函数进行分类和查找。

虚幻四种基本继承关系和组件的概念

虚幻引擎中有四种基本的继承关系:ActorPawnCharacterObject。其中,Actor 是最基本的继承关系,其他三种都是从 Actor 派生而来的。

Actor和组件的关系

组件可以附件到Actor身上,但是不能独立出现在场景中。Actor好比是人,组件好比是衣服,人可以出去逛街,衣服不行。

RootComponent的作用

每个 Actor 都必须有一个 RootComponent,它是所有其他组件的父组件。如果我们想要移动 Actor 或者旋转它,那么需要移动或旋转 RootComponent。

组件的分类

虚幻引擎中的组件可以分为两种:Actor Component 和 Scene Component。Actor Component 是一种可以附加到 Actor 上的组件,而 Scene Component 则只能依附于其他组件而不能单独放置到场景中。

组件的使用

组件可以在蓝图或 C++ 代码中创建和使用。如果我们想要创建一个新的组件,可以右键点击场景中的 Actor 并选择“Add Component”选项。然后在弹出的菜单中选择要创建的组件类型。

UActorComponent的作用

这是基础组件。其可作为Actor的一部分被包含。如果需要,其可进行Tick 。
ActorComponents与特定的Actor相关联,但不存在于场景中的任意特定位置。它们通常用于概念上的功能,如AI或解译玩家输入。
Actor Component (UActorComponent类) 有自己的行为,通常负责在许多类型Actor之间共享的功能,例如,提供视觉网格体、粒子效果、摄像机视角和物理互动。Actor通常提供与其游戏总体角色有关的高级目标,而Actor Component通常执行用于支持这些更高级目标的单独任务。

组件也可以与其他组件相连接,或者可以成为Actor的根组件。一个组件只能连接到一个父组件或Actor,但可以连接多个子Actor。我们可以想象一个组件树。子组件的位置、旋转和缩放相对于其父组件或Actor。

Ticking

在所属Actor的Tick()过程中执行Tick函数。(在编写自己的 Tick函数时,必须确保调用Super::Tick)

USceneComponent

SceneComponents是拥有变换的ActorComponents。变换是场景中的位置,由位置、旋转和缩放定义。

SceneComponents能以层级的方式相互附加。Actor的位置、旋转和缩放取自位于层级根部的SceneComponent。

UPrimitiveComponent

PrimitiveComponent是拥有一类图像表达(如网格体或粒子系统)SceneComponent。许多物理和碰撞设置均在此处。
Actor支持拥有一个SceneComponent的层级。每个Actor也拥有一个RootComponent属性,将指定作为Actor根的组件。

Actor自身不含变换,因此不带位置、旋转,或缩放。它们依赖于其组件的变换,具体来说是其根组件的变换。

<think>好的,用户让我总结一下UE5 C++的语法定义。首先,我需要明确用户的需求。他们可能已经有一定的C++基础,现在想转向UE5的开发,所以需要了解UE5C++上的扩展特有语法。 首先,我应该回顾UE5 C++的基本概念,比如UCLASS、UFUNCTION这些宏,这些是UE反射系统的核心。然后要考虑UE5新增的特性,比如增强输入系统Gameplay Ability System的变化。用户可能需要知道如何声明类、函数,以及如何处理属性委托。 接下来,结构方面,需要分点说明。比如基础语法部分包括宏、类定义、函数、属性、委托接口。然后可以提到UE5的新特性,比如Enhanced Input、Gameplay Abilities的改进,还有LumenNanite的技术,虽然这些可能更多涉及蓝图引擎功能,但C++层面如何支持也需要简要说明。 要注意用户可能混淆C++基础语法UE的扩展,所以需要明确区分哪些是标准C++,哪些是UE的扩展。例如,UHT(Unreal Header Tool)生成的代码宏的使用是关键点。 另外,用户可能需要示例代码来理解如何定义类或属性,所以给出简单的代码示例会有帮助。例如,展示一个UCLASS的声明,或者使用UPROPERTY的示例。 还需要注意常见错误,比如忘记使用宏导致无法被UE识别,或者内存管理方面的注意事项,比如UObject不能使用普通指针,而要用TWeakPtr或UE智能指针。 最后,确保语言简洁,结构清晰,分点列出,方便用户快速查阅。可能用户是刚开始学习UE5 C++,所以避免过于深入引擎底层细节,而是聚焦在语法常用定义上。</think>我将从语法特征核心概念两个层面为您梳理UE5 C++开发的关键要点: # 一、UE5 C++核心语法特征 1. **反射系统宏**(核心基础) - `UCLASS([specifiers])`:声明反射类,继承自`UObject` - `UFUNCTION([specifiers])`:声明反射函数 - `UPROPERTY([specifiers])`:声明反射属性 - `USTRUCT([specifiers])`:声明反射结构体 ```cpp // 典型类声明示例 UCLASS(Blueprintable) class MYPROJECT_API AMyActor : public AActor { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite) float Health = 100.0f; UFUNCTION(BlueprintCallable) void TakeDamage(float DamageAmount); }; ``` 2. **内存管理机制** - 使用`UObject`派生类自动内存管理 - 智能指针:`TSharedPtr`/`TWeakPtr`(非UObject对象) - 容器类:`TArray`/`TMap`/`TSet`替代STL容器 3. **委托系统** - 单播委托:`DECLARE_DELEGATE` - 多播委托:`DECLARE_MULTICAST_DELEGATE` - 动态委托:`DECLARE_DYNAMIC_DELEGATE` # 二、UE5新增特性定义 1. **增强输入系统** ```cpp UCLASS() class UMyInputConfig : public UDataAsset { GENERATED_BODY() UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) UInputAction* JumpAction; }; ``` 2. **Gameplay Ability System (GAS)** - `UGameplayAbility`:定义游戏技能 - `UGameplayEffect`:实现状态效果 - `FGameplayTag`:标签系统管理状态 3. **元编程特性** - 静态反射:`TSubclassOf<T>`类型安全类引用 - 接口系统:`UINTERFACE`宏声明 # 三、开发注意事项 1. **编译规则** - 必须使用Unreal Header Tool (UHT) 预处理 - 遵循`模块名.Build.cs`的编译配置 - 采用热重载开发模式 2. **命名规范** - 类前缀:`A`-Actor,`U`-Object,`F`-结构体 - 接口前缀:`I` - 模板类前缀:`T` 3. **最佳实践** - 优先使用蓝图可调用函数 - 合理使用`EditAnywhere`/`VisibleAnywhere`属性说明符 - 注意线程安全性(Gameplay线程与渲染线程分离) 建议结合官方文档《C++ Programming in Unreal Engine》进行实践,通过创建C++类向导生成基础框架代码可快速掌握项目结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗情深

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值