{"id":1066,"date":"2021-10-23T15:56:16","date_gmt":"2021-10-23T06:56:16","guid":{"rendered":"https:\/\/colory-games.net\/site\/?p=1066"},"modified":"2023-11-04T20:56:13","modified_gmt":"2023-11-04T11:56:13","slug":"how-to-create-a-loading-animation-en","status":"publish","type":"post","link":"https:\/\/colory-games.net\/site\/en\/how-to-create-a-loading-animation-en\/","title":{"rendered":"[UE4] How to Create a Loading Animation"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><p>It is common to use &quot;Open Level&quot; when you load different levels in Unreal Engine.<br>\nBut &quot;Open Level&quot; is a synchronous process, and it makes the game freeze while loading a level.<br>\nFor this reason, it is common to load levels asynchronously while displaying a loading animation.<\/p>\n<p>This article explains how to load a level asynchronously in the Unreal Engine while displaying the loading animation.<\/p>\n<div id=\"toc_container\" class=\"no_bullets\"><p class=\"toc_title\">\u76ee\u6b21<\/p><ul class=\"toc_list\"><li><a href=\"#Loading_a_level_using_OpenLevel\">Loading a level using OpenLevel<\/a><\/li><li><a href=\"#Loading_a_level_with_a_loading_animation\">Loading a level with a loading animation<\/a><ul><li><a href=\"#Demo_Specifications\">Demo Specifications<\/a><\/li><li><a href=\"#Level_Structure\">Level Structure<\/a><\/li><li><a href=\"#Level_Loading_Process\">Level Loading Process<\/a><\/li><li><a href=\"#Implement_the_Level_Loading_Process\">Implement the Level Loading Process<\/a><\/li><li><a href=\"#Run\">Run<\/a><\/li><\/ul><\/li><li><a href=\"#Summary\">Summary<\/a><\/li><\/ul><\/div>\n<h1><span id=\"Loading_a_level_using_OpenLevel\">Loading a level using OpenLevel<\/span><\/h1>\n<p>First, we will show how to load another level without displaying a loading animation.<br>\nGenerally, it is common to use &quot;Open Level&quot; when you load a level synchronously in Unreal Engine.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/open_level.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/open_level.png?ssl=1\" alt=\"Open Level\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>&quot;Open Level&quot; makes the game process (including the drawing process) stop until the specified level is loaded.<br>\nThis makes the game freeze.<br>\nIf the screen fades out gradually before &quot;Open Level&quot; is executed, the game looks much more natural.<br>\nBut if it remains dark for a long time, the player is anxious whether the game is running correctly or frozen.<br>\nFor this reason, loading another level asynchronously is a basic strategy while displaying loading animations or game tips.<\/p>\n<h1><span id=\"Loading_a_level_with_a_loading_animation\">Loading a level with a loading animation<\/span><\/h1>\n<p>Loading a new level asynchronously with a loading animation on the Unreal Engine requires tricky processes.<br>\nTo realize the loading levels asynchronously, we will shows a demo that loads a level with a loading animation.<\/p>\n<h2><span id=\"Demo_Specifications\">Demo Specifications<\/span><\/h2>\n<p>The flow of the demo of loading levels with a loading animation is as follows.<\/p>\n<ol>\n<li>At the beginning of the game (after pressing the Play button), the first Level (Level A) is loaded first.<\/li>\n<li>When the B button is pressed, the loading animation is displayed and the second Level (Level B) is loaded simultaneously.<\/li>\n<\/ol>\n<ul>\n<li>When Level B is loaded, &quot;Level B Loaded&quot; is displayed on the screen.<\/li>\n<li>When Level B is loaded, the loading animation and Level A are disappeared.<\/li>\n<\/ul>\n<ol start=\"3\">\n<li>When Level A is loaded, the loading animation is appeared.<\/li>\n<\/ol>\n<ul>\n<li>When Level A is loaded, &quot;Level A Loaded&quot; is displayed on the screen.<\/li>\n<li>When Level A is loaded, the loading animation and Level A are disappeared.<\/li>\n<\/ul>\n<p>From here, we will explain how to realize this process.<\/p>\n<h2><span id=\"Level_Structure\">Level Structure<\/span><\/h2>\n<p>To realize the asynchronous processing of levels, create a level loaded asynchronously and a level that manages the levels.<br>\nThe management level loads the levels asynchronously.<br>\nIn the Unreal Engine, a Persistent Level should be a management level, and a sub level should be loaded asynchronously by it.<br>\nSince a Persistent Level is a unique level in the game and can hold multiple sub levels, it is suitable to be used as a level to manage its sub levels.<\/p>\n<ul>\n<li>&quot;Open Level&quot; loads this Persistent Level. This indicates that the Persistent Level can only be read synchronously.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_sub_level.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_sub_level.png?ssl=1\" alt=\"Level and Sub Level\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>To realize the demonstration, we will consider the following level structure.<br>\nCreate a level with the name displayed in the Level Name.<br>\nNote that the loading animation is also managed as the sub level by the Persistent Level in order to dynamically show\/hide the loading animation without switching the Persistent Level.<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Level Name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Persistent Level<\/td>\n<td>L_LevelGroup<\/td>\n<\/tr>\n<tr>\n<td>Sub Level (Level A)<\/td>\n<td>L_LevelA<\/td>\n<\/tr>\n<tr>\n<td>Sub Level (Level B)<\/td>\n<td>L_LevelB<\/td>\n<\/tr>\n<tr>\n<td>Sub Level (Loading Animation)<\/td>\n<td>L_LoadingAnimation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Once you create these levels, then realize the above level structure.<br>\nFirst, open the Level tab with the Level &quot;L_LevelGroup&quot; opened.<br>\nAdd three sub levels and turn off the visibility of all then.<br>\nThis makes these sub levels unloaded when the Persistent Level is loaded.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_structure.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_structure.png?ssl=1\" alt=\"Level Structure\" data-recalc-dims=\"1\"><\/a><\/p>\n<h2><span id=\"Level_Loading_Process\">Level Loading Process<\/span><\/h2>\n<p>The process of loading sub levels (L_LevelA and L_LevelB) asynchronously while displaying the loading animation is as follows.<\/p>\n<ol>\n<li>Load L_LoadingAnimation asynchronously using &quot;Load Stream Level (by Name)&quot;.<\/li>\n<li>Check &quot;Make Visible After Load&quot; in &quot;Load Stream Level (by Name)&quot; to display a loading animation after L_LoadingAnimation has loaded.<\/li>\n<li>Load the level (L_LevelA or L_LevelB) asynchronously using &quot;Load Stream Level (by Name)&quot;.<\/li>\n<li>Check &quot;Make Visible After Load&quot; in &quot;Load Stream Level (by Name)&quot; to display the loaded level.<\/li>\n<li>Delete the old level (L_LevelB if L_LevelA is loaded) and L_LoadingAnimation using &quot;Unload Stream Level (by Name)&quot;.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_loading_process.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/level_loading_process.png?ssl=1\" alt=\"Level Loading Process\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>By displaying a loading animation in the process of loading L_LevelA and L_LevelB, it is possible to prevent the game to be frozen.<br>\nA similar method can be used to display game tips instead of the loading animation.<br>\nHowever, the old level will continue to exist while the new level is being loaded.<br>\nIt should be careful for the old level&#8217;s process (Disable the player&#8217;s input if necessary) not to cause the bugs.<\/p>\n<h2><span id=\"Implement_the_Level_Loading_Process\">Implement the Level Loading Process<\/span><\/h2>\n<p>We will show the process of the implementation by Blueprint.<br>\nThe implementation flow is as follows.<\/p>\n<ol>\n<li>Create UI (W_LoadingAnimation) for the loading animation.<\/li>\n<li>Create a Blueprint Interface (BP_LoadingInterface) for communication between L_LevelGroup and L_LoadingAnimation.<\/li>\n<li>Add loading process of the loadtion animation to the Blueprint of L_LevelGroup.<\/li>\n<li>Add loading process of L_LevelA or L_LevelB to the Blueprint of L_LoadingAnimation.<\/li>\n<li>Add a process to output a message after loading is completed to the Blueprint ofL_LevelA and L_LevelB.<\/li>\n<li>Delete old levels and loading animations.<\/li>\n<\/ol>\n<p>To understand the overview, we will show the file structure for the demo as follows.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/file_structure.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/file_structure.png?ssl=1\" alt=\"File Structure\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>From here, we will explain each step will in detail.<\/p>\n<h3>1. Create UI for the Loading Animation<\/h3>\n<p>Create UI for the loading animation that will be displayed while the level is being loaded.<br>\nFor this demo, we will create an asset called W_LoadingAnimation derived from the User Widget.<br>\nThe W_LoadingAnimation displays the text &quot;Now Loading &#8230;&quot; at the centered, and adds an animation that blinks the text at one-second intervals.<br>\nOpen the Blueprint editor and add a Play Animation node.<br>\nThen connects to the Event Construct.<br>\nSpecify the animation you created and set &quot;Num Loops to Play&quot; to 0.<br>\nThis makes the animation loop indefinitely.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/w_loading_animation_ui.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/w_loading_animation_ui.png?ssl=1\" alt=\"W_LoadingAnimation (UI)\" data-recalc-dims=\"1\"><\/a><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/w_loading_animation_bp.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/w_loading_animation_bp.png?ssl=1\" alt=\"W_LoadingAnimation (Blueprint)\" data-recalc-dims=\"1\"><\/a><\/p>\n<h3>2. Create a Blueprint Interface<\/h3>\n<p>L_LevelGroup switches the level to be loaded according to the input button.<br>\nFor this purpose, we implement the common process in L_LoadingAnimation.<br>\nL_LevelGroup and L_LoadingAnimation are connected by Blueprint Interface.<br>\nThe Blueprint Interface has an argument for passing the level name.<\/p>\n<ul>\n<li>We have another method to implement a common process as a function in L_LevelGroup. But this is not possible because the common process includes asynchronous processes. To solve this problem, we implement the common process in L_LoadingAnimation and call from L_LevelGroup via Blueprint Interface.<\/li>\n<\/ul>\n<p>The asset name of the Blueprint Interface is &quot;BP_LoadingInterface&quot;.<br>\nAdd the function &quot;LoadingAnimationLoaded&quot; with two inputs.<\/p>\n<table>\n<thead>\n<tr>\n<th>Input Name<\/th>\n<th>Type<\/th>\n<th>Meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>NextLevel<\/td>\n<td>Name<\/td>\n<td>Level to load<\/td>\n<\/tr>\n<tr>\n<td>CurrentLevel<\/td>\n<td>Name<\/td>\n<td>Current Level<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/bp_loading_interface.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/bp_loading_interface.png?ssl=1\" alt=\"BP_LoadingInterface\" data-recalc-dims=\"1\"><\/a><\/p>\n<h3>3. Add Loading Process of Loading Animation<\/h3>\n<p>Add a process to load the loading animation.<br>\nIn this demonstration, the loading animation is created as the sub level L_LoadingAnimation.<\/p>\n<p>The sub level is loaded by &quot;Load Stream Level (by Name)&quot;.<br>\nThe argument Level Name is the name of the level to be loaded (In this case, L_LoadingAnimation).<br>\nAs indicated by the clock symbol in the upper right corner of the node, &quot;Load Stream Level (by Name)&quot; is executed asynchronously.<\/p>\n<p>When &quot;Load Stream Level (by Name)&quot; is executed, the loading of L_LoadingAnimation is complete.<br>\nWhen loading is completed, issue the message &quot;Loading Animation Loaded&quot; created in the Blueprint Interface to L_LoadingAnimation.<br>\nSpecify L_LevelA to the input NextLevel when key A is pressed, and specify L_LevelB when key B is pressed.<br>\nSpecify the current level to the input CurrentLevel.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_group_bp_1.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_group_bp_1.png?ssl=1\" alt=\"L_LevelGroup (Blueprint for key A and key B)\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>When the game starts (when the BeginPlay event is issued), L_LevelA is loaded.<br>\nWe connects to Begin Play node about the same process when key A is processed.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_group_bp_2.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_group_bp_2.png?ssl=1\" alt=\"L_LevelGroup (Blueprint of BeginPlay)\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>Next, implement the process executed for the event &quot;Loading Animation Loaded&quot; in L_LoadingAnimation.<br>\nUI of the loading animation W_LoadingAnimation, is displayed by using &quot;Create Widget&quot; and &quot;Add to Viewport&quot;.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_1.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_1.png?ssl=1\" alt=\"L_LoadingAnimation (Blueprint 1)\" data-recalc-dims=\"1\"><\/a><\/p>\n<h3>4. Add the Level Loading Process<\/h3>\n<p>After the loading animation is loaded, loads the level (L_LevelA or L_LevelB).<br>\nThis is accomplished by &quot;Load Stream Level (by Name)&quot; in the same way as loading the loading animation.<br>\nThe argument Level Name specifies the level to be loaded.<br>\nHere, we use the input Next Level of &quot;Loading Animation Loaded&quot;.<\/p>\n<p>The level loading can be a very time-consuming process depending on the amount of data contained in the level.<br>\nWhen you load a level with the almost initial state, the execution time is trivial.<br>\nIt makes us difficult to see the effect of asynchronous loading.<br>\nTherefore, we will add a &quot;Delay&quot; node after the &quot;Load Stream Level (by Name)&quot;.<br>\nThis takes the loading process for more than 3 seconds at least.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_2.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_2.png?ssl=1\" alt=\"L_LoadingAnimation (Blueprint 2)\" data-recalc-dims=\"1\"><\/a><\/p>\n<h3>5. Add a Process to Output a Message after Loading is Completed<\/h3>\n<p>After the loading process is completed, output a message to shows that the loading is complete.<br>\nIn this demonstration, we implement by using &quot;Remote Event&quot;.<br>\nThe event names are as follows.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_3.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_3.png?ssl=1\" alt=\"L_LoadingAnimation (Blueprint 3)\" data-recalc-dims=\"1\"><\/a><\/p>\n<table>\n<thead>\n<tr>\n<th>Event Name<\/th>\n<th>Meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>L_LevelALoaded<\/td>\n<td>L_LevelA has loaded<\/td>\n<\/tr>\n<tr>\n<td>L_LevelBLoaded<\/td>\n<td>L_LevelB has loaded<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Next, open the Blueprint for L_LevelA.<br>\nCreate a Custom Event &quot;L_LevelALoaded.<br>\nConnect a &quot;Print String&quot; node to &quot;L_LevelALoaded&quot; to output the message &quot;L_LevelA Loaded&quot; when the event is received.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_a_bp.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_a_bp.png?ssl=1\" alt=\"L_LevelA\" data-recalc-dims=\"1\"><\/a><\/p>\n<p>Similarly, create a custom event in Blueprint for L_LevelB.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_b_bp.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_level_b_bp.png?ssl=1\" alt=\"L_LevelB\" data-recalc-dims=\"1\"><\/a><\/p>\n<h3>6. Delete Old Levels and Loading Animations<\/h3>\n<p>Return to the Blueprint for L_LoadingAnimation.<br>\nAfter sending the event with &quot;Remote Event&quot;, delete the old level and loading animation.<br>\nTo delete the old level first, specify the input Current Level of &quot;Loading Animation Loaded&quot; to &quot;Unload Stream Level (by Name)&quot;.<\/p>\n<p>Once the level is deleted, delete the loading animation.<br>\nUse &quot;Reomve from Parent&quot; to delete the loading animation W_LoadingAnimation from L_LoadingAnimation.<br>\nFinally, specify L_LoadingAnimation to &quot;Unload Stream Level (by Name)&quot; to remove the loading animation.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_4.png?ssl=1\"><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/l_loading_animation_bp_4.png?ssl=1\" alt=\"L_LoadingAnimation (Blueprint 4)\" data-recalc-dims=\"1\"><\/a><\/p>\n<h2><span id=\"Run\">Run<\/span><\/h2>\n<p>Let&#8217;s try loading the level with the loading animation.<\/p>\n<p>When the play button is pressed with L_LevelGroup opened, the loading animation &quot;Now Loding &#8230;&quot; is displayed for a while.<br>\nThen, &quot;Now Loding &#8230;&quot; is displayed and the loading animation disappears.<br>\nPressing key B displays &quot;Level B Loaded&quot; after the loading animation appears.<br>\nIn the same way, pressing key A displays &quot;Level A Loaded&quot; after the loading animation appears.<br>\nYou will see that a loading animation is displayed while the level is loading.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/colory-games.net\/site\/wp-content\/uploads\/tech-blog\/nutti\/2021\/10\/20211023\/loading_demo.gif?ssl=1\" alt=\"Loading Animation Demo\" data-recalc-dims=\"1\"><\/p>\n<ul>\n<li>Because key input is not disabled during the loading, pressing a key during the loading may not work properly. It is necessary to disable key input during the loading process as you can see.<\/li>\n<\/ul>\n<h1><span id=\"Summary\">Summary<\/span><\/h1>\n<p>We have explained how to load a level with the loading animation.<br>\nAlthough the procedure for asynchronous level loading is complicated, it is worth to implement for the UI improvement.<br>\nThe asynchronous level loading described in this article is also used for open world games.<\/p>\n<p>Try to refer to this article when you implement the asynchronous leel loading in the Unreal Engine.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>It is common to use &#8220;Open Level&#8221; when you load different levels in Unreal Engine.<br \/>\nBut &#8220;Open Level&#8221; is a synchronous process, and it makes the game freeze while loading a level.<br \/>\nFor this reason, it is common to load levels asynchronously while displaying a loading animation.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"templates\/single-home-techblog.php","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":false,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[160,94],"tags":[189],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/posts\/1066"}],"collection":[{"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/comments?post=1066"}],"version-history":[{"count":5,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/posts\/1066\/revisions"}],"predecessor-version":[{"id":1158,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/posts\/1066\/revisions\/1158"}],"wp:attachment":[{"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/media?parent=1066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/categories?post=1066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/colory-games.net\/site\/wp-json\/wp\/v2\/tags?post=1066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}