Launch模块的Launch.cpp里GuardedMain为通常意义的Main函数,这里有游戏循环;
在这个函数里,首先调用GEngineLoop.PreInit(),这个函数完成所有底层模块和自定义模块以及插件的加载(这些模块被定义为早期加载);
然后调用GEngineLoop.Init(),这里生成了Engine实例,调用engine实例的Init()方法,然后加载了晚期模块和插件,然后又调用Start()方法;
在engine.Init()方法内部主要工作:创建GameInstance、GameViewportClient、LocalPlayer实例;
在engine.Start()方法内部主要工作:调用LoadMap()方法;
在engine.LoadMap()方法内部主要工作:
1、加载map包,生成UWorld,包括level、actor等;
2、调用UWorld的一些方法,如InitWorld(),这个方法配置物理、AI、声音等;还有SetGameMode()方法,这个方法生成了GameMode;
3、加载始终要加载的子level;
4、调用world.InitializeActorsForPlay()方法,主要工作:
①、注册所有actor的component,并且,如果component是primitivecomponent类型,还会创建FprimitiveSceneProxy对象,该对象属于FScene(UWorld在渲染线程里的对应版本);
②、调用gameMode.InitGame(),生成GameSession对象;
③、循环调用所有level的RouteActorInitialize()方法,这里完成所有actor的初始化,其中GameMode也属于actor,因此会GameMode也会得到初始化,这时候会产生GameState对象;
5、产生player;上文提到的LocalPlayer是引擎模块的,对应的在游戏模块里为APlayerController,这个过程产生playercontroller,并且产生spawn;
6、调用world.BeginPlay()方法;
网友评论