{"id":31870,"date":"2024-11-01T09:03:40","date_gmt":"2024-11-01T09:03:40","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=31870"},"modified":"2024-11-01T11:34:21","modified_gmt":"2024-11-01T11:34:21","slug":"unity-basics-course-frame-based-movement-speed-correction","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/31870\/","title":{"rendered":"Unity Basics Course: Frame-Based Movement Speed Correction"},"content":{"rendered":"<p><body><\/p>\n<p>Unity is one of the most widely used game engines today, providing the necessary features for creating games across various platforms. In game development, movement speed is a crucial factor, and understanding how to adjust movement speed to provide a consistent experience across various frame rates is essential. This tutorial will explain frame-based movement speed adjustment in Unity in detail.<\/p>\n<h2>Frame-Based Movement Speed and Time<\/h2>\n<p>In Unity, movement speed is primarily determined by two criteria: <strong>frame-based movement speed<\/strong> and <strong>time-based movement speed<\/strong>. Frame-based movement speed determines how much an object&#8217;s position will change each frame. However, since games cannot generally guarantee a consistent frame rate, it is challenging to maintain a consistent speed with just this method.<\/p>\n<p>Therefore, we need to adjust speed based on time. Specifically, Unity provides the time interval between frames through <code>Time.deltaTime<\/code>. This allows us to adjust movement speed according to time. In other words, we can calculate the distance to move each frame based on <code>Time.deltaTime<\/code>, ensuring that it is not affected by frame rate.<\/p>\n<h2>Basic Script Setup<\/h2>\n<p>Now let&#8217;s apply the concept of movement speed adjustment through a basic movement script example. First, create a new script in Unity and name it <code>PlayerMovement.cs<\/code>.<\/p>\n<pre><code>using UnityEngine;\n\npublic class PlayerMovement : MonoBehaviour\n{\n    public float moveSpeed = 5f;\n\n    void Update()\n    {\n        float horizontal = Input.GetAxis(\"Horizontal\");\n        float vertical = Input.GetAxis(\"Vertical\");\n        \n        Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;\n        \n        if(direction.magnitude &gt;= 0.1f)\n        {\n            float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;\n            transform.rotation = Quaternion.Euler(0, targetAngle, 0);\n\n            Vector3 moveDirection = Quaternion.Euler(0, targetAngle, 0) * Vector3.forward;\n            transform.position += moveDirection * moveSpeed * Time.deltaTime;\n        }\n    }\n}\n<\/code><\/pre>\n<p>The above code is a basic movement script. The <code>moveSpeed<\/code> variable sets the player&#8217;s movement speed, and the <code>Update()<\/code> method takes input to determine the movement direction. It adjusts the position based on the time difference between frames by multiplying by <code>Time.deltaTime<\/code>.<\/p>\n<h2>Code Explanation<\/h2>\n<h3>1. User Input Handling<\/h3>\n<p>The commands <code>Input.GetAxis(\"Horizontal\")<\/code> and <code>Input.GetAxis(\"Vertical\")<\/code> in the provided code are responsible for receiving user input. Each function returns a value between -1 and 1, representing left\/right and up\/down movement.<\/p>\n<h3>2. Direction Vector Calculation<\/h3>\n<p>Based on user input, we create a <code>Vector3<\/code> object called <code>direction<\/code>. This vector represents the direction of movement in the form of (x, 0, z). If this vector&#8217;s length is greater than 0.1 (i.e., if there is a direction in which the user actually wants to move), the next steps are executed.<\/p>\n<h3>3. Rotation and Movement Handling<\/h3>\n<p>The player&#8217;s rotation is calculated based on the input direction using <code>Mathf.Atan2()<\/code>. Then, the generated rotation value is used to update the player&#8217;s rotation state. Finally, in the actual movement handling part, we update <code>transform.position<\/code> based on the calculated direction.<\/p>\n<h2>Advanced Movement Techniques<\/h2>\n<p>In addition to basic movement, various adjustment techniques may be necessary depending on the player&#8217;s movement style. For example, to prevent different speeds when moving diagonally, we can maintain a consistent speed through vector normalization.<\/p>\n<h3>Diagonal Movement Adjustment<\/h3>\n<p>When moving diagonally, the speed increases as inputs are given on both axes. To prevent this, it is necessary to adjust the ratio of the diagonal length. We&#8217;ll use a conditional statement to detect diagonal movement and normalize the <code>Vector3<\/code> vector to adjust the movement speed.<\/p>\n<pre><code>if (direction.magnitude &gt;= 0.1f)\n{\n    direction.Normalize(); \/\/ Normalize the direction vector\n    transform.position += direction * moveSpeed * Time.deltaTime;\n}\n<\/code><\/pre>\n<p>In the above code, the <code>direction.Normalize();<\/code> line normalizes the direction vector, preventing the increase in speed during diagonal movement. Now, the player will move at the same speed regardless of the direction.<\/p>\n<h2>Physics-Based Movement (Using Rigidbody)<\/h2>\n<p>Movement through physics manipulation can be implemented using Unity&#8217;s <code>Rigidbody<\/code> component. This method can better reflect collisions and physical laws, enhancing realism. To implement physics-based movement, follow these steps.<\/p>\n<h3>Adding the Rigidbody Component<\/h3>\n<p>First, add a <code>Rigidbody<\/code> component to the player character object in the Unity Editor. This component allows you to set the object&#8217;s physical properties, such as gravity, mass, linear and angular velocity, and various other physical attributes.<\/p>\n<h3>Movement Code Using Rigidbody<\/h3>\n<pre><code>using UnityEngine;\n\npublic class PlayerMovement : MonoBehaviour\n{\n    public float moveSpeed = 5f;\n    private Rigidbody rb;\n\n    void Start()\n    {\n        rb = GetComponent<Rigidbody>();\n    }\n\n    void Update()\n    {\n        float horizontal = Input.GetAxis(\"Horizontal\");\n        float vertical = Input.GetAxis(\"Vertical\");\n\n        Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;\n\n        rb.MovePosition(transform.position + direction * moveSpeed * Time.deltaTime);\n    }\n}\n<\/code><\/pre>\n<p>In the above code, movement is done through the <code>MovePosition<\/code> method using the <code>Rigidbody<\/code> component. In this case, the movement speed adjustment still occurs through <code>Time.deltaTime<\/code>.<\/p>\n<h2>Integration with Animation<\/h2>\n<p>After adjusting movement speed, you can integrate animations to create more realistic character movements. In Unity, you can control animations using the <code>Animator<\/code> component. Animation transitions are usually based on parameters related to movement speed, allowing the character to switch between walking and running animations smoothly.<\/p>\n<h3>Setting Animation Parameters<\/h3>\n<p>Add a parameter called <code>Speed<\/code> in the Animator Controller and update this value based on movement speed. This way, you can switch to a running animation when moving above a certain speed.<\/p>\n<pre><code>void Update()\n{\n    float horizontal = Input.GetAxis(\"Horizontal\");\n    float vertical = Input.GetAxis(\"Vertical\");\n\n    Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;\n\n    \/\/ Set animation parameters based on movement speed\n    animator.SetFloat(\"Speed\", direction.magnitude);\n\n    if (direction.magnitude &gt;= 0.1f)\n    {\n        rb.MovePosition(transform.position + direction * moveSpeed * Time.deltaTime);\n    }\n}\n<\/code><\/pre>\n<p>In the above code, <code>animator.SetFloat(\"Speed\", direction.magnitude);<\/code> updates the animation parameter based on the magnitude of the current movement direction. Now the animation will transition smoothly as the player moves.<\/p>\n<h2>Performance Optimization<\/h2>\n<p>Finally, it is essential to consider performance optimization. Game performance is a critical aspect in Unity, and it is necessary to minimize unnecessary calculations in the movement script.<\/p>\n<h3>Update vs FixedUpdate<\/h3>\n<p>Physical processes such as movement are typically handled in the <code>FixedUpdate()<\/code> method. While <code>Update()<\/code> is called every frame, <code>FixedUpdate()<\/code> is called at regular time intervals. Therefore, it is recommended to use <code>FixedUpdate()<\/code> for physics-related code.<\/p>\n<pre><code>void FixedUpdate()\n{\n    \/\/ Place your physics-based movement code here...\n}\n<\/code><\/pre>\n<p>Additionally, you can further optimize performance by adjusting the physical calculation constants of the physics engine related to movement handling or removing unnecessary components.<\/p>\n<h2>Conclusion<\/h2>\n<p>In this tutorial, we explored various concepts and implementation methods for frame-based movement speed adjustment in Unity. From basic movement scripts to advanced physics-based movement, animation integration, and performance optimization, we covered many aspects. With these principles, you can provide consistent character movement in your game and it will greatly help in implementing more complex game logic in the future.<\/p>\n<p>Utilize Unity&#8217;s various features to embark on your game development journey. Happy Gaming!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unity is one of the most widely used game engines today, providing the necessary features for creating games across various platforms. In game development, movement speed is a crucial factor, and understanding how to adjust movement speed to provide a consistent experience across various frame rates is essential. This tutorial will explain frame-based movement speed &hellip; <a href=\"https:\/\/atmokpo.com\/w\/31870\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Unity Basics Course: Frame-Based Movement Speed Correction&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[135],"tags":[],"class_list":["post-31870","post","type-post","status-publish","format-standard","hentry","category-unity-basic"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/31870\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Unity is one of the most widely used game engines today, providing the necessary features for creating games across various platforms. In game development, movement speed is a crucial factor, and understanding how to adjust movement speed to provide a consistent experience across various frame rates is essential. This tutorial will explain frame-based movement speed &hellip; \ub354 \ubcf4\uae30 &quot;Unity Basics Course: Frame-Based Movement Speed Correction&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/31870\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:03:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:34:21+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Unity Basics Course: Frame-Based Movement Speed Correction\",\"datePublished\":\"2024-11-01T09:03:40+00:00\",\"dateModified\":\"2024-11-01T11:34:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/\"},\"wordCount\":867,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Unity Basic\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/\",\"url\":\"https:\/\/atmokpo.com\/w\/31870\/\",\"name\":\"Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:03:40+00:00\",\"dateModified\":\"2024-11-01T11:34:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/31870\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/31870\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unity Basics Course: Frame-Based Movement Speed Correction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/31870\/","og_locale":"ko_KR","og_type":"article","og_title":"Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Unity is one of the most widely used game engines today, providing the necessary features for creating games across various platforms. In game development, movement speed is a crucial factor, and understanding how to adjust movement speed to provide a consistent experience across various frame rates is essential. This tutorial will explain frame-based movement speed &hellip; \ub354 \ubcf4\uae30 \"Unity Basics Course: Frame-Based Movement Speed Correction\"","og_url":"https:\/\/atmokpo.com\/w\/31870\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:03:40+00:00","article_modified_time":"2024-11-01T11:34:21+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/31870\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/31870\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Unity Basics Course: Frame-Based Movement Speed Correction","datePublished":"2024-11-01T09:03:40+00:00","dateModified":"2024-11-01T11:34:21+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/31870\/"},"wordCount":867,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Unity Basic"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/31870\/","url":"https:\/\/atmokpo.com\/w\/31870\/","name":"Unity Basics Course: Frame-Based Movement Speed Correction - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:03:40+00:00","dateModified":"2024-11-01T11:34:21+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/31870\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/31870\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/31870\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Unity Basics Course: Frame-Based Movement Speed Correction"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/31870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=31870"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/31870\/revisions"}],"predecessor-version":[{"id":31871,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/31870\/revisions\/31871"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=31870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=31870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=31870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}