【虚幻引擎】UE4源码解析FWorldContent、UWorld、ULevel、UGameInstance、UEngine

这篇具有很好参考价值的文章主要介绍了【虚幻引擎】UE4源码解析FWorldContent、UWorld、ULevel、UGameInstance、UEngine。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

B站教学链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0 一、UEngine

  • Engine,因为也是很基础的类,再加上开发过程中会经常访问到该类型,因此UE4引擎也在代码全局范围内定义了一个该类型的全局变量:UEngine* GEngine供开发者直接调用。该最基础的类型分化成了两个子类:UGameEngine和UEditorEngine。
  • UGameEngine保存了唯一的一个UGameInstance* GameInstance指针,这是符合情理的,因为当我们在实际运行游戏(而不是运行项目或在项目里PIE)时,整个游戏只会有一个GameInstance,因此UGameEngine就直接保存了该GameInstance的指针。
  • UEditorEngine包含了两个UWorld指针:一个是UWorld* PlayWorld指针,一个是UWorld* EditorWorld,这也说明了我们的编辑器其实就是UE4引擎创建的一个World,一个“游戏”,然后我们在这个“游戏”里面去创建新的游戏。无论是哪一个World,我们都可以通过其对象查找到其WorldContext,然后再查找到其GameInstance,也就是说在编辑器模式下其实是有两个GameInstance的。

二、UGameInstance

  • UGameInstance是一个运行游戏的高级管理者,用来保存FWorldContext对象和整个游戏信息。 它拥有一个FWorldContext指针,一般来说,一个游戏只会实例化一个GameInstance,生存周期持续到游戏结束,编辑器模式下,生存周期为打开Editor到关闭Editor。实例化的位置:GameInstance在EngineLoop::PreInit()->PreInitPostStartupScreen()->LoadModulesForProject()->…->UClass::CreateDefaultObject()。
  • UGameInstance类型除了会保存FWorldContext* WorldContext,还保存了当前游戏里所有的Local Player、Game Session等信息。
  • 我们在切换Level的时候,其内的各种数据都会被释放然后重新生成,也就是说会丢失数据,哪怕是管理Level的World也是(只要切换Persistent Level,UWorld都会被释放然后重新生成新UWorld再来存放Persistent Level,从而造成数据丢失),因此UGameInstance就非常适合用于编写独立于所有Level和World之外的功能。

三、FWorldContent

  • 在UE4引擎中,有些时候(例如开发的时候)并不会只存在一个World,因此UE4引擎提供了一个类型来管理多个World——FWorldContext。需要注意这个类型以F开头,也就是说该类型不再派生自UObject或AActor。
  • FWorldContext是UEngine用来管理世界生成、销毁、切换的类。看看它主要成员变量:
    UWorld* ThisCurrentWorld;
    UGameInstance* OwningGameInstance;
    它拥有一个UWorld,也拥有一个指向UGameInstance的指针。
  • 对于独立运行的游戏,WorldContext只有唯一的一个(Game WorldContext);对于编辑器模式,则是一个WorldContext给编辑器(Editor Context),一个WorldContext给PIE(PIE WorldContext),甚至还会有其他的WorldContext,如编辑器视图里面还没有运行的游戏场景的World(Preview World)
  • FWorldContext类型的成员变量UWorld* ThisCurrentWorld会指向当前的World。当需要从一个World切换到另一个World的时候(如点击“播放”按钮之后,UE4引擎从编辑器视图的Preview World切换到PIE World),FWorldContext就会用来保存切换过程信息和目标World的上下文信息。

