当前位置: 首页 > news >正文

UE4 World, Level, LevelStreaming从入门到深入

前言

在《塞尔达传说:旷野之息》中,玩家攀上初始高塔的瞬间,目光所及的山川湖泊皆可抵达;在《艾尔登法环》中,黄金树的辉光始终悬于地平线之上,指引玩家穿越无缝衔接的史诗战场。这些现代游戏杰作背后的核心挑战之一,是如何将庞大的虚拟世界“装入”有限的内存与算力中,同时保持玩家沉浸感不被加载黑屏或性能卡顿打破。

虚幻引擎4(Unreal Engine 4, UE4)作为开放世界开发的主流工具,其 ​World(世界)​​ 与 ​Level(关卡)​​ 系统正是为解决这一矛盾而生。从《堡垒之夜》的动态战场到《地狱之刃》的线性叙事,开发者们通过灵活组合Persistent LevelStreaming LevelsWorld Composition,在引擎底层构建起一套“空间即代码”的规则体系——每一块地形、每一栋建筑不仅是美术资源,更是被精确计算的时空容器,按需加载、动态拼接,最终在玩家眼前编织成无垠的幻想之境。

世界(UWorld)

UWorld是UE里面最顶层UObject对象,代表了一个地图,里面存放各种UObject, AActor对象.

UWorld存在哪些地方

在游戏里,大多数时候只存在一个UWorld对象。而在UE引擎编辑器里, 许多UWorld存在。比如当前正在编辑的关卡是一个UWorld, PIE模式存在一个独立的UWorld, 带着独立渲染Viewport窗口的编辑器工具也存在一个UWorld.

C++访问UWorld

Actor获取所在的主World

UWorld* World = GetWorld()

这里获取的World是间接通过访问Actor所在的Level, 获取Level所在的World.

Level获取所在的主World

Level->OwningWorld

引擎编辑器获取当前的World

UWorld* World = GEditor->GetEditorWorldContext().World();

关卡Level

可以这么理解, World是由一个个Level组成,World容纳各种Actor的实际承载是Level.

关卡的创建

文件格式是umap

世界和关卡的关系

在双击点击一个Level进新的地图后, 代表了进入了一个新OwningWorld或者说是OwningWorld的持续性关卡(PersistentLevel, OwningWorld的PersistentLevel一直不会卸载). 这里比较注意的是每个关卡的默认名都叫“PersistentLevel”,都有自己的World,GetOuter()可以得到关卡GC引用链的World, 这和OwningWorld是两个概念。一般情况关卡的GC引用链的World很少使用)。

比如上图的当前世界的PersistentLevel就是ThirdPersonExampleMap.

关卡管理器(LevelManaer)

打开Window->Level可以打开关卡管理器可以查看当前存在哪些关卡.

图中挂在PersistentLevel下的是子关卡, 也是组成整个World的一部分, 不过子关卡和主关卡不一样的是, 可以随时从整个World关卡列表里面移除,加入,  加载,卸载等操作。

子关卡流程和操作

创建一个子关卡, 像上面已经写有

拖拽关卡到LevelManager

目前蓝色高亮的代表是当前编辑的关卡,放置到场景世界的Actor默认加入到这个关卡中。

C++访问 && 操作ULevel

获取主世界和主关卡(PersistentLevel)

UWorld* MainWorld = GetWorld();
ULevel* MainLevel = GetWorld()->PersistentLevel;
UWorld* TestWorld = Cast<UWorld>(MainLevel->GetOuter());
if(MainWorld == TestWorld)
{
}

获取一个关卡对应的GCWorld

	//ULevel* TestLevel;TestLevel->GetOuter();

获取当前编辑关卡

	// 获取编辑器世界的UWorld指针(仅在编辑器模式下有效)UWorld* EditorWorld = GEditor->GetEditorWorldContext().World();if (EditorWorld){// 获取当前关卡(Persistent Level)ULevel* CurrentLevel = EditorWorld->GetCurrentLevel();if (CurrentLevel){UE_LOG(LogTemp, Warning, TEXT("Current Level: %s"), *CurrentLevel->GetOuter()->GetName());}}

加载关卡资源并加入当前主世界(Level资源路径加载)

	// 关卡路径FString LevelPackagePath = TEXT("/Game/Maps/C4");UEditorLevelUtils::AddLevelsToWorld(MainWorld, {LevelPackagePath}, ULevelStreamingDynamic::StaticClass());

其他关卡操作相关参考UEditorLevelUtils库

Level的应用方案

基于 ​Persistent Level + Streaming Levels 的传统关卡流送

Persistent Level(持久关卡)​

