UE5新手必看:如何用C++在5分钟内创建一个会旋转的立方体Actor?
从零到一在UE5中用C快速构建一个旋转的立方体Actor如果你刚刚打开Unreal Engine 5面对这个庞大而复杂的编辑器感到有些无所适从同时又对C编程跃跃欲试那么这篇文章就是为你准备的。我们常常听到“Actor”是UE世界中的基本构建块但抽象的概念远不如亲手创造一个会动的物体来得直观。今天我们不谈复杂的理论不搞冗长的配置就聚焦一个最具体、最直观的目标在5分钟内用C创建一个能在场景中持续旋转的立方体Actor。这个过程不仅能让你立刻看到代码的运行效果更能帮你打通从编写逻辑到游戏对象可视化的关键路径。无论你是从其他引擎转战UE的“老兵”还是初次接触游戏开发的“萌新”这个小小的旋转立方体都将成为你理解UE5对象系统与C协作方式的第一块坚实基石。1. 项目准备与Actor概念速览在开始敲代码之前我们需要确保环境就绪。启动你的Unreal Engine 5建议使用5.2或更高版本通过“游戏”模板创建一个新的C项目项目名称可以随意比如“FirstRotatingCube”。选择“空白”或“基础”模板即可这能给我们一个最干净的开始。创建完成后引擎会自动生成解决方案并打开Visual Studio或你设置的IDE。现在让我们花一分钟快速理解“Actor”到底是什么。你可以把UE中的World世界想象成一个巨大的舞台而Actor就是这个舞台上的任何“物件”。这个物件可以是静态的比如一堵墙、一棵树也可以是动态的比如一个角色、一辆车、一个可拾取的道具甚至是一盏灯、一个摄像机。Actor本身是一个容器它最核心的能力是承载组件Component。一个Actor可以没有外观比如一个隐形的触发器但一旦我们为它添加了StaticMeshComponent静态网格体组件它就有了形状添加了PointLightComponent它就能发光。我们即将创建的旋转立方体就是一个附加了网格体组件并拥有旋转逻辑的Actor。在C层面所有Actor都继承自AActor类注意前面的‘A’是UE的命名约定表示Actor。我们创建自己的Actor类时也需要继承它。理解这一点后我们就可以动手了。2. 创建你的第一个C Actor类一切从创建类开始。回到Unreal Editor不要被复杂的界面吓到我们只需要关注顶部菜单栏。在编辑器主界面的顶部菜单栏找到并点击“工具Tools”。在下拉菜单中选择“新建C类New C Class…”。这会弹出一个类向导窗口。在“选择父类”的列表中找到并选中“Actor”。你可以使用搜索框快速定位。点击“下一步”为你的新类命名。这里我们遵循清晰明了的原则命名为RotatingCubeActor。注意根据命名规范以‘A’开头的Actor类名会被自动处理但我们输入时无需手动添加‘A’。点击“创建类”。提示创建过程可能需要几秒钟。引擎会自动生成对应的.h头文件和.cpp源文件并重新编译项目。如果Visual Studio自动打开说明一切顺利。此时在编辑器的“内容浏览器”中你可以在“C类”文件夹下找到新创建的RotatingCubeActor。但这只是一个空的Actor壳子我们还需要两步赋予它形状并赋予它旋转的灵魂。3. 为Actor塑造形体添加静态网格组件一个空的Actor在场景中是不可见的。我们需要给它添加一个UStaticMeshComponent并指定一个基本的几何体比如立方体作为其网格资源。让我们先修改头文件声明这个组件。打开RotatingCubeActor.h文件你会看到引擎生成的初始代码。我们需要做几处关键添加// RotatingCubeActor.h #pragma once #include CoreMinimal.h #include GameFramework/Actor.h // 引入静态网格体组件头文件 #include Components/StaticMeshComponent.h #include RotatingCubeActor.generated.h // 这是UE的UHT头文件生成工具必须的不要动 UCLASS() class YOURPROJECTNAME_API ARotatingCubeActor : public AActor { GENERATED_BODY() public: // 构造函数 ARotatingCubeActor(); protected: // 游戏开始时调用一次 virtual void BeginPlay() override; public: // 每帧调用一次这是实现旋转的关键 virtual void Tick(float DeltaTime) override; private: // 声明一个静态网格体组件指针并用UPROPERTY宏进行标记。 // VisibleAnywhere 意味着该组件在编辑器的“细节”面板中始终可见但不可编辑。 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category Mesh, meta (AllowPrivateAccess true)) class UStaticMeshComponent* CubeMesh; };关键点解析#include Components/StaticMeshComponent.h必须包含此头文件才能使用网格体组件类型。virtual void Tick(float DeltaTime) override;我们重写了Tick函数这是实现每帧旋转的“心脏”。UPROPERTY()这是Unreal的反射系统宏至关重要。它让引擎能识别并管理这个变量。VisibleAnywhere使其在编辑器可见BlueprintReadOnly允许蓝图只读访问Category将其归类在“细节”面板的“Mesh”组下。接下来我们转到RotatingCubeActor.cpp文件在构造函数中创建并配置这个网格体组件并加载一个内置的立方体模型。// RotatingCubeActor.cpp #include RotatingCubeActor.h // 包含必要的头文件 #include Components/StaticMeshComponent.h #include UObject/ConstructorHelpers.h ARotatingCubeActor::ARotatingCubeActor() { // 将此Actor设置为每帧调用Tick() PrimaryActorTick.bCanEverTick true; // 创建并初始化CubeMesh组件 CubeMesh CreateDefaultSubobjectUStaticMeshComponent(TEXT(CubeMesh)); // 将其设置为根组件。一个Actor必须有一个根组件其他组件可以附加其上。 RootComponent CubeMesh; // 使用ConstructorHelpers在构造函数中加载引擎内置的基础形状——立方体 // 注意此方法仅在构造函数中有效 static ConstructorHelpers::FObjectFinderUStaticMesh MeshAsset(TEXT(/Engine/BasicShapes/Cube)); if (MeshAsset.Succeeded()) { CubeMesh-SetStaticMesh(MeshAsset.Object); } else { // 如果加载失败输出一条警告信息。在实际项目中应有更健壮的错误处理。 UE_LOG(LogTemp, Warning, TEXT(Failed to load cube mesh!)); } } void ARotatingCubeActor::BeginPlay() { Super::BeginPlay(); // 这里可以放置Actor开始播放时需要执行的初始化逻辑。 // 例如播放一段开场音效或者初始化一些变量。 } void ARotatingCubeActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); // 目前Tick函数还是空的我们将在下一步实现旋转逻辑。 }代码中的路径/Engine/BasicShapes/Cube指向UE编辑器内置的基础几何体资源库无需自己导入模型。现在编译你的项目在VS中按F5或选择“生成-生成解决方案”然后在UE编辑器中点击“编译”按钮。如果没有错误恭喜你你的Actor已经拥有了一个立方体的形体。4. 注入灵魂实现每帧旋转逻辑静态的立方体还不够酷我们要让它动起来。旋转的本质是每一帧都稍微改变一下Actor的朝向。这个“每一帧”的任务正是由Tick(float DeltaTime)函数来完成的。DeltaTime参数代表上一帧到当前帧所经过的时间以秒为单位使用它可以使运动速度与帧率无关在任何机器上都能保持一致的观感。让我们完善Tick函数void ARotatingCubeActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); // 务必先调用父类的Tick // 检查CubeMesh是否有效这是一个良好的编程习惯 if (CubeMesh) { // 获取当前Actor的旋转值一个FRotator包含Pitch, Yaw, Roll FRotator CurrentRotation GetActorRotation(); // 计算新的旋转值绕Y轴Yaw旋转 // DeltaTime * 60.0f 表示每秒旋转60度。你可以调整这个乘数来改变转速。 float RotationThisFrame DeltaTime * 60.0f; CurrentRotation.Yaw RotationThisFrame; // 将计算出的新旋转值应用给Actor SetActorRotation(CurrentRotation); // 可选更简洁的一行写法 // AddActorLocalRotation(FRotator(0, DeltaTime * 60.0f, 0)); } }原理剖析GetActorRotation()获取Actor当前在世界空间中的旋转。FRotator这是一个结构体用三个浮点数分别表示绕X轴Pitch俯仰、Y轴Yaw偏航、Z轴Roll翻滚的旋转角度。我们只修改了Yaw偏航角这意味着立方体将围绕其自身的上方世界空间的Z轴旋转。如果你想让它绕其他轴旋转可以修改Pitch或Roll。SetActorRotation()将新的旋转值设置给Actor。修改完成后再次编译项目。如果编译成功我们就可以进入编辑器查看成果了。5. 在场景中放置与测试回到Unreal Editor确保编译成功且没有错误。在“内容浏览器”中找到你的RotatingCubeActor类通常在“C类”-“你的项目”文件夹下。用鼠标左键将其拖拽到视口Viewport中或者拖拽到“世界大纲视图World Outliner”中。你会看到一个白色的线框立方体出现在场景中。选中这个Actor你可以在“细节Details”面板中看到我们声明的CubeMesh组件以及它的各种属性如变换、材质等。点击编辑器工具栏上的“运行Play”按钮或按F8键。神奇的一幕发生了场景中的立方体开始平稳地旋转你可以按下ESC键停止运行。尝试在运行前后在“细节”面板中修改Actor的“变换Transform”-“旋转Rotation”值观察其起始朝向的变化。为了更深入地控制我们可以将旋转速度暴露为可在编辑器中调整的变量。修改RotatingCubeActor.hprivate: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category Mesh, meta (AllowPrivateAccess true)) class UStaticMeshComponent* CubeMesh; // 新增一个可编辑的旋转速度变量 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category Rotation, meta (AllowPrivateAccess true)) float RotationSpeed;然后在RotatingCubeActor.cpp的构造函数中初始化它并修改Tick函数ARotatingCubeActor::ARotatingCubeActor() { ... // 默认旋转速度每秒60度 RotationSpeed 60.0f; } void ARotatingCubeActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (CubeMesh) { FRotator CurrentRotation GetActorRotation(); float RotationThisFrame DeltaTime * RotationSpeed; // 使用变量 CurrentRotation.Yaw RotationThisFrame; SetActorRotation(CurrentRotation); } }编译后再次选中场景中的RotatingCubeActor你会在“细节”面板的“Rotation”分类下看到一个名为“Rotation Speed”的字段可以实时修改它来调整立方体的转速无需重新编译代码。6. 进阶探索从旋转立方体出发至此你已经成功创建了一个功能完整的旋转立方体Actor。但这仅仅是起点。基于这个简单的例子你可以进行多种扩展深化对UE5 C的理解变换其他属性除了旋转你还可以在Tick中修改Actor的位置SetActorLocation或缩放SetActorScale3D实现移动、脉动等效果。使用组件相对变换目前我们直接旋转了整个Actor。你也可以选择只旋转CubeMesh组件本身而Actor的根位置保持不变。使用CubeMesh-AddRelativeRotation(...)即可。响应玩家输入让旋转由键盘或鼠标控制。这需要在Actor中绑定输入事件并在回调函数中修改RotationSpeed或直接施加旋转力。添加碰撞与交互为CubeMesh组件添加碰撞体在细节面板中设置然后通过重写NotifyHit等函数让立方体在与其他物体碰撞时做出反应比如反弹、改变颜色或播放声音。蓝图协作将RotationSpeed等变量暴露给蓝图BlueprintReadWrite允许关卡设计师在不碰代码的情况下调整行为。你甚至可以将整个旋转逻辑封装成一个蓝图可调用函数。一个常见的调试技巧是使用DrawDebugString在游戏运行时在屏幕上显示信息比如当前转速。在Tick函数末尾添加#include DrawDebugHelpers.h ... if (GEngine) { FString DebugText FString::Printf(TEXT(Rotation Speed: %.2f), RotationSpeed); DrawDebugString(GetWorld(), GetActorLocation(), DebugText, nullptr, FColor::White, 0.0f, true); }这个简单的旋转立方体项目就像一把钥匙为你打开了UE5 C游戏对象编程的大门。它串联起了创建类、添加组件、编写每帧逻辑、暴露编辑器参数等核心工作流。我最初学习时正是在实现了这样一个会动的小东西后才对虚幻引擎的“对象-组件”架构有了真切的感觉。接下来不妨试着给它换个模型加个发光材质或者让它沿着一条路径移动每一步尝试都会让你对引擎的理解更深一分。