四、UWorld

  • 很多时候仅仅只有一个关卡是不够的,如果我们的游戏场景尺寸非常巨大,要将这些庞大数量的Actor全部都塞进一个关卡里,势必会造成关卡的臃肿和维护的困难,若我们将这个巨大的场景根据一定规则划分,并能够实现在我们需要的时候读取一部分内容,或者释放掉我们不需要的内容,无论是在性能上还是开发过程都会起到良好的作用。因此UE4引擎提供了一个能够容纳多个关卡的类型——World。
  • UWorld类型是从ULevel类型直接继承而来的,并添加了多个数组用于保存子关卡及其各自的Actors,以及保存了指向“Persistent Level”和“Current Level”的指针。
  • UWorld使用的关卡就是“Persistent Level”,也就是项目编辑器视口打开了的持久性关卡,而UWorld使用的AWorldSettings也就是持久性关卡的AWorldSettings。但并不是说其他子关卡的AWorldSettings就完全没有用,部分配置例如光照配置,就是使用的各自关卡AWorldSettings的设置而不是照搬持久性关卡的设置。
  • UWorld里面可以访问得到所有关卡(包括持久性关卡和子关卡)里的所有Actor,但是并不是说UWorld直接保存这些Actors,而仅仅只是通过遍历ULevel然后再遍历其Actor。
  • UWorld是可视化场景的最高级对象,是放置和移除关卡的地方,它拥有一个PersistentLevel和一组StreamLevel。在standaloneGame下,一般只存在一个World;在编辑器模式下,存在不止一个World,比如场景编辑、PIE、各种带渲染的交互编辑工具窗口等,都是World。
    主要成员变量:
    TArray<class ULevel*> Levels; //所有Level
    class ULevel* PersistentLevel;
    FPhysScene* PhysicsScene;

五、ULevel

  • 丰富多彩的Actor和Component构成了一个个功能强大的对象,现在需要有一个容器能够存放下这些所有的对象,存放这些所有元素的对象就是UE4提供的ULevel类型。
  • 关卡(Level)类型在C++代码里命名可知,Level类型也是继承自UObject类型的。
  • 既然是继承自UObject类型,那自然也会继承了UObject提供的各种特性,其中也包括“编写脚本”的能力,因此每个ULevel对象也都自带了一个“ALevelScriptActor”对象用来实现“关卡蓝图”的功能。
  • 关卡本身也需要支持一些可自定义的属性,例如设置关卡里的光照贴图、本关卡使用的游戏模式等等,因此该类型也自带着一个“书记官”——“AWorldSettings”类型用于记录这些每个关卡本身的可自定义属性。
  • 关卡本身支持添加多个子关卡,又因为每个关卡都可以定义自己的游戏模式等属性,因此当一个“持久性关卡(Persistent Level)”里面被添加了多个子关卡时,实际使用到的“AWorldSettings”对象只会是持久性关卡的那一个。
  • 关卡的作用是用来存放Actor及其派生类,因此关卡本身会有一个变量“TArray<AActor*> Actors”用来存放关卡内所有生成的Actor,“ALevelScriptActor”和“AWorldSettings”也理所当然地被保存到该数组里面。
  • Level是一个场景内容的收集者,包括光照、声音、实例化网格体等等,一些通用的内容比如光照质量,集成到WorldSetting这个类里设置。
    主要成员变量:
    TArray<AActor*> Actors;
    AWorldSettings* WorldSettings;
    ALevelScriptActor* LevelScriptActor; //关卡蓝图
     

最后总得来说就是,引擎初始化New一个GEngine出来,然后创建一个Gameinstance拥有一个FWorldContext指针,保存了所有的world参数信息,然后创建WorldContent里面包含了一个UWord的指针UWorld* ThisCurrentWorld指向当前的World,当我们使用Openlevel的时候会用到FWorldContext的参数,先卸载掉当前的World,然后在加载OpenLevel的world。

ugameinstance,UE4源码,虚幻,ue4,游戏引擎文章来源地址https://www.toymoban.com/news/detail-573514.html

