news 2026/7/13 5:05:09

UEcpp创建Actor并添加组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UEcpp创建Actor并添加组件

本文用于记录UE学习。


UE C++中,一个常见的Actor的创建过程可以分成三部分:

  1. 在.h中声明组件变量
  2. 在构造函数中使用CreateDefaultSubobject创建组件。
  3. 在BeginPlay()中执行游戏运行时的初始化

组件是 Actor 持有的子对象,可以负责显示、碰撞、声音、摄像机等功能。


创建一个Actor包含:

  1. 场景组件 SceneRoot
  2. 静态网格组件 MeshComponent
  3. 盒体碰撞组件 BoxCollision

实例写法:

//.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ComponentActor.generated.h" // 前置声明 class USceneComponent; class UStaticMeshComponent; class UBoxComponent; UCLASS() class NEW_CPP_API AComponentActor : public AActor { GENERATED_BODY() public: AComponentActor(); protected: virtual void BeginPlay() override; protected: // 根组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") TObjectPtr<USceneComponent> SceneRoot; // 模型组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") TObjectPtr<UStaticMeshComponent> MeshComponent; // 碰撞组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") TObjectPtr<UBoxComponent> BoxCollision; };

前置声明是什么?

它是提前告诉编译器有一个类叫USceneComponent,类的具体内容以后再告知。编译器此时只知道这些名字是类,不知道类内部有什么。

TObjectPtr<USceneComponent> SceneRoot; 是什么?

可分为三个部分:

  • TObjectPtr 模板类型
  • <USceneComponent> 保存的对象类型
  • SceneRoot 变量名

表示创建一个名为SceneRoot,它用于引用USceneComponent类型的UObject对象。

此处也可以用指针,初学阶段貌似是没有差异的:USceneComponent* SceneRoot;

#include "ComponentActor.h" #include "Components/SceneComponent.h" #include "Components/StaticMeshComponent.h" #include "Components/BoxComponent.h" AComponentActor::AComponentActor() { // 如果不需要每帧执行 Tick,就关闭 PrimaryActorTick.bCanEverTick = false; // 1. 创建场景根组件 SceneRoot = CreateDefaultSubobject<USceneComponent>( TEXT("SceneRoot") ); // 2. 将其设置为 Actor 的根组件 SetRootComponent(SceneRoot); // 3. 创建静态网格体组件 MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>( TEXT("MeshComponent") ); // 4. 将网格体附加到根组件 MeshComponent->SetupAttachment(SceneRoot); // 5. 创建盒体碰撞组件 BoxCollision = CreateDefaultSubobject<UBoxComponent>( TEXT("BoxCollision") ); // 6. 将碰撞组件附加到根组件 BoxCollision->SetupAttachment(SceneRoot); // 7. 设置碰撞盒大小 BoxCollision->SetBoxExtent(FVector(50.0f, 50.0f, 50.0f)); // 8. 设置组件的相对位置 MeshComponent->SetRelativeLocation( FVector(0.0f, 0.0f, 0.0f) ); BoxCollision->SetRelativeLocation( FVector(0.0f, 0.0f, 0.0f) ); } void AComponentActor::BeginPlay() { Super::BeginPlay(); if (GEngine) { GEngine->AddOnScreenDebugMessage( -1, 3.0f, FColor::Green, TEXT("ComponentActor BeginPlay") ); } }

SceneRoot = CreateDefaultSubobject<USceneComponent>(
TEXT("SceneRoot")
);

右边创建一个场景组件对象;左边把创建出来的组件对象地址保存到头文件声明的SceneRoot变量中。.cpp文件中的SceneRoot和.h中的SceneRoot是同一个成员变量。

CreateDefaultSubobject为创建组件或其他子对象的函数。基本格式如下:

组件变量 = CreateDefaultSubobject<组件类型>( TEXT("组件名称") ); //例如: MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>( TEXT("MeshComponent") ); //UStaticMeshComponent:要创建的组件类型 //MeshComponent:保存组件地址的成员变量 //"MeshComponent":组件在UE对象系统中的名称

设置根组件SetRootComponent()

每个具有空间位置的Actor通常都需要一个根组件。Actor世界位置、世界旋转、世界缩放都以根组件为基础。


设置组件父子关系:

MeshComponent->SetupAttachment(SceneRoot)

表示将MeshComponent绑定为SceneRoot的子类。


为什么使用USceneComponent作为根组件

USceneComponent具有Transform,支持组件附加,且本身没有模型、没有碰撞;可类比于蓝图组件面板中的DefaultSceneRoot组件

对于需要移动和碰撞的Actor(如:子弹、拾取物、陷阱、移动平台等),通常可以让碰撞组件直接作为根组件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 5:05:02

# [特殊字符] 太空模拟器 — 鸿蒙ArkTS完整技术解析

应用定位&#xff1a;太空探索模拟类小应用 技术栈&#xff1a;HarmonyOS NEXT ArkTS Stage模型 源码行数&#xff1a;165行 核心亮点&#xff1a;目标驱动飞行系统、多星球目标选择、燃料精确管理、星际距离系统、星星采集一、引言 太空模拟器是系列中第一个引入目标驱动系统…

作者头像 李华
网站建设 2026/7/13 5:03:59

城市对比分析实战:构建个人尺度的约束满足型决策模型

1. 项目概述&#xff1a;一场用数据说话的城市选择实验 “Mumbai vs. Delhi, What is Your Choice? Let the Data Decide!”——这个标题乍看像一篇旅游攻略或社交媒体投票帖&#xff0c;但真正懂行的人一眼就能看出&#xff0c;它背后藏着一套完整、可复现、有现实决策价值的…

作者头像 李华
网站建设 2026/7/13 5:02:32

python 学习 拷贝

1. 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝创建一个新的字典对象&#xff0c;但只复制原字典中元素的引用&#xff0c;不复制元素本身。实现方式&#xff1a; python 复制 下载 import copyoriginal {a: [1, 2, 3], b: {x: 10, y: 20}}# 方法1&#xff1a;使用 di…

作者头像 李华
网站建设 2026/7/13 4:59:58

PIC18LF46K42与PAM8904构建可定制警报系统

1. 项目背景与核心需求在现代电子设备中&#xff0c;警报和通知系统无处不在。从智能家居的烟雾报警到工业设备的故障提示&#xff0c;再到医疗设备的紧急状态提醒&#xff0c;可靠的通知机制都是保障安全和提升用户体验的关键环节。这个项目将使用PIC18LF46K42微控制器和PAM89…

作者头像 李华
网站建设 2026/7/13 4:59:19

Nano Banana2:基于Gemini 3.1 Flash的AI图像生成工具实战指南

1. 先搞清楚 Nano Banana2 到底是什么&#xff0c;能解决什么问题Nano Banana2 是一个基于 Gemini 3.1 Flash 架构的 AI 图像生成工具&#xff0c;专门针对需要快速产出海报、广告素材、社交媒体配图等商业用途的设计场景。和很多只能生成艺术风格图片的 AI 工具不同&#xff0…

作者头像 李华
网站建设 2026/7/13 4:58:49

天融信Topgate防火墙NAT配置实战:3步完成SNAT与DNAT策略联动

天融信Topgate防火墙NAT配置实战&#xff1a;3步完成SNAT与DNAT策略联动在企业网络架构中&#xff0c;地址转换&#xff08;NAT&#xff09;技术如同交通枢纽的智能调度系统&#xff0c;既要确保内部车辆有序驶入公共道路&#xff08;SNAT&#xff09;&#xff0c;又要引导外部…

作者头像 李华