相关新闻

Swift-All快速上手:3步完成大模型离线推理任务优化

Swift-All快速上手:3步完成大模型离线推理任务优化

Swift-All快速上手:3步完成大模型离线推理任务优化 1. 从零开始:为什么你需要Swift-All? 如果你正在使用大模型,无论是写文案、做客服、还是分析数据,可能都遇到过这样的烦恼:模型推理速度太慢&#xff0…

2026/5/17 11:17:11 阅读更多 →
西门子 S7-1500 PLCProfinet 转 MC,网关实现毫秒级双向通讯

西门子 S7-1500 PLCProfinet 转 MC,网关实现毫秒级双向通讯

一、项目背景某新能源企业电池 PACK 自动化产线以西门子 S7-1500 PLC为核心控制中枢,承担产线电芯上料、模组组装、焊接检测、成品封装等全工序的逻辑控制、节拍调度与安全联锁,产线配套多台工艺设备及采集终端,采用 Profinet 工业以太网完成…

2026/7/3 2:12:42 阅读更多 →
告别仓库克隆烦恼:DownGit实现GitHub文件夹精准高效下载

告别仓库克隆烦恼:DownGit实现GitHub文件夹精准高效下载

告别仓库克隆烦恼:DownGit实现GitHub文件夹精准高效下载 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 还在为只需要GitHub项目中某个文件夹却不得不克隆整个仓库而困扰吗?DownGit作为…