作为World的核心,持久关卡是始终加载的主关卡,负责管理其他子关卡的动态加载和卸载。它通常包含基础场景元素(如光照环境、天空盒等),且在运行时无法被卸载

Streaming Levels(流送关卡)

通过流送体积(Level Streaming Volumes)、蓝图或代码动态加载的子关卡。例如:

流送体积:当玩家进入体积区域时触发加载,离开时卸载

蓝图/C++控制:使用Load Stream LevelUnload Stream Level函数实现精确控制,可设置加载后是否可见、是否阻塞主线程等

固定加载(Always Loaded)​:某些子关卡可能与持久关卡同时加载,常用于多人协作开发的分层设计

技术特点

  • 适用于中小型场景或需要手动控制加载逻辑的项目。
  • 所有流送体积必须存在于持久关卡中

基于 ​World Composition 的大世界管理

针对开放世界等超大规模场景,World Composition通过自动化层级管理优化关卡流送.

核心机制

主关卡(Persistent Level)不存储流送信息,而是通过扫描指定目录自动识别子关卡(.umap文件)

子关卡按图层(Layer)​分类,每个图层定义统一的流送距离。当玩家与关卡边界的距离小于该值时,自动加载对应关卡

层级管理优势

自动流送:根据摄像机位置动态加载/卸载,无需手动设置体积域

图层过滤:可创建自定义图层(如“森林层”“城市层”),并独立设置流送参数

无缝拼接:通过精确对齐关卡边界(需整数倍坐标),实现地形和物件的无缝衔接

两种技术对比

  • 传统流送需要手动维护关卡列表,而World Composition通过目录扫描自动管理。
  • 支持运行时动态调整流送策略(如stat levels命令查看加载状态)

两种模式的应用场景

模式适用场景技术优势
Persistent+Streaming中小型场景、线性流程精确控制加载时机,适合剧情关卡切换
World Composition开放世界、超大地图自动化管理,减少手动配置,支持动态分层流送

两种方案总结

两种模式本质都属于关卡流送技术,但实现逻辑不同:传统流送依赖显式的手动配置,而World Composition通过层级化和自动化简化了大世界管理。开发者可根据项目规模选择,甚至混合使用(如在大世界中嵌套局部手动流送)以实现灵活的场景构建

参考资料

[1]World Composition in Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

[2]Level Streaming in Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

[3]腾讯元宝: "写一篇关于UE4 World, Level的技术博客"

相关文章:

UE4 World, Level, LevelStreaming从入门到深入

前言 在《塞尔达传说&#xff1a;旷野之息》中&#xff0c;玩家攀上初始高塔的瞬间&#xff0c;目光所及的山川湖泊皆可抵达&#xff1b;在《艾尔登法环》中&#xff0c;黄金树的辉光始终悬于地平线之上&#xff0c;指引玩家穿越无缝衔接的史诗战场。这些现代游戏杰作背后的核…...

3月8日实验

拓扑&#xff1a; 需求&#xff1a; 1.学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到白度网络中的HTTP服务器 2.学校网络内部网段基于192.168.1.0/24划分&#xff0c;PC1可以正常访问3.3.3.0/24网段&#xff0c;但是PC2不允许 3.学校内部路由使用静态路由&#…...

IO多路复用实现并发服务器

一.select函数 select 的调用注意事项 在使用 select 函数时&#xff0c;需要注意以下几个关键点&#xff1a; 1. 参数的修改与拷贝 readfds 等参数是结果参数 &#xff1a; select 函数会直接修改传入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…...

【漫话机器学习系列】122.相关系数(Correlation Coefficient)

深入理解相关系数&#xff08;Correlation Coefficient&#xff09; 1. 引言 在数据分析、统计学和机器学习领域&#xff0c;研究变量之间的关系是至关重要的任务。我们常常想知道&#xff1a;当一个变量变化时&#xff0c;另一个变量是否也会随之变化&#xff1f;如果会&…...

控制系统分类

文章目录 定义与特点1. 自治系统&#xff08;Autonomous System&#xff09;与非自治系统&#xff08;Non-Autonomous System&#xff09;自治系统非自治系统 2. 线性系统&#xff08;Linear System&#xff09;与非线性系统&#xff08;Nonlinear System&#xff09;线性系统非…...

文档操作方法得合理使用

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

Python asyncIO 面试题及参考答案 草

目录 如何正确定义一个协程函数?直接调用协程会引发什么问题? 使用 async def 定义的协程与普通函数执行流程有何本质区别? 解释 asyncio.run () 的作用及与手动管理事件循环的差异 为什么协程中必须使用 await 而非 yield 挂起操作? 写出通过 async for 实现异步迭代器…...

