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

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

code review!

文章目录

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.关于大写字母UA

2.1.组件和类的关系,组件也是类吗?

2.1. 类是什么?

  • (Class)是代码层面的概念,是某种对象的"蓝图"或"模板"。
  • 在C++或蓝图里定义的AActorUStaticMeshComponentUUserWidget等,都是
  • 类描述了对象的属性和行为,但本身不是"实体"。

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(静态网格体)、CameraComponentSpringArmComponent等。

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下)

5.5.简要总结

  • Actor是容器,负责管理生命周期、网络同步、交互等。
  • SceneComponent是可以被附加和定位的组件,决定Actor在世界中的空间信息。
  • Actor必须有一个SceneComponent作为RootComponent,才能具有位置和旋转。

6.SceneComponent是组件的其中一种组件还是说组件就是SceneComponent?

SceneComponent 只是组件(Component) 的一种,不是所有组件都是 SceneComponent

6.1.组件(Component)是什么?

  • 组件(UActorComponent)是可以附加到Actor上的功能模块,用来为Actor添加功能或行为。
  • 组件有很多种,不一定都有空间(Transform)属性。

6.2.SceneComponent是组件的一种

  • SceneComponentUSceneComponent)继承自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(有空间信息的组件)
        • 例如:UStaticMeshComponentUCameraComponent
      • 其他ActorComponent(没有空间信息的组件)
        • 例如:UAudioComponentUMovementComponent

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资产用途

  1. 作为对象模板:比如蓝图类就是Actor的模板,可以拖到场景中生成实例。
  2. 供运行时动态加载与引用:比如通过Class Reference变量,动态生成新对象。
  3. 数据驱动:数据资产/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逻辑。
相关推荐
半新半旧6 小时前
mongodb 学习笔记
笔记·学习·mongodb
wangbaowo10 小时前
MySQL数据库下篇
数据库·经验分享·笔记·学习·mysql·安全
chennalC#c.h.JA Ptho10 小时前
生成了一个AI算法
经验分享·笔记·aigc
麻雀无能为力11 小时前
C++自学笔记 makefile
笔记
五花肉村长11 小时前
Linux-Ext系列文件系统
linux·运维·服务器·c++·笔记·visual studio
麦田里的稻草人w12 小时前
拍摄学习笔记【前期】(一)曝光
笔记·学习
C++ 老炮儿的技术栈12 小时前
C++中什么是函数指针?
c语言·c++·笔记·学习·算法
再睡一夏就好12 小时前
C语言常见的文件操作函数总结
c语言·开发语言·c++·笔记·学习笔记
Alessio Micheli15 小时前
国债收益率、需求与抛售行为的逻辑解析
笔记