2026/7/3 5:10:53 阅读更多 →

最新新闻

PLGA-NHS 活性酯聚合物是什么?纳米递送载体专用原料全方位科普详解

PLGA-NHS 活性酯聚合物是什么?纳米递送载体专用原料全方位科普详解

一、PLGA-NHS是什么?PLGA-NHS是一类在纳米医学与生物材料研究中常用的功能化高分子聚合物材料,是在基础材料PLGA(聚乳酸-羟基乙酸共聚物)末端引入NHS(N-羟基琥珀酰亚胺)活性酯基团形成的衍生物。该材料结合…

2026/7/3 23:38:20 阅读更多 →
自动驾驶与具身智能感知系统的设计优先级差异

自动驾驶与具身智能感知系统的设计优先级差异

1. 这不是纯理论辨析,而是两条技术路径在真实传感器、算力和物理世界约束下的优先级博弈“自动驾驶与具身智能感知系统的设计优先级有何差异?”——这个问题表面看是学术讨论,实则直指当下AI落地最硬的两块骨头:一个要让车在高速公…

2026/7/3 23:38:20 阅读更多 →
Wand-Enhancer技术解析:WeMod客户端本地化增强方案

Wand-Enhancer技术解析:WeMod客户端本地化增强方案

Wand-Enhancer技术解析:WeMod客户端本地化增强方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一个针对WeMod客户端的开…