计算机网络——交换机

一、什么是交换机&#xff1f; 交换机&#xff08;Switch&#xff09;是局域网&#xff08;LAN&#xff09;中的核心设备&#xff0c;负责在 数据链路层&#xff08;OSI第二层&#xff09;高效转发数据帧。它像一位“智能交通警察”&#xff0c;根据设备的 MAC地址 精准引导数…...

matlab和FPGA联合仿真时读写.txt文件数据的方法

在FPGA开发过程中&#xff0c;往往需要将MATLAB生成的数据作为原始激励灌入FPGA进行仿真。为了验证FPGA计算是否正确&#xff0c;又需要将FPGA计算结果导入MATLAB绘图与MATLAB计算结果对比。 下面是MATLAB“写.txt”、“读.txt”&#xff0c;Verilog“读.txt”、“写.txt”的代…...

解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统

目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…...

【分布式】聊聊分布式id实现方案和生产经验

对于分布式Id来说&#xff0c;在面试过程中也是高频面试题&#xff0c;所以主要针对分布式id实现方案进行详细分析下。 应用场景 对于无论是单机还是分布式系统来说&#xff0c;对于很多场景需要全局唯一ID&#xff0c; 数据库id唯一性日志traceId 可以方便找到日志链&#…...

uniapp或者vue 使用serialport

参考https://blog.csdn.net/ykee126/article/details/90440499 版本是第一位&#xff1a;否则容易编译失败 node 版本 18.14.0 npm 版本 9.3.1 electron 版本 30.0.8 electron-rebuild 版本 3.2.9 serialport 版本 10.0.0 需要python环境 main.js // Modules to control app…...

机器学习12-视觉识别任务

机器学习12-视觉识别任务 分类语义分割滑动窗口滑动窗口的实现思路优点缺点现代替代方法 全卷积&#xff08;Fully Convolutional Networks, FCN&#xff09;FCN 的工作原理FCN 的性能优势FCN 的应用案例FCN 的局限性改进方向下采样可学习的上采样:转置卷积 目标检测区域建议Se…...

使用paramiko爆破ssh登录

一.确认是否存在目标主机是否存在root用户 重跑 CVE-2018-15473用户名枚举漏洞 检测&#xff1a; import paramiko from paramiko.ssh_exception import AuthenticationExceptiondef check_user(username, hostname, port):ssh paramiko.SSHClient()ssh.set_missing_host_key…...

游戏引擎学习第146天

音高变化使得对齐读取变得不可能&#xff0c;我们可以支持循环声音了。 我们今天的目标是完成之前一段时间所做的音频代码。这个项目并不依赖任何引擎或库&#xff0c;而是一个教育项目&#xff0c;目的是展示从头到尾运行一个游戏所需要的全部代码。无论你对什么方面感兴趣&a…...

装饰器模式--RequestWrapper、请求流request无法被重复读取

目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码&#xff0c;能看出来是把request又重新包装了一下&#xff0c;核心信息都不会改变 后面了解到这叫 装饰器模式&#xff08;Decorator Pattern&#xff09; &#xff1a;也称为包装模式(Wrapper Pat…...

【算法题】小鱼的航程

问题&#xff1a; 分析 分析题目&#xff0c;可以看出&#xff0c;给你一个开始的星期&#xff0c;再给一个总共天数&#xff0c;在这些天内&#xff0c;只有周六周日休息&#xff0c;其他全要游泳250公里。 那分支处理好啦 当星期为6时&#xff0c;需要消耗2天&#xff0c;…...

视频录像机视频通道是指什么

视频录像机的视频通道是指摄像机在监控矩阵或硬盘录像机设备上的视频输入的物理位置。 与摄像头数量关系&#xff1a;在视频监控系统中&#xff0c;有多少个摄像头就需要多少路视频通道&#xff0c;通道数量决定了视频录像机可接入摄像头的数量&#xff0c;一般硬盘录像机有4路…...

RISC-V医疗芯片工程师复合型转型的路径与策略

从RISC-V到医疗芯片:工程师复合型转型的路径与策略 一、引言 1.1 研究背景 在科技快速发展的当下,芯片技术已然成为推动各行业进步的核心驱动力之一。其中,RISC-V 架构作为芯片领域的新兴力量,正以其独特的优势迅速崛起,对整个芯片产业的格局产生着深远影响。RISC-V 架…...

《Gradio : AI awesome-demos》

《Gradio : AI awesome-demos》 This is a list of some wonderful demos & applications built with Gradio. Heres how to contribute yours! &#x1f58a;️ Natural language processing Demo name (link to demo)input type(s)output type(s)status badgeruDALL-ET…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...