文章目录

  • 前言
  • 一、Data Layers的使用
    • 1.添加Actor到Data Layers
    • 2.运行时处理
  • 总结

上一篇:虚幻引擎(UE5)-大世界分区WorldPartition教程(三)

前言

Data Layers(UE4中叫Layers)用于将Actor划分到不同的Layer中,通过在编辑器和运行时激活和停用某些数据层,有条件地加载世界数据来组织大世界,前面提到的划分Cell是对WP关卡的横向划分,DataLayer是对WP关卡的纵向划分

该系统提供了一种对资源进行分组管理的方式,比如可以将建筑放到一个Layer中,将植被放到另一个Layer中,并且在编辑和Gameplay层都可以操作这个Layer,这不但方便了编辑管理世界,而且开发人员也可以在Gameplay层做一些比较有趣的玩法,比如白天和黑夜系统,荒野和城市互换等


提示:以下是本篇文章正文内容

一、Data Layers的使用

1.添加Actor到Data Layers

再上方工具栏中找到 Window->World Partition->Data Layers Outliner,然后在Data Layers Outliner中右键创建新的DataLayer



新建DataLayer后在面板中的数据层资产中 创建数据层:


然后在Actor的Details面板中为Actor指定Data Layers:

这里需要注意的是,Data Layers只有在编辑WP关卡时才生效,如果是普通关卡,需要像UE4那样在Layers中添加

这个时候返回数据层面板中就可以根据策略去加载了,可以控制初始显示和隐藏等等,也能通过蓝图去控制显示方式。

2.运行时处理

Data Layers数据是由UDataLayerSubsystem负责管理的,具体处理如下:

前后端分开:

void UWorldPartitionStreamingPolicy::UpdateStreamingState()
{//前后端对Cells处理的逻辑分开if (NetMode == NM_Standalone || NetMode == NM_Client || AWorldPartitionReplay::IsEnabled(World)){  //前端对StreamingCells的处理,GetStreamingCells会处理DataLayer的Cellif (WorldPartition->IsInitialized()){WorldPartition->RuntimeHash->GetStreamingCells(StreamingSources, FrameActivateCells, FrameLoadCells);}}else{//后端对SteamingCells的处理,这里会处理归属DataLayer的Cellconst UDataLayerSubsystem* DataLayerSubsystem = WorldPartition->GetWorld()->GetSubsystem<UDataLayerSubsystem>();//处理不属于DataLayer的Cells和以及归属于状态为Activate的DataLayer里的Cells,放入ActivateStreamingCells中WorldPartition->RuntimeHash->GetAllStreamingCells(ActivateStreamingCells, /*bAllDataLayers=*/ false, /*bDataLayersOnly=*/ false, DataLayerSubsystem->GetEffectiveActiveDataLayerNames());//只处理DataLayer中的Cells,并放入LoadStreamingCells中if (DataLayerSubsystem->GetEffectiveLoadedDataLayerNames().Num()){WorldPartition->RuntimeHash->GetAllStreamingCells(LoadStreamingCells, /*bAllDataLayers=*/ false, /*bDataLayersOnly=*/ true, DataLayerSubsystem->GetEffectiveLoadedDataLayerNames());}}
}

前台处理部分:

bool UWorldPartitionRuntimeSpatialHash::GetStreamingCells(const TArray<FWorldPartitionStreamingSource>& Sources, UWorldPartitionRuntimeHash::FStreamingSourceCells& OutActivateCells, UWorldPartitionRuntimeHash::FStreamingSourceCells& OutLoadCells) const
{//先拿到当前世界所有的DataLayersconst UDataLayerSubsystem* DataLayerSubsystem = GetWorld()->GetSubsystem<UDataLayerSubsystem>();//如果没有StreamingSource的话,处理所有的StreamingGrid中的AlwaysLoaded Cells,if (Sources.Num() == 0){for (const FSpatialHashStreamingGrid& StreamingGrid : StreamingGrids){if (!StreamingGrid.bClientOnlyVisible || bShouldConsiderClientOnlyVisible){/*这里处理了归属于DataLayerSubsystem的Cell,具体处理逻辑:1.如果不归属于DataLayer且被设置为IsAlwaysLoaded的Cell和归属于DataLayer且它被设置Activated的Cell被放入OutActivateCells中2.如果归属于DataLayer且它被设置Loaded的Cell被放入OutLoadCells中*/StreamingGrid.GetAlwaysLoadedCells(DataLayerSubsystem, OutActivateCells.GetCells(), OutLoadCells.GetCells());}}}else{//获取所有基于StreamingSource的Cellfor (const FSpatialHashStreamingGrid& StreamingGrid : StreamingGrids){if (!StreamingGrid.bClientOnlyVisible || bShouldConsiderClientOnlyVisible){/*这里会根据StreamingSource设置的形状(这个可以在组件中设置Shapes,默认情况是用以StreamingSource作为圆心,以Grid的LoadingRange作为半径构成圆)来判断是否与Cell相交,具体逻辑:1.首先根据传入的Coords,获取该坐标出的Cell,并GetBuounds2.判断是否相交,具体逻辑在FSquare2DGridHelper::FGrid2D::ForEachIntersectingCells中,这里会涉及到Cell的划分3.如果不归属于DataLayer且被设置为IsAlwaysLoaded的Cell和归属于DataLayer且它被设置Activated的Cell被放入OutActivateCells中4.如果归属于DataLayer且它被设置Loaded的Cell被放入OutLoadCells中5.调用GetAlwaysLoadedCells方法,如前所述,不累述*/StreamingGrid.GetCells(Sources, DataLayerSubsystem, OutActivateCells, OutLoadCells);}}}
}