2026/7/3 23:38:20 阅读更多 →
5个实战技巧,解决UI-TARS视觉定位点击错位难题

5个实战技巧,解决UI-TARS视觉定位点击错位难题

1. 项目概述:UI-TARS坐标定位的精准度挑战做UI自动化测试或者RPA(机器人流程自动化)的朋友,对“点击错位”这四个字应该都深恶痛绝。脚本跑得好好的,突然就点到了空白处,或者误触了其他按钮,轻则…

2026/7/3 23:36:20 阅读更多 →
如何零代码获取B站视频?这款开源工具让你3分钟搞定

如何零代码获取B站视频?这款开源工具让你3分钟搞定

如何零代码获取B站视频?这款开源工具让你3分钟搞定 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否经常遇到这样的情况:看到B站上精彩的视频教程、有趣的VLOG或珍贵的纪…

2026/7/3 23:34:20 阅读更多 →
云顶之弈免费助手:3分钟学会的实时策略工具指南

云顶之弈免费助手:3分钟学会的实时策略工具指南

云顶之弈免费助手:3分钟学会的实时策略工具指南 【免费下载链接】TFT-Overlay Overlay for Teamfight Tactics 项目地址: https://gitcode.com/gh_mirrors/tf/TFT-Overlay TFT Overlay是一款专为《英雄联盟:云顶之弈》玩家设计的免费实时助手&…

2026/7/3 23:34:20 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