到了这里,关于【虚幻引擎】UE4源码解析FWorldContent、UWorld、ULevel、UGameInstance、UEngine的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • UE4 源码解析----引擎初始化流程

    UE4 源码解析----引擎初始化流程

       在研究UE4的源码过程中着实不理解的地方有很多,今天给大家分享一下UE4引擎的初始化流程。 C++的函数入口都是Main() 函数入口,UE4也是一样,EngineSourceRuntimeLaunchPrivate Windows函数入口  引擎入口函数为:GuardedMain UE4所有相关的代码都在游戏循环函数中,在Launch.cpp中,写

    2024年02月06日
    浏览(14)
  • 【虚幻引擎】UE4优化植被

    【虚幻引擎】UE4优化植被

    在UE4中,我们在做大型的室外场景时,经常会遇到植物过多导致延迟的现象,有时候我们需要在UE4的场景中放置几千几万甚至更多的模型,这些模型具有相同的LOD,并且基础模型都使用同一模型资源。因为模型文件拖入UE4场景中会自动使用Static Mesh Actor来表示,当在程序中放

    2024年02月15日
    浏览(48)
  • 【虚幻引擎】UE4/UE5 材质

    【虚幻引擎】UE4/UE5 材质

      基础颜色(BaseColor) :材质本身的颜色,例如绿色蓝色等 金属度(Metallic) :金属度,材质是否含有金属光泽 粗糙度(Roughness) :粗糙或者平滑度,物体表面的粗糙程度 自发光(EmissiveColor) :物体本身是否发光 透明度(Opactity) :物体表面是否透明,适用于 半透明(Translucent)、

    2024年02月02日
    浏览(43)
  • 【虚幻引擎】UE4/UE5插件

    【虚幻引擎】UE4/UE5插件

    Blank:空白插件,可以从头开始自己定义想要的插件风格和内容,用此模板创建的插件不会有注册或者菜单输入。 BlueprintLibrary:创建一个含有蓝图函数库的插件,此模板函数都是静态全局函数,可以在蓝图中直接调用。 ContentOnly:创建一个只包含内容的空白文件 Editor Toolba

    2024年02月05日
    浏览(44)
  • 【虚幻引擎】UE4/UE5 pak挂载

    【虚幻引擎】UE4/UE5 pak挂载

     找到:D:UEUE_4.27EngineBinariesWin64,  WindowS+R打开CMD命令 运行UnrealPak,运行结果如下      注意如果想要加载Pak内资源,那么这些资源必须是经过Cook的。如果打包的是未Cook的资源,那么即使Pak挂载成功,也不可能会成功加载Pak内资源。  Cook好之后,存储的路径在你的I:DBJ

    2024年02月10日
    浏览(56)
  • 【虚幻引擎】UE4 Spline(样条线)

    【虚幻引擎】UE4 Spline(样条线)

           样条线Spline在UE中是一个很好用的工具,能够设置物体的跟随移动,也能够设置物体的批量复制,还能够设置一个特殊的模型形状比如圆管,还可以设置特殊的粒子特效,做地形设计等等,只要你想要实现的效果,spline都可以实现。官方也提供了很多的案例,可以参考

    2023年04月10日
    浏览(48)
  • 【虚幻引擎UE】UE4/UE5 新人科普向

    【虚幻引擎UE】UE4/UE5 新人科普向

    Unreal Engine是当前最为流行的游戏引擎之一,具有丰富的游戏开发功能和强大的游戏引擎渲染能力。 UE5官方文档:UE5官方文档非常详细,介绍了UE5的各个功能和应用,适合入门学习和深入探究。链接:https://docs.unrealengine.com/5.1/zh-CN/ UE5中文社区:该社区聚集了大量的UE5开发者,

    2024年02月09日
    浏览(56)
  • 【虚幻引擎】UE4 FTabmanager实现多窗口

    【虚幻引擎】UE4 FTabmanager实现多窗口

    我们先看源码的实现方式:FTabmanager类实现了创建窗口的不同方法 NewLayout:创建新的布局方式  RegisterTabSpawner:注册在模块启动时的函数,这个就是创建了一个窗口,窗口所放置的内容  RestoreFrom:从窗口中显示 调用独立窗口需要在模块启动的时候调用FGlobalTabmanager::Get()的Re

    2024年02月10日
    浏览(46)
  • 【虚幻引擎】UE4/UE5科大讯飞文字合成语音

    【虚幻引擎】UE4/UE5科大讯飞文字合成语音

    B站视频链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0   第一步:首先进入讯飞开放平台注册一个账号,然后创建一个 创建一个应用,命名按照你自己的想法来,会产生一个APPID,具体参考UE4如何接入科大讯飞的语音识别_ue4 科大讯飞的语音识别_飞起的猪的博客-CSDN博

    2024年02月13日
    浏览(47)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

    【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

    2024年02月10日
    浏览(148)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包