如果是要在Gameplay中使用DataLayer的话调用UDataLayerSubsystem::SetDataLayerRuntimeState方法即可,大家可以自己尝试一下

总结

其中总的来说Data Layers实际上就是UE4中的Layers系统的Puls版,它可以方便的实现同个世界的不同变体,不仅方便编制者管理复杂的世界,同时也能在Gameplay中实现有趣的玩法以上就是今天要讲的内容

到此虚幻引擎(UE5)-大世界分区WorldPartition教程暂时完结了 To be Continued …

虚幻引擎(UE5)-大世界分区WorldPartition教程(四)相关推荐

  1. 虚幻引擎(UE5)-大世界分区WorldPartition教程(三)

    文章目录 前言 LevelInstance的使用 1.ALevelInstance 2.选择Actor创建关卡 3.运行时加载LevelInstance 总结 上一篇:虚幻引擎(UE5)-大世界分区W ...

  2. 虚幻引擎(UE5)-大世界分区WorldPartition教程(二)

    文章目录 前言 一.OFPA怎么用 二.OFPA怎么用 总结 上一篇:虚幻引擎(UE5)-大世界分区WorldPartition教程(一) 前言 在UE4版本中中,Actor是保存在关卡文件中的,也就 ...

  3. 虚幻引擎(UE5)最佳集成CesiumforUE教程(一)

    虚幻引擎(UE5)最佳集成CesiumforUE教程(一) UE集成CesiumUE插件使用 文章目录 虚幻引擎(UE5)最佳集成CesiumforUE教程(一) 前言 一.项目创建 二.新建光卡 二 ...

  4. 虚幻引擎5:快速入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:5.63 GB |时长:5h 23m 从 ...

  5. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  6. Python for虚幻引擎编辑器工具脚本学习教程

    Python for Unreal Engine Editor Tools Scripting MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英 ...

  7. 虚幻引擎VR游戏开发基础教程

    虚幻引擎VR游戏开发基础教程 了解如何使用 Oculus Quest 2 的蓝图在虚幻引擎 4 中从头开始构建基本的 VR 机制 课程英文名:Unreal Engine VR Development ...

  8. [虚幻引擎][UE5]获取当前系统的时间

    [虚幻引擎][UE5]获取当前系统的时间 方法一: 方法二: 方法三: 方法一: 效果: 方法二: 效果: 缺点:没有办法都是两位 方法三:

  9. 颠覆游戏开发,虚幻引擎 UE5 正式发布

    整理 | 章雨铭 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 4月6日,UE5正式发布! 体验完UE5的新功能后,3D游戏狂热爱好者感叹:"惊呆了,老铁!"美工直 ...

最新文章

  1. vue实现文件上传功能
  2. 外包公司派遣到网易,上班地点网易大厦,转正后工资8k-10k,13薪,包三餐,值得去吗?...
  3. oracle中导入dmp数据注意事项
  4. go语言学习(一)——go语言简介和环境搭建
  5. ABAP performance学习笔记
  6. ASP应用之模板采用
  7. vue路由详解版一目了然
  8. 用空代理实现account(lua程序设计21.7练习21.4题)
  9. c语言第一章节测试,计算机二级C语言教程章节测试:字符串
  10. heartbeat与keepalived对比
  11. C/C++ 进阶 —— static
  12. 数据库表的建立与基本操作
  13. [词汇] 十四、动词
  14. 数据有效性 动态选择
  15. (转载)人机交互技术发展左右产业趋势
  16. UI界面视觉设计之色彩要素
  17. word加密文档忘记密码了如何打开
  18. 国庆节去哪浪?让 Python 帮你分析分析
  19. JavaScript学习过程
  20. 理解中国经济的五层思维-中国视角下的宏观经济

热门文章

  1. python获取字典长度_PYTHON 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...
  2. 收集的15款杀马软件 下载速度快
  3. HAC集群部署vip及相关操作
  4. 2022. 09 青少年机器人技术等级考试理论综合试卷(二级)
  5. r与python做随机森林_随机森林算法入门(python)
  6. nyoj 1249 物资调度(DP)
  7. HAL 库 uS 延时的 3 种实现方式
  8. 『NLP学习笔记』Transformer技术详细介绍
  9. 云计算实战应用案例精讲-【自动驾驶】多模态融合智能检测方法及 SLAM 车载实现(论文篇)
  10. 利用LD_PRELOAD给glibc库函数加钩子