虚幻引擎5-Unreal Engine笔记之常用核心类的继承关系

code review!
文章目录
- [虚幻引擎5-Unreal Engine笔记之常用核心类的继承关系](#虚幻引擎5-Unreal Engine笔记之常用核心类的继承关系)
-
- 1.UE5中常用核心类的继承关系
-
- 1.1.简化版
- 1.2.plantuml图
- 1.3.plantuml代码
- 1.4.关于大写字母`U`和`A`
- 2.1.组件和类的关系,组件也是类吗?
- [2.1. 类是什么?](#2.1. 类是什么?)
- [2.2. 组件是什么?](#2.2. 组件是什么?)
- [2.3. 组件和类的关系](#2.3. 组件和类的关系)
- [2.4. UE中的典型结构](#2.4. UE中的典型结构)
- [2.5. 总结一句话](#2.5. 总结一句话)
- 3.这是组件还是类?
- 4.关卡蓝图是一个类吗?
-
- [4.1. 关卡蓝图是不是类?](#4.1. 关卡蓝图是不是类?)
- [4.2. 为什么关卡蓝图不是"类"?](#4.2. 为什么关卡蓝图不是“类”?)
- [4.3. 技术上关卡蓝图的底层](#4.3. 技术上关卡蓝图的底层)
- 5.Actor和SceneComponent的关系
- 5.1.Actor是什么?
- 5.2.SceneComponent是什么?
- 5.3.两者的关系
- 5.4.简单举例
- 5.5.简要总结
- 6.SceneComponent是组件的其中一种组件还是说组件就是SceneComponent?
- 7.UE5编辑器中的内容浏览器中的Class可以是些什么?
-
- [7.1.Class 在内容浏览器中的含义](#7.1.Class 在内容浏览器中的含义)
- [7.2.主要的 Class 资产类型](#7.2.主要的 Class 资产类型)
-
- [7.2.1.蓝图类(Blueprint Class)](#7.2.1.蓝图类(Blueprint Class))
- [7.2.2.数据资产(Data Asset)](#7.2.2.数据资产(Data Asset))
- [7.2.3.蓝图接口(Blueprint Interface)](#7.2.3.蓝图接口(Blueprint Interface))
- [7.2.4.枚举(Enum)/ 结构体(Struct)](#7.2.4.枚举(Enum)/ 结构体(Struct))
- [7.2.5.C++ Class(仅显示引用)](#7.2.5.C++ Class(仅显示引用))
- 7.2.6.其他类资产
- 7.3.内容浏览器中的Class资产用途
- 7.4.图示总结
- 7.5.补充说明
- 8.UE5编辑器中内容浏览器中的内容可能是SceneComponent吗?
1.UE5中常用核心类的继承关系
1.1.简化版

1.2.plantuml图

1.3.plantuml代码
@startuml
skin rose
' 基础对象
class UObject
' Actor体系
class AActor
UObject <|-- AActor
class APawn
AActor <|-- APawn
class ACharacter
APawn <|-- ACharacter
class AController
AActor <|-- AController
class APlayerController
AController <|-- APlayerController
class AAIController
AController <|-- AAIController
class AGamemodeBase
AActor <|-- AGamemodeBase
class AGamemode
AGamemodeBase <|-- AGamemode
class AGameStateBase
AActor <|-- AGameStateBase
class AGameState
AGameStateBase <|-- AGameState
class APlayerState
AActor <|-- APlayerState
class ASpectatorPawn
AActor <|-- ASpectatorPawn
class AStaticMeshActor
AActor <|-- AStaticMeshActor
class ALight
AActor <|-- ALight
class ADirectionalLight
ALight <|-- ADirectionalLight
class APointLight
ALight <|-- APointLight
class ASpotLight
ALight <|-- ASpotLight
class ACameraActor
AActor <|-- ACameraActor
' 组件体系
class UComponent
UObject <|-- UComponent
class USceneComponent
UComponent <|-- USceneComponent
class UPrimitiveComponent
USceneComponent <|-- UPrimitiveComponent
class UMeshComponent
UPrimitiveComponent <|-- UMeshComponent
class UStaticMeshComponent
UMeshComponent <|-- UStaticMeshComponent
class USkeletalMeshComponent
UMeshComponent <|-- USkeletalMeshComponent
class UShapeComponent
UPrimitiveComponent <|-- UShapeComponent
class UActorComponent
UComponent <|-- UActorComponent
class UMovementComponent
UActorComponent <|-- UMovementComponent
class UCharacterMovementComponent
UMovementComponent <|-- UCharacterMovementComponent
class UAudioComponent
UActorComponent <|-- UAudioComponent
@enduml
1.4.关于大写字母U
和A


2.1.组件和类的关系,组件也是类吗?
2.1. 类是什么?
- 类 (Class)是代码层面的概念,是某种对象的"蓝图"或"模板"。
- 在C++或蓝图里定义的
AActor
、UStaticMeshComponent
、UUserWidget
等,都是类。 - 类描述了对象的属性和行为,但本身不是"实体"。
2.2. 组件是什么?
- 组件 (Component)是指挂在Actor上的功能模块,比如碰撞体、网格、灯光、声音等。
- 组件本质上是类的实例对象 。比如
UStaticMeshComponent
是"网格组件"这个类,在关卡中创建一个"汽车Actor",可以给它添加一个网格组件 ,这个组件其实就是UStaticMeshComponent
类的一个实例。 - 组件不能单独存在,只能附着在Actor(或其它组件)上。
2.3. 组件和类的关系
概念 | 解释 | 关系说明 |
---|---|---|
类 | 代码中的一个模板,比如UStaticMeshComponent |
定义了组件的属性和功能 |
组件 | 类的一个实例,比如"角色的Mesh组件" | 是类实例化出来的具体对象 |
举个现实例子:
- "汽车"是类(模板),
- "汽车"是类的一个实例(对象),
- "后视镜"是组件类(后视镜的模板),
- "汽车上的后视镜"是后视镜组件类的一个实例(挂在汽车上的后视镜对象)。
2.4. UE中的典型结构
- Actor 是一个类,在场景里拖一个"Actor"进去,其实是Actor类的一个实例。
- 组件 也是类,比如
UStaticMeshComponent
,给Actor添加一个网格组件,就是实例化了UStaticMeshComponent
这个类,然后"挂"到了这个Actor身上。
代码层面举例:
cpp
// 定义自己的Actor类
class AMyActor : public AActor
{
public:
UPROPERTY()
UStaticMeshComponent* MeshComp;
AMyActor()
{
MeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComp"));
RootComponent = MeshComp;
}
};
- 这里
UStaticMeshComponent
是类,MeshComp
是这个类的实例,被挂到AMyActor上。
2.5. 总结一句话
组件是类的实例,是Actor的"零部件"。组件的类型由组件的类决定。
3.这是组件还是类?

截图中黄色框选部分 (比如 Audio、Point Light、Skeletal Mesh、Static Mesh、Sphere、Cube、Plane 等)在编辑器里叫"组件" ,但本质上:
- 它们是"组件类型"或"组件类"的名字,代表可以往当前Actor里添加这类组件的实例。
- 当点击它们,比如"Static Mesh",就会给Actor添加一个"Static Mesh 组件实例" ,这个实例本质上就是
UStaticMeshComponent
类的一个对象。
换句话说
- 列表里的每一项,比如"Static Mesh",其实对应一个组件类 (比如
UStaticMeshComponent
)。 - 但点击添加到Actor后,在Actor身上的就是"组件实例",即真正的"组件"。
总结
-
图中是"组件类型选择列表",每一项是一个组件类。
-
添加到Actor上的是该类的一个组件实例。
-
这个列表就像是"零件目录"(比如"轮子"、"车灯"),
-
点一下,相当于"从工厂拿一个零件(类的新实例)装到的Actor上"。
4.关卡蓝图是一个类吗?
4.1. 关卡蓝图是不是类?
关卡蓝图不是传统意义上的"类",它和普通的"蓝图类"有本质区别。
4.1.2.关卡蓝图是什么?
- 关卡蓝图 是某个具体关卡(Level)唯一对应的脚本,只属于该关卡。
- 它不能被复用、继承或实例化成多个对象。
- 它不像普通蓝图(如Actor蓝图、Widget蓝图)那样,是某个类的定义,可以生成无数实例。
4.1.3.普通蓝图类是什么?
- 比如Actor蓝图 ,本质是类的定义,可以在关卡里拖很多个实例出来。
4.2. 为什么关卡蓝图不是"类"?
- 关卡蓝图没有类名 ,不能像
AActor
那样被继承或派生。 - 它只服务于当前这个关卡,里面的逻辑只在本关卡运行时才执行。
- 它的本质更接近于"该关卡的全局事件脚本"或"唯一的控制器"。
4.3. 技术上关卡蓝图的底层
- 在UE底层,关卡蓝图由引擎自动生成了一个特殊的蓝图类(比如
ALevelScriptActor
的子类),但无法像普通蓝图那样操作这个类型。 - 在编辑器里看不到"关卡蓝图类",也无法基于它创建多个对象。
- 每个关卡只有一个关卡蓝图。
关卡蓝图不是普通意义上的"类",而是关卡的唯一全局脚本。它本身不是可以复用或实例化的类。
- Actor蓝图、Pawn蓝图、Widget蓝图等,是"类",可以复用、继承、实例化。
- 关卡蓝图,只有"单例",只属于当前关卡,不能像类一样被复用。
如果想让一段逻辑可以被多个关卡或多个对象复用,应该写成Actor蓝图或自定义C++类,而不是关卡蓝图。
5.Actor和SceneComponent的关系
5.1.Actor是什么?
- Actor 是虚幻引擎中可放置到关卡(Level)中的对象的基类。
- 你可以把Actor理解为**"游戏世界中的实体"**,比如玩家角色、道具、灯光、敌人等。
- Actor本身并没有可见的形状或位置,但它管理和组织一组组件。
5.2.SceneComponent是什么?
- SceneComponent 是一种特殊的组件,具有**空间变换(位置、旋转、缩放)**的能力。
- 也就是说,SceneComponent可以有自己的坐标系,可以附加到其他SceneComponent上形成层级结构。
- 典型的SceneComponent有:
StaticMeshComponent
(静态网格体)、CameraComponent
、SpringArmComponent
等。
5.3.两者的关系
- 每个Actor 都可以包含一个或多个Component(组件),其中可以包含多个SceneComponent。
- SceneComponent提供了空间(Transform)信息,这样Actor就能"存在"在世界的某个位置。
- 通常,Actor会有一个RootComponent(根组件),而RootComponent通常是一个SceneComponent。所有其他组件都可以附加到RootComponent上,形成一个组件树。
示意关系图
Actor
│
├── SceneComponent (RootComponent)
│ ├── SceneComponent (子组件)
│ │ └── SceneComponent (孙组件)
│ └── StaticMeshComponent
│
└── 其它非SceneComponent(如AudioComponent等)
- Actor 本身没有位置,RootComponent(通常是SceneComponent)决定了Actor的位置。
5.4.简单举例
例如,你有一个角色Actor:
MyCharacterActor
- RootComponent:
CapsuleComponent
(SceneComponent)MeshComponent
(角色网格,附加在RootComponent下)CameraComponent
(摄像机,附加在RootComponent下)
- RootComponent:
5.5.简要总结
- Actor是容器,负责管理生命周期、网络同步、交互等。
- SceneComponent是可以被附加和定位的组件,决定Actor在世界中的空间信息。
- Actor必须有一个SceneComponent作为RootComponent,才能具有位置和旋转。
6.SceneComponent是组件的其中一种组件还是说组件就是SceneComponent?
SceneComponent 只是组件(Component) 的一种,不是所有组件都是 SceneComponent。
6.1.组件(Component)是什么?
- 组件(
UActorComponent
)是可以附加到Actor上的功能模块,用来为Actor添加功能或行为。 - 组件有很多种,不一定都有空间(Transform)属性。
6.2.SceneComponent是组件的一种
- SceneComponent (
USceneComponent
)继承自UActorComponent
,是具有空间变换(位置、旋转、缩放)能力的组件。 - 只有SceneComponent及其子类可以形成层级结构,被附加到Actor的RootComponent上。
6.3.组件的分类关系图
UActorComponent
│
├── USceneComponent ← 有空间信息(位置、旋转等)
│ ├── UStaticMeshComponent
│ ├── USkeletalMeshComponent
│ ├── UCameraComponent
│ └── ...(其他有空间信息的组件)
│
└── UAudioComponent ← 没有空间(直接继承自UActorComponent)
└── UProjectileMovementComponent
└── UActorComponent ← 你自定义的功能组件
6.4.举例说明
-
SceneComponent 子类:
UStaticMeshComponent
(静态网格体)UCameraComponent
(摄像机)USpringArmComponent
(弹簧臂)- 这些都可以拥有位置、旋转和缩放,并能形成父子层级。
-
非 SceneComponent 的组件:
UAudioComponent
(音频组件)UMovementComponent
(移动组件)- 这些没有空间(Transform)属性,不能组成空间层级,只是为Actor添加额外功能。
6.5.结论
-
SceneComponent 是组件的一种,专门用于有空间变换需求的情况。
-
不是所有组件都是 SceneComponent。
-
组件体系结构如下:
- UActorComponent(基础组件)
- USceneComponent(有空间信息的组件)
- 例如:
UStaticMeshComponent
、UCameraComponent
等
- 例如:
- 其他ActorComponent(没有空间信息的组件)
- 例如:
UAudioComponent
、UMovementComponent
等
- 例如:
- USceneComponent(有空间信息的组件)
- UActorComponent(基础组件)
7.UE5编辑器中的内容浏览器中的Class可以是些什么?
在 Unreal Engine 5 编辑器的内容浏览器(Content Browser)中,Class 指的是资产(Asset)的一种类型,也就是类资产。这些类资产主要用于蓝图(Blueprint)、数据资产(Data Asset)、C++类引用等多种用途。下面详细讲解一下:
7.1.Class 在内容浏览器中的含义
- 在内容浏览器中,Class 通常指的是UClass,也就是 Unreal 对象系统中的"类"。
- 当右键选择"添加资产"时,选项里有"蓝图类(Blueprint Class)"、"数据资产(Data Asset)"等。
- 可以直接在内容浏览器中看到和管理各种类相关的资产,比如蓝图类、数据资产、接口等。
7.2.主要的 Class 资产类型
7.2.1.蓝图类(Blueprint Class)
- 最常见的 Class 资产。
- 包括继承自 Actor、Pawn、Character、Component、Widget、GameMode 等不同父类的蓝图。
- 用于可视化编写和扩展逻辑。
7.2.2.数据资产(Data Asset)
- 继承自
UDataAsset
或其它数据驱动的类。 - 用于存储结构化数据,例如怪物参数、配置表、对话文本等。
7.2.3.蓝图接口(Blueprint Interface)
- 定义一组可以被实现的函数,但不包含实际实现。
- 用于不同蓝图之间的通信。
7.2.4.枚举(Enum)/ 结构体(Struct)
- 虽然严格来说不是"Class",但在内容浏览器中可以创建并管理。
- 用于定义数据类型。
7.2.5.C++ Class(仅显示引用)
- 如果用C++扩展项目,内容浏览器中可以看到C++类的引用,但不能直接编辑C++类。
- 可以右键"创建蓝图类"继承C++类。
7.2.6.其他类资产
- Animation Blueprint(动画蓝图类)
- Behavior Tree(行为树类)
- Widget Blueprint(UI小部件类)
- Material Function、Material Parameter Collection(材质相关类)
- 等等
7.3.内容浏览器中的Class资产用途
- 作为对象模板:比如蓝图类就是Actor的模板,可以拖到场景中生成实例。
- 供运行时动态加载与引用:比如通过Class Reference变量,动态生成新对象。
- 数据驱动:数据资产/DataTable用于配置和调优游戏内容。
7.4.图示总结
text
内容浏览器中的Class资产(常见类型)
- Blueprint Class(蓝图类)
- Data Asset(数据资产)
- Blueprint Interface(蓝图接口)
- Enum / Struct(枚举/结构体)
- Animation Blueprint(动画蓝图)
- Behavior Tree(行为树)
- Widget Blueprint(UI蓝图)
- Material Function / Collection(材质类资产)
- C++ Class(仅引用,不可编辑)
7.5.补充说明
- 在内容浏览器中,Class资产不是运行时实例,而是可以被实例化的"模板"或"配置"。
- 可以通过右键菜单创建新的Class资产,或者对它们进行组织、继承和管理。
8.UE5编辑器中内容浏览器中的内容可能是SceneComponent吗?
一般情况下,SceneComponent
不是内容浏览器里的"Class资产"。
详细解释
1.内容浏览器中的Class资产是什么?
- 内容浏览器里的"Class资产",通常指的是可以作为资产被保存和引用的类,例如"蓝图类(Blueprint Class)"、"数据资产(Data Asset)"、"蓝图接口(Blueprint Interface)"等。
- 这些资产可以在内容浏览器中单独管理、创建、编辑和引用。
2.SceneComponent是什么?
SceneComponent
是一个组件类 ,通常作为Actor蓝图或C++类的组件成员存在。- 它不是一个可以单独作为资产保存或拖进场景的对象。
3.你能在内容浏览器中看到SceneComponent吗?
- 不能 :你无法直接在内容浏览器中创建一个"SceneComponent资产"。
- 你可以在内容浏览器中创建一个Actor蓝图类 (比如
MyActor
),然后在蓝图编辑器里给这个Actor添加SceneComponent。 - 但SceneComponent本身不会作为独立的Class资产出现在内容浏览器里。
4.例外情况
- 可以创建"继承自SceneComponent的蓝图类",比如你新建一个"继承自SceneComponent的蓝图",这时这个蓝图就是一个Class资产。
- 但这种蓝图不能直接拖进关卡作为Actor使用,只能作为组件被添加到别的Actor里。
- 所以,内容浏览器里的Class资产可以是"SceneComponent的子类蓝图",但它本身不是可以直接用来实例化到场景里的资产。
总结
- 内容浏览器里的Class资产,大多数是Actor类及其子类,当然也可以新建"继承自SceneComponent的蓝图类"。
- SceneComponent本身作为资产没有用途,但你可以在内容浏览器里看到"继承自SceneComponent的蓝图类"。
- 这些组件蓝图只能作为组件被添加到别的Actor里,而不是直接出现在场景中。
典型用法举例
- 在内容浏览器中创建一个
MyCustomComponent
(继承自SceneComponent的蓝图类)。 - 在你自己的Actor蓝图中,添加组件 ,选择你刚刚创建的
MyCustomComponent
。 - 这样就能复用你自定义的SceneComponent逻辑。