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

资质办理代办公司seo实战

资质办理代办公司,seo实战,响应式网站的宽度,自己在线制作图片免费下载目录 平行世界是真实存在的吗? 1.3.1 引言 1.3.2 世界管理局(WorldContext) 1.3.3 司法天神(GameInstance) 1.3.4 上帝(Engine) 1.4 总结 平行世界是真实存在的吗? 1.3.1 引言 …

目录

  平行世界是真实存在的吗?

1.3.1 引言

1.3.2 世界管理局(WorldContext)

1.3.3 司法天神(GameInstance)

1.3.4 上帝(Engine)

1.4 总结


平行世界是真实存在的吗?

1.3.1 引言

上一小节中提到说一个World管理多个Level,并负责它们的加载释放。那么,问题来了,在UE的世界中,真的只有一个World

1.3.2 世界管理局(WorldContext

World不是只有一种类型,比如编辑器本身就也是一个World,里面显示的游戏场景也是一个World,这两个World互相协作构成了我们的编辑体验。简单来说,UE其实是一个平行宇宙世界观。
我们先看一下World的种类:

/** Specifies the goal/source of a UWorld object */
namespace EWorldType
{enum Type{/** An untyped world, in most cases this will be the vestigial worlds of streamed in sub-levels */None,/** The game world */Game,/** A world being edited in the editor */Editor,/** A Play In Editor world */PIE,/** A preview world for an editor tool */EditorPreview,/** A preview world for a game */GamePreview,/** A minimal RPC world for a game */GameRPC,/** An editor world that was loaded but not currently being edited in the level editor */Inactive};UE_DEPRECATED(4.14, "EWorldType::Preview is deprecated. Please use either EWorldType::EditorPreview or EWorldType::GamePreview")const EWorldType::Type Preview = EWorldType::EditorPreview;
}

世界类型

描述

None

一个无类型的世界,在大多数情况下,这将是子关卡中流的残余世界

Game

游戏世界

Editor

在编辑器中编辑的世界

PIE

编辑器世界中的游戏世界

EditorPreview

编辑器工具的预览世界

GamePreview

游戏的预览世界

GameRPC

游戏的最小 RPC 世界

Inactive

已加载但当前未在关卡编辑器中编辑的编辑器世界

在World.cpp里面对每种世界类型都做了判断,其代码如下:

/** Returns whether script is executing within the editor. */
bool UWorld::IsPlayInEditor() const
{return WorldType == EWorldType::PIE;
}bool UWorld::IsPlayInPreview() const
{return FParse::Param(FCommandLine::Get(), TEXT("PIEVIACONSOLE"));
}
bool UWorld::IsPlayInMobilePreview() const
{
#if WITH_EDITORif (FPIEPreviewDeviceModule::IsRequestingPreviewDevice()|| FParse::Param(FCommandLine::Get(), TEXT("featureleveles31"))){return true;}
#endif // WITH_EDITORreturn FParse::Param(FCommandLine::Get(), TEXT("simmobile")) && !IsPlayInVulkanPreview();
}bool UWorld::IsPlayInVulkanPreview() const
{return FParse::Param(FCommandLine::Get(), TEXT("vulkan"));
}bool UWorld::IsGameWorld() const
{return WorldType == EWorldType::Game || WorldType == EWorldType::PIE || WorldType == EWorldType::GamePreview || WorldType == EWorldType::GameRPC;
}bool UWorld::IsEditorWorld() const
{return WorldType == EWorldType::Editor || WorldType == EWorldType::EditorPreview || WorldType == EWorldType::PIE;
}bool UWorld::IsPreviewWorld() const
{return WorldType == EWorldType::EditorPreview || WorldType == EWorldType::GamePreview;
}

UE用来管理和跟踪这些World的工具就是WorldContext:

FWorldContext保存着ThisCurrentWorld来指向当前的World。而当需要从一个World切换到另一个World的时候(比如说当点击播放时,就是从Preview切换到PIE),FWorldContext就用来保存切换过程信息和目标World上下文信息。所以一般在切换的时候,比如OpenLevel,也都会需要传FWorldContext的参数。一般就来说,对于独立运行的游戏,WorldContext只有唯一个。而对于编辑器模式,则是一个WorldContext给编辑器,一个WorldContext给PIE(Play In Editor)的World。一般来说我们不需要直接操作到这个类,引擎内部已经处理好各种World的协作。不仅如此,同时FWorldContext还保存着World里Level切换的上下文

粗略的流程是UE在OpenLevel的时候, 先设置当前World的Context上的TravelURL,然后在UEngine::TickWorldTravel的时候判断TravelURL非空来真正执行Level的切换。具体的Level切换详细流程比较复杂,目前先从大局上理解整体结构。总而言之,WorldContext既负责World之间切换的上下文,也负责Level之间切换的操作信息。思考:为何Level的切换信息不放在World里?
因为UE有一个逻辑,一个World只有一个PersistentLevel(见上篇),而当我们OpenLevel一个PersistentLevel的时候,实际上引擎做的是先释放掉当前的World,然后再创建个新的World。所以如果我们把下一个Level的信息放在当前的World中,就不得不在释放当前World前又拷贝回来一遍了。
而LoadStreamLevel的时候,就只是在当前的World中载入对象了,所以其实就没有这个限制了。

思考:为何World和Level的切换要放在下一帧再执行?
首先Level的加载显然是比较慢的,需要载入Map,相应的Mesh,Material……等等。所以这个操作就必须异步化,异步的话其实就剩下两种方式,一种是先记录下来信息之后再执行;一种是命令模式立马往队列里压个命令之后再执行。注意,因为OpenLevel还要相应在主线程生成相应Actor对象,所以有些部分还是要在主线程完成的。这两种模式其实都可以达成需求,前者更加简单明了,后者相对统一。UE也是个进化过来的引擎,也并不是所有的代码都完美无缺。猜想其实也是一开始这么简单就这么做了,后来也没有特别大的改动的动力就一直这样了。引擎最终比的是生产效率的提高,确实也不是代码有多优雅。

1.3.3 司法天神(GameInstance

WorldContexts监管着所有的World,几乎达到了权利的顶峰,那WorldContexts该由什么来进行监督呢?在UE的世界中,GameInstance里会保存着当前的WorldConext和其他整个游戏的信息。明白了GameInstance是比World更高的层次之后,我们也就能明白为何那些独立于Level的逻辑或数据要在GameInstance中存储了。

 这一点其实也很好理解,凡游戏引擎都会有一个Game的概念,不管是叫Application还是Director,它都是玩家能直接接触到的最根源的操作类。而UE的GameInstance因为继承于UObject,所以就拥有了动态创建的能力,所以我们可以通过指定GameInstanceClass来让UE创建使用我们自定义的GameInstance子类。所以不论是C++还是BP,我们通常会继承于GameInstance,然后在里面编写应用于整个游戏范围的逻辑。

1.3.4 上帝(Engine

我们继续再往上,终于得见UE上帝——Engine

此处UEngine分化出了两个子类:UGameEngine和UEditorEngine。众所周知,UE的编辑器也是UE用自己的引擎渲染出来的,采用的也是Slate那套UI框架。好处有很多,比如跨平台比较统一,UI框架可以复用一套控件库,Dogfood等等,此处不再细讲。所以本质上来说,UE的编辑器其实也是个游戏!我们是在编辑器这个游戏里面创造我们自己的另一个游戏。话虽如此,但比较编辑器和游戏还是有一定差别的,所以UE会在不同模式下根据编译环境而采用不同的具体Engine类,而在基类UEngine里通过一个WorldList保存了所有的World。Standalone Game:会使用UGameEngine来创建出唯一的一个GameWorld,因为也只有一个,所以为了方便起见,就直接保存了GameInstance指针。而对于编辑器来说,EditorWorld其实只是用来预览,所以并不拥有OwningGameInstance,而PlayWorld里的OwningGameInstance才是间接保存了GameInstance.目前来说,因为UE还不支持同时运行多个World(当前只能一个,但可以切换),所以GameInstance其实也是唯一的。提前说些题外话,虽然目前网络部分还没涉及到,但是当我们在Editor里进行MultiplePlayer的测试时,每一个Player Window里都是一个World。如果是DedicateServer模式,那DedicateServer也会是一个World。
最后实例化出来的UEngine实例用一个全局的GEngine变量来保存。至此,我们已经到了引擎的最根处GEngine可以说是一切开始的地方了。翻看引擎源码,到处也可以看见从GEngine->出来的引用。

既然我们在引擎内部C++层次已经有了访问World操作Level的能力,那么在暴露出的蓝图系统里,UE为了我们的使用方便,也在Engine层次为我们提供了便利操作蓝图函数库。

UCLASS ()
class UGameplayStatics : public UBlueprintFunctionLibrary

我们在蓝图里见到的GetPlayerController、SpawActor和OpenLevel等都是来至于这个类的接口。这个类比较简单,相当于一个C++的静态类,只为蓝图暴露提供了一些静态方法。在想借鉴或者是查询某个功能的实现时,此处往往会是一个入口。

1.4 总结

从结构上而言,我们已经来到了最根源的地方。GEngine仿佛就是一棵大树的根,当我们拎起它的时候,也会带出整个游戏世界的各个对象。这些对象之间的关系如下:Object->Actor+Component->Level->World->WorldContext->GameInstance->Engine,这些对象已经足够表达UE游戏世界的各个部分。

上篇: 《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World

 总纲: LearnUE——基础指南:总纲 

http://www.hkea.cn/news/455820/

相关文章:

  • 电脑网页无法访问如何解决北京seo地址
  • 直销网站系统制作价格java培训机构
  • dw软件个人简历网站怎么做百度导航下载2022最新版官网
  • 成都官方网站建设泉州seo外包
  • 矿山建设网站天津网络推广seo
  • 国内优秀的响应式网站深圳专业seo外包
  • 重庆装修价格c盘优化大师
  • 银行网站 设计方案外包优化网站
  • 做网站是学什么专业软件外包企业排名
  • wordpress商城 中文站百度站长平台网址
  • 建手机网站的软件有哪些南宁百度seo价格
  • 做网站私活长沙网络营销公司
  • 网站建设公司 广告法被处罚沧州网络推广外包公司
  • 电商网站 开发成本惠州seo外包服务
  • 佛山做网站建设价格百度网盘官方下载
  • 网上购物商城网站建设个人免费域名注册网站
  • 成都学网站建设电子营销主要做什么
  • 织梦cms通用蓝白简介大气企业网站环保科技公司源码网络推广员招聘
  • 网站后台怎么添加图片视频app推广
  • 网站秒收录怎么做的经典软文案例和扶贫农产品软文
  • 珠海疫情最新情况厦门搜索引擎优化
  • 中国菲律宾历史战绩网站关键词优化工具
  • 西宁网站建设最好的公司哪家好优秀网站设计案例
  • 沧州做网站费用搜索引擎优化是做什么的
  • 社区网站推广方案线上运营的5个步骤
  • 湘潭学校网站建设 z磐石网络网站关键词优化教程
  • wordpress多程序用户同步汕头seo排名
  • 旅游网站 建设平台分析百度seo一本通
  • 怎么用dw做网站app开发网站
  • 昆山做网站的公司有哪些seo整站优化推广