<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>monstrosite</title>
    <link>https://monstrosite.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 28 Jul 2026 16:08:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>monstro</managingEditor>
    <item>
      <title>유닛 설치 - 3) 특정 타일의 유닛 생성 차단</title>
      <link>https://monstrosite.tistory.com/1361</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;변경되는 맵&lt;/span&gt;에 따라 일부 타일에 &lt;span style=&quot;color: #ee2323;&quot;&gt;유닛&lt;/span&gt;을&lt;span style=&quot;color: #ee2323;&quot;&gt; 설치할 수 없도록&lt;/span&gt; 차단&lt;/b&gt;하는 기능을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 스크립트 작업&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) TileSlot 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xuDMq/dJMcadQl8Mh/hxDMDEfVS7WfWA1kwM4Y5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xuDMq/dJMcadQl8Mh/hxDMDEfVS7WfWA1kwM4Y5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xuDMq/dJMcadQl8Mh/hxDMDEfVS7WfWA1kwM4Y5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxuDMq%2FdJMcadQl8Mh%2FhxDMDEfVS7WfWA1kwM4Y5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;217&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Start 함수&lt;/b&gt;를 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;코루틴&lt;/span&gt;으로 수정&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;TileAnimator&lt;/span&gt;의 싱글톤 인스턴스가 생성되기까지 대기&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) BuildTileSlot 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZlXjz/dJMcahrOR6D/i8NBLwE8KWVW5X3Qk1XiOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZlXjz/dJMcahrOR6D/i8NBLwE8KWVW5X3Qk1XiOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZlXjz/dJMcahrOR6D/i8NBLwE8KWVW5X3Qk1XiOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZlXjz%2FdJMcahrOR6D%2Fi8NBLwE8KWVW5X3Qk1XiOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;317&quot; height=&quot;161&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유닛을 설치할 수 있는 타일&lt;/b&gt;에 위와 같이 멤버변수를 추가한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;bBuildTileAvailable&lt;/span&gt; 멤버변수 : 해당 타일을 &lt;span style=&quot;color: #006dd7;&quot;&gt;사용할 수 있는지&lt;/span&gt; 여부&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;meshRenderer&lt;/span&gt; 멤버변수 : 해당 타일의 &lt;span style=&quot;color: #006dd7;&quot;&gt;MeshRenderer&lt;/span&gt; 컴포넌트&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;material&lt;/span&gt; 멤버변수 : 해당 타일의 &lt;span style=&quot;color: #006dd7;&quot;&gt;Material&lt;/span&gt; 컴포넌트&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;buildTileCollider&lt;/span&gt; 멤버변수 : 해당 타일의 &lt;span style=&quot;color: #006dd7;&quot;&gt;Collider&lt;/span&gt; 컴포넌트&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0FiA/dJMcahL2mHo/SCpkVp9cdbnlMzkFNiZ8RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0FiA/dJMcahL2mHo/SCpkVp9cdbnlMzkFNiZ8RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0FiA/dJMcahL2mHo/SCpkVp9cdbnlMzkFNiZ8RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0FiA%2FdJMcahL2mHo%2FSCpkVp9cdbnlMzkFNiZ8RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;117&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Awake 함수&lt;/b&gt;에 로직을 추가하여 &lt;b&gt;meshRenderer&lt;/b&gt; 멤버변수와 &lt;b&gt;buildTileCollider&lt;/b&gt; 멤버변수의 값을 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cluZ0A/dJMcagsQiDK/dbBHKMGAcVlmxp9j4Mjqgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cluZ0A/dJMcagsQiDK/dbBHKMGAcVlmxp9j4Mjqgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cluZ0A/dJMcagsQiDK/dbBHKMGAcVlmxp9j4Mjqgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcluZ0A%2FdJMcagsQiDK%2FdbBHKMGAcVlmxp9j4Mjqgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;210&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Start 함수&lt;/b&gt;를 위와 같이 오버라이드한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타일을 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;사용할 수 없다&lt;/span&gt;면 타일을 &lt;span style=&quot;color: #006dd7;&quot;&gt;시각화&lt;/span&gt;&lt;/b&gt;하고 &lt;b&gt;마우스 입력이 일어나지 않도록 &lt;span style=&quot;color: #006dd7;&quot;&gt;콜라이더&lt;/span&gt;를 &lt;span style=&quot;color: #006dd7;&quot;&gt;비활성화&lt;/span&gt;&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZhs7/dJMcajbXA0F/WXj1aUk5yXkTEzMQVRkGQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZhs7/dJMcajbXA0F/WXj1aUk5yXkTEzMQVRkGQ0/img.png&quot; data-alt=&quot;OnPointer 계열 함수 3개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZhs7/dJMcajbXA0F/WXj1aUk5yXkTEzMQVRkGQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZhs7%2FdJMcajbXA0F%2FWXj1aUk5yXkTEzMQVRkGQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;457&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OnPointer 계열 함수 3개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 로직을 추가하여 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;사용할 수 없는 타일&lt;/span&gt;에 대해서는 마우스 입력이 &lt;span style=&quot;color: #006dd7;&quot;&gt;일어나지 않도록&lt;/span&gt; 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/10DN3/dJMcaaMXhJr/XNzcuskMCsxKt6SVKRwkJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/10DN3/dJMcaaMXhJr/XNzcuskMCsxKt6SVKRwkJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/10DN3/dJMcaaMXhJr/XNzcuskMCsxKt6SVKRwkJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F10DN3%2FdJMcaaMXhJr%2FXNzcuskMCsxKt6SVKRwkJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;377&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타일의 &lt;span style=&quot;color: #006dd7;&quot;&gt;상승 / 하강&lt;/span&gt; 애니메이션에 관련된 3개의 함수&lt;/b&gt;에서 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;TileAnimator&lt;/span&gt;의 &lt;span style=&quot;color: #006dd7;&quot;&gt;싱글톤 인스턴스&lt;/span&gt;를 사용&lt;/b&gt;하도록 수정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/99YzS/dJMcahSKop0/KE8KtLW0mHqpKRVKYDqGH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/99YzS/dJMcahSKop0/KE8KtLW0mHqpKRVKYDqGH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/99YzS/dJMcahSKop0/KE8KtLW0mHqpKRVKYDqGH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F99YzS%2FdJMcahSKop0%2FKE8KtLW0mHqpKRVKYDqGH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;27&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SetBuildTileAvailability 함수&lt;/b&gt;를 추가하여 &lt;b&gt;타일의&lt;span style=&quot;color: #006dd7;&quot;&gt; 사용할 수 있는지 여부&lt;/span&gt;를 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) UI_BuildBtn 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9ZBM/dJMcahk4lSi/kkRQPUMKHKNjTKAQkl4irK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9ZBM/dJMcahk4lSi/kkRQPUMKHKNjTKAQkl4irK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9ZBM/dJMcahk4lSi/kkRQPUMKHKNjTKAQkl4irK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK9ZBM%2FdJMcahk4lSi%2FkkRQPUMKHKNjTKAQkl4irK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;287&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BuildTower 함수&lt;/b&gt;에 위와 같이 로직을 추가하여 &lt;b&gt;유닛이 설치된 타일을 &lt;span style=&quot;color: #0593d3;&quot;&gt;더 이상 사용할 수 없도록&lt;/span&gt; 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) TileAnimator클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV2Jl4/dJMcah6rbHe/3pc44hpP6XjtRhCHIgliw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV2Jl4/dJMcah6rbHe/3pc44hpP6XjtRhCHIgliw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV2Jl4/dJMcah6rbHe/3pc44hpP6XjtRhCHIgliw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV2Jl4%2FdJMcah6rbHe%2F3pc44hpP6XjtRhCHIgliw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;517&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CoMoveTile 코루틴 함수&lt;/b&gt;에 위와 같이 로직을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;코루틴 함수&lt;/span&gt;가 동작하는 동안 &lt;span style=&quot;color: #009a87;&quot;&gt;상승 / 하강시킬 타일&lt;/span&gt;이 유효한지 확인&lt;/b&gt;하는 코드를 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) BuildManager 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JcDjl/dJMcagTWmO9/XtwupFrkfrhA5UFWOsDkI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JcDjl/dJMcagTWmO9/XtwupFrkfrhA5UFWOsDkI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JcDjl/dJMcagTWmO9/XtwupFrkfrhA5UFWOsDkI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcDjl%2FdJMcagTWmO9%2FXtwupFrkfrhA5UFWOsDkI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;702&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MakeBuildTileAvaliablityFalse 함수&lt;/b&gt;를 추가하여 &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;현재 웨이브의 타일맵&lt;/span&gt;과 &lt;span style=&quot;color: #409d00;&quot;&gt;다음 웨이브의 타일맵&lt;/span&gt;을 비교&lt;/b&gt;하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금이라도 &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;달라진&lt;/span&gt; &lt;span style=&quot;color: #409d00;&quot;&gt;타일들&lt;/span&gt;에 대해서 유닛을 설치할 수 없도록 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0IYGk/dJMb998iVMa/GMDiKjm23ErOKVCCDvsXo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0IYGk/dJMb998iVMa/GMDiKjm23ErOKVCCDvsXo1/img.png&quot; data-alt=&quot;테스트용 멤버변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0IYGk/dJMb998iVMa/GMDiKjm23ErOKVCCDvsXo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0IYGk%2FdJMb998iVMa%2FGMDiKjm23ErOKVCCDvsXo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;35&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트용 멤버변수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2JxiN/dJMb998iVMk/HFjXOpKknQgm2BvRT9kmTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2JxiN/dJMb998iVMk/HFjXOpKknQgm2BvRT9kmTK/img.png&quot; data-alt=&quot;테스트용 멤버변수를 대상으로 타일 비활성화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2JxiN/dJMb998iVMk/HFjXOpKknQgm2BvRT9kmTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2JxiN%2FdJMb998iVMk%2FHFjXOpKknQgm2BvRT9kmTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;87&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트용 멤버변수를 대상으로 타일 비활성화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트용 멤버변수&lt;/b&gt;와 &lt;b&gt;Start 함수&lt;/b&gt;를 추가하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫번째 웨이브&lt;/b&gt;에서&lt;b&gt; 타일에 유닛을 설치할 수 없는 경우를 대비&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6)&lt;span&gt;&amp;nbsp;&lt;/span&gt;WaveManager 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHarf/dJMcaaGfadb/i1b6Lql4pVzY0oHSklIGFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHarf/dJMcaaGfadb/i1b6Lql4pVzY0oHSklIGFk/img.png&quot; data-alt=&quot;WaveData의 nextWaveGrid 변수를 currentWaveGrid 변수로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHarf/dJMcaaGfadb/i1b6Lql4pVzY0oHSklIGFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHarf%2FdJMcaaGfadb%2Fi1b6Lql4pVzY0oHSklIGFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;325&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WaveData의 nextWaveGrid 변수를 currentWaveGrid 변수로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CheckForNewLevelLayout 함수&lt;/b&gt;에 로직을 추가하여&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;다음 웨이브&lt;/span&gt;에 맞춰 &lt;span style=&quot;color: #8a3db6;&quot;&gt;유닛을 설치할 수 있는 타일&lt;/span&gt;을 수정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuU6W0/dJMcadXb7Nc/TkmloFeEEGH6bXRjA0HLa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuU6W0/dJMcadXb7Nc/TkmloFeEEGH6bXRjA0HLa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuU6W0/dJMcadXb7Nc/TkmloFeEEGH6bXRjA0HLa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuU6W0%2FdJMcadXb7Nc%2FTkmloFeEEGH6bXRjA0HLa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;322&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UpdateLevelGrid 함수&lt;/b&gt;에 위와 같이 로직을 추가하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BuildManager의 &lt;span style=&quot;color: #8a3db6;&quot;&gt;테스트용 변수의 값&lt;/span&gt;을 &lt;span style=&quot;color: #8a3db6;&quot;&gt;새로 생성된 타일맵&lt;/span&gt;으로 갱신&lt;/b&gt;하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 생성된 타일맵을 대상으로 &lt;b&gt;유닛을 설치할 수 있는 타일을 수정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csz7by/dJMcajpszqi/oiKmRhRXvkFL9CbJ3mdGz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csz7by/dJMcajpszqi/oiKmRhRXvkFL9CbJ3mdGz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csz7by/dJMcajpszqi/oiKmRhRXvkFL9CbJ3mdGz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsz7by%2FdJMcajpszqi%2FoiKmRhRXvkFL9CbJ3mdGz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;300&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GetCurrentWaveData 함수&lt;/b&gt;를 추가하여 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;현재 웨이브&lt;/span&gt;에 대한 WaveData를 반환&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GetNextWaveData 함수&lt;/b&gt;를 추가하여 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;다음 웨이브&lt;/span&gt;에 대한 WaveData를 반환&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2026-07-27 19-05-37-717.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjyeA/dJMcaaGfamV/DMd1mz2QAj0LCeNiqFFNj0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjyeA/dJMcaaGfamV/DMd1mz2QAj0LCeNiqFFNj0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjyeA/dJMcaaGfamV/DMd1mz2QAj0LCeNiqFFNj0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/sjyeA/dJMcaaGfamV/DMd1mz2QAj0LCeNiqFFNj0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;349&quot; data-filename=&quot;bandicam 2026-07-27 19-05-37-717.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>유니티 엔진 - 게임 프로젝트/타워 디펜스 게임</category>
      <category>Unity 타워 디펜스</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1361</guid>
      <comments>https://monstrosite.tistory.com/1361#entry1361comment</comments>
      <pubDate>Mon, 27 Jul 2026 19:07:06 +0900</pubDate>
    </item>
    <item>
      <title>Dynamo DB - 5) MatchStats 데이터 구조체 추가</title>
      <link>https://monstrosite.tistory.com/1360</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;MatchStats&lt;/span&gt; 관련 데이터를 &lt;span style=&quot;color: #ee2323;&quot;&gt;네트워크 통신&lt;/span&gt;을 통해 주고받기 위한 &lt;span style=&quot;color: #ee2323;&quot;&gt;데이터 구조체&lt;/span&gt;&lt;/b&gt;를 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 구조체를 &lt;span style=&quot;color: #ee2323;&quot;&gt;직렬화 + 역직렬화&lt;/span&gt;하여 필요한 데이터의 값을 &lt;span style=&quot;color: #ee2323;&quot;&gt;변환 + 추출&lt;/span&gt;&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 스크립트 작업&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) HTTPRequestTypes 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzQgDp/dJMcabZqN9s/aRqv9tdikN3JVBF9NTlA6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzQgDp/dJMcabZqN9s/aRqv9tdikN3JVBF9NTlA6K/img.png&quot; data-alt=&quot;DSMatchStats 구조체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzQgDp/dJMcabZqN9s/aRqv9tdikN3JVBF9NTlA6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzQgDp%2FdJMcabZqN9s%2FaRqv9tdikN3JVBF9NTlA6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;781&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DSMatchStats 구조체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DSMatchStats 구조체&lt;/b&gt;를 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체는 &lt;b&gt;MatchStats의 &lt;span style=&quot;color: #ef5369;&quot;&gt;세부정보&lt;/span&gt;를 저장하는 역할&lt;/b&gt;로 사용한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;scoredElims&lt;/span&gt; 멤버변수 : 적 &lt;span style=&quot;color: #ef5369;&quot;&gt;처치 횟수&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;defeats&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;사망 횟수&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; hits&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격&lt;/span&gt; 적중 횟수&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; misses&lt;/span&gt; 멤버변수 : 공격이 &lt;span style=&quot;color: #ef5369;&quot;&gt;빗나간 횟수&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; headShotElims&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;헤드샷&lt;/span&gt; &lt;span style=&quot;color: #ef5369;&quot;&gt;처치&lt;/span&gt; 횟수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; highestStreak&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;최고 연속 처치&lt;/span&gt; 기록 &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; revengeElims&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;복수 처치&lt;/span&gt; 횟수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; dethroneElims&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;우세한 플레이어&lt;/span&gt;를 &lt;span style=&quot;color: #ef5369;&quot;&gt;처치&lt;/span&gt;한 횟수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; showstopperElims&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;특정 상황을 저지&lt;/span&gt;하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;처치&lt;/span&gt;한 횟수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; gotFirstBlood&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #ef5369;&quot;&gt;퍼스트 킬&lt;/span&gt;을 달성했는지 여부 + &lt;span style=&quot;color: #ef5369;&quot;&gt;1이나 0&lt;/span&gt;을 통해 값을 설정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; matchWins&lt;/span&gt; 멤버변수 : 게임의 &lt;span style=&quot;color: #ef5369;&quot;&gt;승리 여부&lt;/span&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;1이나 0&lt;/span&gt;을 통해 값을 설정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;matchLosses&lt;/span&gt; 멤버변수 : 게임의 &lt;span style=&quot;color: #ef5369;&quot;&gt;패배 여부&lt;/span&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;1이나 0&lt;/span&gt;을 통해 값을 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9FWOf/dJMcahrOdUp/3xYjlDyNLXyH3o4nk51H01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9FWOf/dJMcahrOdUp/3xYjlDyNLXyH3o4nk51H01/img.png&quot; data-alt=&quot;DSRecordMatchStatsInput 구조체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9FWOf/dJMcahrOdUp/3xYjlDyNLXyH3o4nk51H01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9FWOf%2FdJMcahrOdUp%2F3xYjlDyNLXyH3o4nk51H01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;216&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DSRecordMatchStatsInput 구조체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DSRecordMatchStatsInput 구조체&lt;/b&gt;를 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체는 위의 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DSMatchStats&lt;/span&gt; 구조체를 &lt;span style=&quot;color: #006dd7;&quot;&gt;플레이어의 이름&lt;/span&gt;과 묶어 관리하는 용도&lt;/b&gt;로 사용한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;matchStats&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #006dd7;&quot;&gt;특정 플레이어&lt;/span&gt;의 &lt;span style=&quot;color: #006dd7;&quot;&gt;DSMatchStats&lt;/span&gt; 값&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;username&lt;/span&gt; 멤버변수 : &lt;span style=&quot;color: #006dd7;&quot;&gt;특정 플레이어&lt;/span&gt;의 &lt;span style=&quot;color: #006dd7;&quot;&gt;이름&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1360</guid>
      <comments>https://monstrosite.tistory.com/1360#entry1360comment</comments>
      <pubDate>Sun, 26 Jul 2026 20:04:40 +0900</pubDate>
    </item>
    <item>
      <title>Dynamo DB - 4) MatchStats 관련 API Gateway 생성</title>
      <link>https://monstrosite.tistory.com/1359</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;클라이언트&lt;/span&gt;에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;서버&lt;/span&gt;로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이전에 생성한&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;RecordMatchStats&lt;/span&gt; 람다 함수의 실행을 요청&lt;/b&gt;할 수 있도록 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; 하나의 게임&lt;/span&gt;이 끝날때마다 플레이어마다의 &lt;span style=&quot;color: #ee2323;&quot;&gt;MatchStats&lt;/span&gt;를 갱신하기 위한 &lt;span style=&quot;color: #ee2323;&quot;&gt;API Gateway&lt;/span&gt;를 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 절차&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) AWS Console 작업&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1 - 1) API Gateway 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ro08k/dJMcac41nr7/2JDbmo3RwahtKloZMWjy10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ro08k/dJMcac41nr7/2JDbmo3RwahtKloZMWjy10/img.png&quot; data-alt=&quot;REST API Gateway 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ro08k/dJMcac41nr7/2JDbmo3RwahtKloZMWjy10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRo08k%2FdJMcac41nr7%2F2JDbmo3RwahtKloZMWjy10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1856&quot; height=&quot;306&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;REST API Gateway 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;REST API&lt;/span&gt; 방식의 API Gateway&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vbYZx/dJMcaftUL0h/wP8CHb0qA14wUp0NsyoKl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vbYZx/dJMcaftUL0h/wP8CHb0qA14wUp0NsyoKl1/img.png&quot; data-alt=&quot;생성한 Gateway의 이름 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vbYZx/dJMcaftUL0h/wP8CHb0qA14wUp0NsyoKl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvbYZx%2FdJMcaftUL0h%2FwP8CHb0qA14wUp0NsyoKl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1537&quot; height=&quot;691&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성한 Gateway의 이름 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새 API 방식으로 생성&lt;/b&gt;하고 &lt;b&gt;API의 이름을 &quot;&lt;span style=&quot;color: #ef5369;&quot;&gt;GameStats&lt;/span&gt;&quot;로 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1 - 2) API Gateway의 리소스 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1L3RR/dJMcacquYOm/5iFq0RnKO6sniaXcMujjKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1L3RR/dJMcacquYOm/5iFq0RnKO6sniaXcMujjKK/img.png&quot; data-alt=&quot;GameStats 게이트웨이의 리소스 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1L3RR/dJMcacquYOm/5iFq0RnKO6sniaXcMujjKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1L3RR%2FdJMcacquYOm%2F5iFq0RnKO6sniaXcMujjKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1870&quot; height=&quot;390&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GameStats 게이트웨이의 리소스 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GameStats 게이트웨이에 대한 &lt;span style=&quot;color: #ef5369;&quot;&gt;리소스&lt;/span&gt;&lt;/b&gt;를 위와 같이 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9TeTS/dJMcacquYTK/hkf7KsTUPvxMkN0mLR3VUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9TeTS/dJMcacquYTK/hkf7KsTUPvxMkN0mLR3VUK/img.png&quot; data-alt=&quot;설정한 리소스에 대한 메서드 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9TeTS/dJMcacquYTK/hkf7KsTUPvxMkN0mLR3VUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9TeTS%2FdJMcacquYTK%2Fhkf7KsTUPvxMkN0mLR3VUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;751&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정한 리소스에 대한 메서드 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정한 리소스에 대한 람다 함수&lt;/b&gt;를 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;민감한 데이터&lt;/span&gt;를 전달하므로 &lt;span style=&quot;color: #ef5369;&quot;&gt;POST&lt;/span&gt; 방식으로 동작&lt;/b&gt;하도록 설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 &lt;b&gt;생성한 &lt;span style=&quot;color: #ef5369;&quot;&gt;RecordMatchStats&lt;/span&gt; 람다 함수를 사용&lt;/b&gt;하도록 구성하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1 - 3) 생성한 API Gateway 배포&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmrzCm/dJMcaa0rAN4/b5oXaDsIxSHjynKXgK9MXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmrzCm/dJMcaa0rAN4/b5oXaDsIxSHjynKXgK9MXK/img.png&quot; data-alt=&quot;완전히 구성된 Gateway 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmrzCm/dJMcaa0rAN4/b5oXaDsIxSHjynKXgK9MXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmrzCm%2FdJMcaa0rAN4%2Fb5oXaDsIxSHjynKXgK9MXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;611&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전히 구성된 Gateway 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성이 완료된&lt;b&gt; Gateway를 외부에 &lt;span style=&quot;color: #ef5369;&quot;&gt;배포&lt;/span&gt;하기 위한 &lt;span style=&quot;color: #ef5369;&quot;&gt;스테이지&lt;/span&gt;를 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스테이지의 이름을 &quot;&lt;span style=&quot;color: #ef5369;&quot;&gt;stage_1&lt;/span&gt;&quot;으로 구성하고 배포&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 스크립트 작업&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2 - 1) DedicatedServersTags 클래스&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b868v3/dJMcabrxpMR/PXW8XJmk7q0kC6EfouHgI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b868v3/dJMcabrxpMR/PXW8XJmk7q0kC6EfouHgI1/img.png&quot; data-alt=&quot;GameStats API에 대한 태그 선언&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b868v3/dJMcabrxpMR/PXW8XJmk7q0kC6EfouHgI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb868v3%2FdJMcabrxpMR%2FPXW8XJmk7q0kC6EfouHgI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;82&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GameStats API에 대한 태그 선언&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEBMS/dJMcah6qu2w/mmBCCLFjQJMIgftdasbQY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEBMS/dJMcah6qu2w/mmBCCLFjQJMIgftdasbQY1/img.png&quot; data-alt=&quot;GameStats API에 대한 태그 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEBMS/dJMcah6qu2w/mmBCCLFjQJMIgftdasbQY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEBMS%2FdJMcah6qu2w%2FmmBCCLFjQJMIgftdasbQY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;81&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GameStats API에 대한 태그 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;매크로&lt;/span&gt;를 사용하여 &lt;span style=&quot;color: #006dd7;&quot;&gt;GameStats API&lt;/span&gt;에 대한 &lt;span style=&quot;color: #006dd7;&quot;&gt;태그&lt;/span&gt;를 선언 + 정의&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2 - 2) GameStatsManager 클래스&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpE05/dJMcaf8svST/vMeVaCg5Ek4k7ACykkkMRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpE05/dJMcaf8svST/vMeVaCg5Ek4k7ACykkkMRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpE05/dJMcaf8svST/vMeVaCg5Ek4k7ACykkkMRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpE05%2FdJMcaf8svST%2FvMeVaCg5Ek4k7ACykkkMRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;175&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;GameStats API&lt;/span&gt;와 관련된 &lt;span style=&quot;color: #0593d3;&quot;&gt;네트워크 작업&lt;/span&gt;을 처리하는 GameStatsManager 클래스&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 클래스로 &lt;span style=&quot;color: #0593d3;&quot;&gt;HTTPRequestManager&lt;/span&gt; 클래스를 사용&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 블루프린트 작업&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 1) DA_GameStatsAPIData 데이터 애셋&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXYp4X/dJMcahSJNTv/9s8sFRv3y9UQ15dhydYhBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXYp4X/dJMcahSJNTv/9s8sFRv3y9UQ15dhydYhBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXYp4X/dJMcahSJNTv/9s8sFRv3y9UQ15dhydYhBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXYp4X%2FdJMcahSJNTv%2F9s8sFRv3y9UQ15dhydYhBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;212&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;APIData&lt;/span&gt; 데이터애셋에서 상속된&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;DA_GameStatsAPIData&lt;/span&gt; 데이터 애셋&lt;/b&gt;을 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;GameStats API&lt;/span&gt;의 리소스와 관련된 데이터들을 저장&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 2) BP_GameStatsManager 블루프린트&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b02i9S/dJMcaaTGsDT/wlPtnwuFBLQjpuOLU3yGi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b02i9S/dJMcaaTGsDT/wlPtnwuFBLQjpuOLU3yGi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b02i9S/dJMcaaTGsDT/wlPtnwuFBLQjpuOLU3yGi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb02i9S%2FdJMcaaTGsDT%2FwlPtnwuFBLQjpuOLU3yGi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;127&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;2 - 2)&lt;/span&gt;에서 생성한 C++ 클래스를 바탕으로 블루프린트를 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;APIData&lt;/span&gt; 멤버변수의 값으로 &lt;span style=&quot;color: #409d00;&quot;&gt;3 - 1)&lt;/span&gt;에서 생성한 데이터 애셋을 사용&lt;/b&gt;한다&lt;/p&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1359</guid>
      <comments>https://monstrosite.tistory.com/1359#entry1359comment</comments>
      <pubDate>Sun, 26 Jul 2026 19:14:51 +0900</pubDate>
    </item>
    <item>
      <title>Dynamo DB - 3) MatchPlayerState 데이터 처리</title>
      <link>https://monstrosite.tistory.com/1358</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTleLD/dJMcad3SMGt/I20xUjSB1s1gT4VPoveRb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTleLD/dJMcad3SMGt/I20xUjSB1s1gT4VPoveRb1/img.png&quot; data-alt=&quot;MatchPlayerState 클래스의 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTleLD/dJMcad3SMGt/I20xUjSB1s1gT4VPoveRb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTleLD%2FdJMcad3SMGt%2FI20xUjSB1s1gT4VPoveRb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;402&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MatchPlayerState 클래스의 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트에서 사용하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;PlayerState&lt;/span&gt; 클래스인 &lt;span style=&quot;color: #ee2323;&quot;&gt;MatchPlayerState&lt;/span&gt; 클래스&lt;/b&gt;에는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;진행된&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;게임의 결과&lt;/span&gt;와 관련된 여러 변수를 포&lt;/b&gt;함하고 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;b&gt; 하나의 게임이 종료된 후&lt;/b&gt;에 &lt;b&gt;해당 변수들의 값을 &lt;span style=&quot;color: #ee2323;&quot;&gt;Dynamo DB&lt;/span&gt;의&lt;span style=&quot;color: #ee2323;&quot;&gt; 데이터 테이블&lt;/span&gt;에 추가하는 람다 함수를 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 절차&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 람다 함수 생성 및 구성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YMEPb/dJMcafOjpkD/4E57ykLBxRzAgTJKIF4pnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YMEPb/dJMcafOjpkD/4E57ykLBxRzAgTJKIF4pnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YMEPb/dJMcafOjpkD/4E57ykLBxRzAgTJKIF4pnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYMEPb%2FdJMcafOjpkD%2F4E57ykLBxRzAgTJKIF4pnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1852&quot; height=&quot;537&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;MatchState&lt;/span&gt;의 변수의 값을 &lt;span style=&quot;color: #ef5369;&quot;&gt;Dynamo DB&lt;/span&gt;의 테이블에 반영&lt;/b&gt;하는 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;RecordMatchStats&lt;/span&gt; 람다 함수&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLmtQ/dJMcag7oLtR/hTjrDHctFhik9YHpeQnnik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLmtQ/dJMcag7oLtR/hTjrDHctFhik9YHpeQnnik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLmtQ/dJMcag7oLtR/hTjrDHctFhik9YHpeQnnik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLmtQ%2FdJMcag7oLtR%2FhTjrDHctFhik9YHpeQnnik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;137&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 람다 함수에 대한&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; REGION&lt;/span&gt; 환경 변수를 추가&lt;/b&gt;하여&lt;b&gt; 로직에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;리전&lt;/span&gt;에 접근&lt;/b&gt;할 수 있도록 구성하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;USER_POOL_ID&lt;/span&gt; 환경 변수를 추가&lt;/b&gt;하여 &lt;b&gt;로직에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;User Pool&lt;/span&gt;에 접근&lt;/b&gt;할 수 있도록 구성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 정책 설정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2 - 1) 정책 설정 - AdminGetUser 리소스&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yvg49/dJMcaiqCABf/91E93Wqy5vHyOIV0ZFthJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yvg49/dJMcaiqCABf/91E93Wqy5vHyOIV0ZFthJ1/img.png&quot; data-alt=&quot;RecordMatchStats 람다 함수에 부여할 정책 설정 (1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yvg49/dJMcaiqCABf/91E93Wqy5vHyOIV0ZFthJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvg49%2FdJMcaiqCABf%2F91E93Wqy5vHyOIV0ZFthJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1586&quot; height=&quot;612&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RecordMatchStats 람다 함수에 부여할 정책 설정 (1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성할 람다 함수에 &lt;b&gt;부여할 정책을 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CognitoUserPools&lt;/span&gt;의 &lt;span style=&quot;color: #006dd7;&quot;&gt;AdminGetUser&lt;/span&gt; 리소스를 사용할 수 있도록 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;관리자 권한&lt;/span&gt;으로 &lt;span style=&quot;color: #006dd7;&quot;&gt;특정 User Pool&lt;/span&gt;에 대한 &lt;span style=&quot;color: #006dd7;&quot;&gt;사용자의 정보&lt;/span&gt;를 가져올 수 있도록 구성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 &lt;b&gt;현재 사용중인 User Pool의 &lt;span style=&quot;color: #006dd7;&quot;&gt;ARN&lt;/span&gt;을 추가&lt;/b&gt;해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RWiNL/dJMcabkO18C/kBjmQxUw4y2PYdMXbOGVEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RWiNL/dJMcabkO18C/kBjmQxUw4y2PYdMXbOGVEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RWiNL/dJMcabkO18C/kBjmQxUw4y2PYdMXbOGVEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRWiNL%2FdJMcabkO18C%2FkBjmQxUw4y2PYdMXbOGVEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;32&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성한 정책의 이름&lt;/b&gt;을 위와 같이 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2 - 2) 정책 설정 - GetItem 리소스&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMtHo/dJMcacjCgr7/SL6iup6Letbyob1QLjkH60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMtHo/dJMcacjCgr7/SL6iup6Letbyob1QLjkH60/img.png&quot; data-alt=&quot;RecordMatchStats 람다 함수에 부여할 정책 설정 (2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMtHo/dJMcacjCgr7/SL6iup6Letbyob1QLjkH60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMtHo%2FdJMcacjCgr7%2FSL6iup6Letbyob1QLjkH60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;291&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RecordMatchStats 람다 함수에 부여할 정책 설정 (2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 - 1)에서 생성한 &lt;b&gt;DS_RecordMatchStats 정책에&lt;span style=&quot;color: #0593d3;&quot;&gt; DynamoDB&lt;/span&gt;의 &lt;span style=&quot;color: #0593d3;&quot;&gt;GetItem&lt;/span&gt; 리소스를 사용하도록 추가&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetItem은 &lt;b&gt;Dynamo DB의 &lt;span style=&quot;color: #0593d3;&quot;&gt;테이블&lt;/span&gt;에서 &lt;span style=&quot;color: #0593d3;&quot;&gt;단일 아이템&lt;/span&gt;을&lt;span style=&quot;color: #0593d3;&quot;&gt; 조회&lt;/span&gt;하는 목적&lt;/b&gt;으로 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PUnn7/dJMcahL1mDl/4K0r4uvZXXZ3YBndKo9lRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PUnn7/dJMcahL1mDl/4K0r4uvZXXZ3YBndKo9lRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PUnn7/dJMcahL1mDl/4K0r4uvZXXZ3YBndKo9lRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPUnn7%2FdJMcahL1mDl%2F4K0r4uvZXXZ3YBndKo9lRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1225&quot; height=&quot;360&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가한 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;GetItem&lt;/span&gt; 리소스에 대해 현재 사용중인 &lt;span style=&quot;color: #0593d3;&quot;&gt;Players&lt;/span&gt; 테이블과 &lt;span style=&quot;color: #0593d3;&quot;&gt;User Pool&lt;/span&gt;의&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;ARN&lt;/span&gt;을 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2 - 3) 정책 설정 - PutItem 리소스&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cimgr6/dJMcadQk1lA/TmmqBP57dSYG8jpdjPj5IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cimgr6/dJMcadQk1lA/TmmqBP57dSYG8jpdjPj5IK/img.png&quot; data-alt=&quot;RecordMatchStats 람다 함수에 부여할 정책 설정 (3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cimgr6/dJMcadQk1lA/TmmqBP57dSYG8jpdjPj5IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcimgr6%2FdJMcadQk1lA%2FTmmqBP57dSYG8jpdjPj5IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;82&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RecordMatchStats 람다 함수에 부여할 정책 설정 (3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2 - 1)에서 생성한&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DS_RecordMatchStats 정책에&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;DynamoDB&lt;/span&gt;&lt;/span&gt;의&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;PutItem&lt;/span&gt; &lt;/span&gt;리소스를 사용하도록 추가&lt;/b&gt;한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GetItem은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Dynamo DB의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;테이블&lt;/span&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;단일 아이템&lt;/span&gt;을&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; 생성&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하거나&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;덮어쓰기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;하는 목적&lt;/b&gt;으로 사용한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3) 람다 함수 정의&lt;/h3&gt;
&lt;pre id=&quot;code_1784969327256&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { CognitoIdentityProviderClient, AdminGetUserCommand } from &quot;@aws-sdk/client-cognito-identity-provider&quot;;
import { DynamoDBClient, GetItemCommand, PutItemCommand } from &quot;@aws-sdk/client-dynamodb&quot;;
import { marshall, unmarshall } from &quot;@aws-sdk/util-dynamodb&quot;;

export const handler = async (event) =&amp;gt; {
  const cognitoIdentityProviderClient = new CognitoIdentityProviderClient( { region: process.env.REGION } );
  const dynamoDBClient = new DynamoDBClient( { region: process.env.REGION } );
  try {
    const adminGetUserInput = {
      Username: event.username,
      UserPoolId: process.env.USER_POOL_ID
    };
    const adminGetUserCommand = new AdminGetUserCommand(adminGetUserInput);
    const adminGetUserResponse = await cognitoIdentityProviderClient.send(adminGetUserCommand);

    const sub = adminGetUserResponse.UserAttributes.find(attribute =&amp;gt; attribute.Name === &quot;sub&quot;).Value;
    const email = adminGetUserResponse.UserAttributes.find(attribute =&amp;gt; attribute.Name === &quot;email&quot;).Value;
    
    const getItemInput = {
      TableName: &quot;Players&quot;,
      Key: marshall( { databaseid: sub } ),
    };

    const getItemCommand = new GetItemCommand(getItemInput);
    const getItemResponse = await dynamoDBClient.send(getItemCommand);
    let statsFromDB = getItemResponse.Item ? unmarshall(getItemResponse.Item) : { databaseid: sub };

    const eventMatchStats = event.matchStats;

    for (const key in eventMatchStats) {
      if (statsFromDB[key] !== undefined) {
        statsFromDB[key] += eventMatchStats[key];
      } else {
        statsFromDB[key] = eventMatchStats[key];
      }
    }

    const putItemInput = {
      TableName: &quot;Players&quot;,
      Item: marshall( { ...statsFromDB } )
    };
    const putItemCommand = new PutItemCommand(putItemInput);
    await dynamoDBClient.send(putItemCommand);

    return {
      statusCode: 200,
      body: `Updated match stats for ${event.username}`
    };
  } catch(error) {
    return error;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RecordMatchStats 람다 함수&lt;/b&gt;의 코드를 위와 같이 구성한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; AdminGetUser&lt;/span&gt; 리소스를 사용하여 &lt;span style=&quot;color: #409d00;&quot;&gt;event.username&lt;/span&gt;을 통해 User Pool에서&lt;span style=&quot;color: #409d00;&quot;&gt; 해당 유저의 상세 정보&lt;/span&gt;를 반환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상세 정보 중에서 &lt;span style=&quot;color: #409d00;&quot;&gt;sub 고유 식별자&lt;/span&gt;와 &lt;span style=&quot;color: #409d00;&quot;&gt;email&lt;/span&gt; 값을 추출&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; sub 값을 기본 키로 &lt;span style=&quot;color: #409d00;&quot;&gt;GetItem&lt;/span&gt; 리소스를 사용하여 &lt;span style=&quot;color: #409d00;&quot;&gt;Players&lt;/span&gt; 테이블에서&lt;span style=&quot;color: #409d00;&quot;&gt; 플레이어의 기존 정보&lt;/span&gt;를 조회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기존 정보에 새로 들어온 &lt;span style=&quot;color: #409d00;&quot;&gt;event.matchStats&lt;/span&gt; 값을 &lt;span style=&quot;color: #409d00;&quot;&gt;합산&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; PutItem&lt;/span&gt; 리소스를 사용하여 &lt;span style=&quot;color: #409d00;&quot;&gt;갱신된 정보&lt;/span&gt;를 Players 테이블에 &lt;span style=&quot;color: #409d00;&quot;&gt;덮어씌움&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MXJ5u/dJMcaiYojKU/kTJdMLsjpxzXqNgcZKqMk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MXJ5u/dJMcaiYojKU/kTJdMLsjpxzXqNgcZKqMk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MXJ5u/dJMcaiYojKU/kTJdMLsjpxzXqNgcZKqMk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMXJ5u%2FdJMcaiYojKU%2FkTJdMLsjpxzXqNgcZKqMk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;267&quot; height=&quot;170&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RecordMatchStats 람다 함수에 사용할 &lt;b&gt;테스트 데이터&lt;/b&gt;를 위와 같이 구성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n65Mw/dJMcagTVfGS/gJuH1uHfBnQdKkAHZbFj5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n65Mw/dJMcagTVfGS/gJuH1uHfBnQdKkAHZbFj5K/img.png&quot; data-alt=&quot;람다 함수 실행 후의 로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n65Mw/dJMcagTVfGS/gJuH1uHfBnQdKkAHZbFj5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn65Mw%2FdJMcagTVfGS%2FgJuH1uHfBnQdKkAHZbFj5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;197&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;람다 함수 실행 후의 로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 실행 결과에서 위와 같이 &lt;b&gt;statusCode : 200이 출력&lt;/b&gt;되어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적으로 &lt;b&gt;테스트 데이터를 통한 람다 함수의 수행&lt;/b&gt;이 이뤄진 것을 확인할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barLhU/dJMcafAHMqY/RUEYL4DrCSzfMeKnQ5GnZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barLhU/dJMcafAHMqY/RUEYL4DrCSzfMeKnQ5GnZK/img.png&quot; data-alt=&quot;DynamoDB의 Players 테이블&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barLhU/dJMcafAHMqY/RUEYL4DrCSzfMeKnQ5GnZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbarLhU%2FdJMcafAHMqY%2FRUEYL4DrCSzfMeKnQ5GnZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;102&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DynamoDB의 Players 테이블&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamo DB의 &lt;b&gt;Players 테이블&lt;/b&gt;에서 &lt;b&gt;hits와 misees 속성과 값이 추가&lt;/b&gt;된 것도 확인할 수 있다&lt;/p&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1358</guid>
      <comments>https://monstrosite.tistory.com/1358#entry1358comment</comments>
      <pubDate>Sat, 25 Jul 2026 18:19:46 +0900</pubDate>
    </item>
    <item>
      <title>Dynamo DB - 2) 사용자 인증 처리</title>
      <link>https://monstrosite.tistory.com/1357</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회원가입한 플레이어가 &lt;span style=&quot;color: #ee2323;&quot;&gt;인증&lt;/span&gt;한 후&lt;/b&gt;에 &lt;b&gt;사용자 정보를 &lt;span style=&quot;color: #ee2323;&quot;&gt;Dynamo DB&lt;/span&gt;에 추가하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;람다 함수&lt;/span&gt;&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 절차&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 람다 함수 생성 및 정책 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2hfg/dJMcab560Ju/EBcVaxVQdqmvNGTWUCy3nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2hfg/dJMcab560Ju/EBcVaxVQdqmvNGTWUCy3nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2hfg/dJMcab560Ju/EBcVaxVQdqmvNGTWUCy3nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2hfg%2FdJMcab560Ju%2FEBcVaxVQdqmvNGTWUCy3nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1852&quot; height=&quot;416&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 콘솔의 &lt;b&gt;람다 탭에서&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;CongitoPostConfirmation&lt;/span&gt; 람다 함수&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRLR7/dJMb998gEcx/OE4dr8oIoHVeLk7cSHbaf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRLR7/dJMb998gEcx/OE4dr8oIoHVeLk7cSHbaf0/img.png&quot; data-alt=&quot;CognitoPostConfirmation 람다 함수 정책 설정 (1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRLR7/dJMb998gEcx/OE4dr8oIoHVeLk7cSHbaf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRLR7%2FdJMb998gEcx%2FOE4dr8oIoHVeLk7cSHbaf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;502&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CognitoPostConfirmation 람다 함수 정책 설정 (1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 람다 함수에 &lt;b&gt;적용할 정책을 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Players&lt;/span&gt; 테이블을 대상으로 정책을 사용&lt;/b&gt;하도록 &lt;b&gt;Players 테이블의 &lt;span style=&quot;color: #ef5369;&quot;&gt;리소스 ARN&lt;/span&gt;을 복사 + 붙여넣기&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8SdE/dJMcafHu1Vc/xVq6i7Uk1FGvKed9iNL8RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8SdE/dJMcafHu1Vc/xVq6i7Uk1FGvKed9iNL8RK/img.png&quot; data-alt=&quot;CognitoPostConfirmation 람다 함수 정책 설정 (2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8SdE/dJMcafHu1Vc/xVq6i7Uk1FGvKed9iNL8RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8SdE%2FdJMcafHu1Vc%2FxVq6i7Uk1FGvKed9iNL8RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1497&quot; height=&quot;402&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CognitoPostConfirmation 람다 함수 정책 설정 (2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정책은 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;DynamoDB&lt;/span&gt;의 &lt;span style=&quot;color: #ef5369;&quot;&gt;PutItem&lt;/span&gt; 리소스를 사용&lt;/b&gt;할 수 있도록 구성하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AdnAi/dJMcahk1SsG/JeKht2jXW9FRKogpKbU4g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AdnAi/dJMcahk1SsG/JeKht2jXW9FRKogpKbU4g1/img.png&quot; data-alt=&quot;CognitoPostConfirmation 람다 함수 정책 설정 (3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AdnAi/dJMcahk1SsG/JeKht2jXW9FRKogpKbU4g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAdnAi%2FdJMcahk1SsG%2FJeKht2jXW9FRKogpKbU4g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1497&quot; height=&quot;395&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CognitoPostConfirmation 람다 함수 정책 설정 (3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성한 정책의 이름&lt;/b&gt;을 위와 같이 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1501&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwFOrD/dJMcacKMTdl/Ligz5QPCktvhIQIHF7ZyJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwFOrD/dJMcacKMTdl/Ligz5QPCktvhIQIHF7ZyJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwFOrD/dJMcacKMTdl/Ligz5QPCktvhIQIHF7ZyJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwFOrD%2FdJMcacKMTdl%2FLigz5QPCktvhIQIHF7ZyJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1501&quot; height=&quot;342&quot; data-origin-width=&quot;1501&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 생성한 &lt;b&gt;CognitoPostConfirmation 람다 함수에 &lt;span style=&quot;color: #ef5369;&quot;&gt;정책&lt;/span&gt;을 적용&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EuPHb/dJMcagNcsBF/7xvlKZGKTl1C3yiKrkJUU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EuPHb/dJMcagNcsBF/7xvlKZGKTl1C3yiKrkJUU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EuPHb/dJMcagNcsBF/7xvlKZGKTl1C3yiKrkJUU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEuPHb%2FdJMcagNcsBF%2F7xvlKZGKTl1C3yiKrkJUU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1547&quot; height=&quot;261&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다 함수에서 &lt;b&gt;사용할 &lt;span style=&quot;color: #ef5369;&quot;&gt;REGION&lt;/span&gt; 환경 변수를 정의&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 람다 함수 정의&lt;/h4&gt;
&lt;pre id=&quot;code_1784869556663&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { DynamoDBClient, PutItemCommand } from &quot;@aws-sdk/client-dynamodb&quot;;

export const handler = async (event) =&amp;gt; {
  
  console.log(JSON.stringify(event));

  if (event.triggerSource === 'PostConfirmation_ConfirmSignUp') {
    const dynamoDBClient = new DynamoDBClient( { region: process.env.REGION } );
    const username = event.userName;
    const cognitosub = event.request.userAttributes.sub;
    const email = event.request.userAttributes.email;

    const putItemInput = {
      TableName: &quot;Players&quot;,
      Item: {
        &quot;databaseid&quot;: { S: cognitosub },
        &quot;username&quot;: { S: username },
        &quot;email&quot;: { S: email },
      }
    };

    const putItemCommand = new PutItemCommand(putItemInput);
    try {
      const putItemResponse = await dynamoDBClient.send(putItemCommand);
    } catch(error) {
      return error;
    }
  }
  return event;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 &lt;b&gt;CognitoPostConfirmation 람다 함수&lt;/b&gt;의 코드를 정의한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Cognito 트리거 이벤트&lt;/span&gt; 종류를 체크&lt;/b&gt;하여 플레이어가 &lt;b&gt;회원가입 후에 &lt;span style=&quot;color: #006dd7;&quot;&gt;인증이 성공&lt;/span&gt;한 경우&lt;/b&gt;에만 로직을 수행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;REGION&lt;/span&gt; 환경 변수를 사용&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DynamoDB 클라이언트&lt;/span&gt;를 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;인자로 전달받은 &lt;b&gt;이벤트에서 &lt;span style=&quot;color: #006dd7;&quot;&gt;핵심 사용자 정보 3가지&lt;/span&gt;를 추출&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;userName&lt;/span&gt; : 플레이어의 &lt;span style=&quot;color: #006dd7;&quot;&gt;이름&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;cognitoSub&lt;/span&gt; : &lt;span style=&quot;color: #006dd7;&quot;&gt;User Pool&lt;/span&gt;에서 부여하는&lt;span style=&quot;color: #006dd7;&quot;&gt; 고유 식별자&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;email&lt;/span&gt; : 플레이어의 &lt;span style=&quot;color: #006dd7;&quot;&gt;이메일 주소&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DynamoDB의 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Players&lt;/span&gt; 테이블에 &lt;span style=&quot;color: #006dd7;&quot;&gt;문자열 형태&lt;/span&gt;로 데이터들을 매핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;이후 &lt;b&gt;DynamoDB에 데이터를 작성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 람다 함수 트리거 연결&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA7HTf/dJMcafncQ53/KZ188ZHg2HwRkuIKGkORt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA7HTf/dJMcafncQ53/KZ188ZHg2HwRkuIKGkORt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA7HTf/dJMcafncQ53/KZ188ZHg2HwRkuIKGkORt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA7HTf%2FdJMcafncQ53%2FKZ188ZHg2HwRkuIKGkORt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1627&quot; height=&quot;671&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재&lt;span style=&quot;color: #0593d3;&quot;&gt; 사용중인 User Pool&lt;/span&gt;의 &lt;span style=&quot;color: #0593d3;&quot;&gt;Lambda 트리거&lt;/span&gt;에 &lt;span style=&quot;color: #0593d3;&quot;&gt;CognitoPostConfirmation&lt;/span&gt; 람다 함수를 연결&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회원가입 후의 인증이 끝나면 &lt;span style=&quot;color: #0593d3;&quot;&gt;Players 테이블&lt;/span&gt;에 추가하는 람다&lt;/b&gt;이므로 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;사후 확인 트리거&lt;/span&gt; 방식으로 동작&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yTt4a/dJMcajpqHOd/5tiXJjp1KfwoplgJu3JUKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yTt4a/dJMcajpqHOd/5tiXJjp1KfwoplgJu3JUKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yTt4a/dJMcajpqHOd/5tiXJjp1KfwoplgJu3JUKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyTt4a%2FdJMcajpqHOd%2F5tiXJjp1KfwoplgJu3JUKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;697&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;697&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에디터를 실행한 후에 위와 같이 &lt;b&gt;회원정보를 기입&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1bCE/dJMcadW96E2/QvvMwTprgBkDYFsTQ2kbS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1bCE/dJMcadW96E2/QvvMwTprgBkDYFsTQ2kbS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1bCE/dJMcadW96E2/QvvMwTprgBkDYFsTQ2kbS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1bCE%2FdJMcadW96E2%2FQvvMwTprgBkDYFsTQ2kbS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;702&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기입한 이메일 주소로 도착한 &lt;b&gt;인증 코드를 입력&lt;/b&gt;하여 플레이어를 인증한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WCUUa/dJMcagfhbFG/pSpNXsdQBlKua8oxqDA9Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WCUUa/dJMcagfhbFG/pSpNXsdQBlKua8oxqDA9Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WCUUa/dJMcagfhbFG/pSpNXsdQBlKua8oxqDA9Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWCUUa%2FdJMcagfhbFG%2FpSpNXsdQBlKua8oxqDA9Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;90&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로&lt;b&gt; DynamoDB의 Players 테이블&lt;/b&gt;에서 위와 같이&lt;b&gt; 데이터가 추가&lt;/b&gt;된 것을 확인할 수 있다&lt;/p&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1357</guid>
      <comments>https://monstrosite.tistory.com/1357#entry1357comment</comments>
      <pubDate>Fri, 24 Jul 2026 15:26:34 +0900</pubDate>
    </item>
    <item>
      <title>Dynamo DB - 1) 플레이어 데이터 테이블</title>
      <link>https://monstrosite.tistory.com/1356</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서 제공하는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;서버리스 기반&lt;/span&gt;의 &lt;span style=&quot;color: #ee2323;&quot;&gt;초고속&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;완전관리&lt;/span&gt;형 &lt;span style=&quot;color: #ee2323;&quot;&gt;NoSQL&lt;/span&gt; 데이터베이스인 &lt;span style=&quot;color: #ee2323;&quot;&gt;Dynamo DB&lt;/span&gt;를 사용&lt;/b&gt;하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;플레이어&lt;/span&gt;에 관한 데이터를 &lt;span style=&quot;color: #ee2323;&quot;&gt;관리&lt;/span&gt; + &lt;span style=&quot;color: #ee2323;&quot;&gt;수정&lt;/span&gt; + &lt;span style=&quot;color: #ee2323;&quot;&gt;저장&lt;/span&gt;&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;GameLift&lt;/span&gt;가 Game Session을 &lt;span style=&quot;color: #ee2323;&quot;&gt;배포&lt;/span&gt; + &lt;span style=&quot;color: #ee2323;&quot;&gt;확장&lt;/span&gt; + &lt;span style=&quot;color: #ee2323;&quot;&gt;호스팅&lt;/span&gt;하는 역할&lt;/b&gt;을 수행한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;DynamoDB&lt;/span&gt;는 Game Session 안과 밖에서 발생하는&lt;span style=&quot;color: #ee2323;&quot;&gt; 막대한 데이터&lt;/span&gt;를 &lt;span style=&quot;color: #ee2323;&quot;&gt;관리&lt;/span&gt;하는 용도&lt;/b&gt;로 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 구성&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 데이터 테이블의 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKjkt8/dJMcajpqkcS/DxiSCjJXIH7khpicyP60bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKjkt8/dJMcajpqkcS/DxiSCjJXIH7khpicyP60bk/img.png&quot; data-alt=&quot;Dynamo DB의 테이블 생성 - 테이블 세부 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKjkt8/dJMcajpqkcS/DxiSCjJXIH7khpicyP60bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKjkt8%2FdJMcajpqkcS%2FDxiSCjJXIH7khpicyP60bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1860&quot; height=&quot;555&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dynamo DB의 테이블 생성 - 테이블 세부 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성할 Dynamo DB의 &lt;span style=&quot;color: #ef5369;&quot;&gt;테이블 이름&lt;/span&gt;과 &lt;span style=&quot;color: #ef5369;&quot;&gt;파티션 키&lt;/span&gt;&lt;/b&gt;를 위와 같이 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세부 정보에서&lt;b&gt; 적용할 수 있는 설정&lt;/b&gt;은 다음과 같다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;테이블 이름&lt;/span&gt; : 테이블의 &lt;span style=&quot;color: #ef5369;&quot;&gt;고유 이름&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;파티션 키&lt;/span&gt; : 생성할 테이블의 데이터를 &lt;span style=&quot;color: #ef5369;&quot;&gt;여러 물리적 서버(파티션)&lt;/span&gt;로 &lt;span style=&quot;color: #ef5369;&quot;&gt;나누어 저장&lt;/span&gt;할 때 &lt;span style=&quot;color: #ef5369;&quot;&gt;기준&lt;/span&gt;이 되는 키 &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;정렬 키&lt;/span&gt; : &lt;span style=&quot;color: #ef5369;&quot;&gt;동일한 물리적 서버(파티션)&lt;/span&gt; 안에서 데이터를 &lt;span style=&quot;color: #ef5369;&quot;&gt;정렬하는 기준&lt;/span&gt;이 되는 &lt;span style=&quot;color: #ef5369;&quot;&gt;키&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxMCZp/dJMcacRpPDr/31LynrWhipyw17uC28KQh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxMCZp/dJMcacRpPDr/31LynrWhipyw17uC28KQh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxMCZp/dJMcacRpPDr/31LynrWhipyw17uC28KQh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxMCZp%2FdJMcacRpPDr%2F31LynrWhipyw17uC28KQh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1537&quot; height=&quot;197&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 설정은 &lt;b&gt;기본값으로 설정&lt;/b&gt;한 후에 최종적으로 위와 같이 &lt;b&gt;Players 테이블&lt;/b&gt;이 생성되었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 데이터 테이블에 대한 작업 - 데이터 탐색&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6t9vL/dJMcaa7gCzi/JkxLFdkw9MCIUpva31x2I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6t9vL/dJMcaa7gCzi/JkxLFdkw9MCIUpva31x2I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6t9vL/dJMcaa7gCzi/JkxLFdkw9MCIUpva31x2I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6t9vL%2FdJMcaa7gCzi%2FJkxLFdkw9MCIUpva31x2I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1117&quot; height=&quot;491&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 Players 테이블에 대해 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;항목 스캔&lt;/span&gt; 또는 &lt;span style=&quot;color: #006dd7;&quot;&gt;쿼리&lt;/span&gt;를 사용하여 데이터를 탐색&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 방식은 각각 &lt;b&gt;다음의 차이가 존재&lt;/b&gt;한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;항목 스캔&lt;/span&gt; : 테이블의 &lt;span style=&quot;color: #006dd7;&quot;&gt;전체 데이터&lt;/span&gt;를 &lt;span style=&quot;color: #006dd7;&quot;&gt;끝까지&lt;/span&gt; 순회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;쿼리&lt;/span&gt; : &lt;span style=&quot;color: #006dd7;&quot;&gt;파티션 키&lt;/span&gt;를 사용하여 &lt;span style=&quot;color: #006dd7;&quot;&gt;특정 데이터&lt;/span&gt;만 탐색&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이&lt;b&gt; 탐색 방식에 차이점&lt;/b&gt;이 있으므로 &lt;b&gt;다음과 같이 사용&lt;/b&gt;하는 것이 권장된다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;실시간 게임 서비스&lt;/span&gt; 및 &lt;span style=&quot;color: #006dd7;&quot;&gt;일반적인 백엔드 API&lt;/span&gt; 처리 - &lt;span style=&quot;color: #006dd7;&quot;&gt;쿼리&lt;/span&gt;를 사용&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;전체 데이터 백업&lt;/span&gt;이나 &lt;span style=&quot;color: #006dd7;&quot;&gt;일괄 분석 작업&lt;/span&gt;과 같은 특정 관리 목적 - &lt;span style=&quot;color: #006dd7;&quot;&gt;항목 스캔&lt;/span&gt; 사용&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3) 데이터 테이블에 대한 작업 - 데이터 추가 및 삭제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYOdIJ/dJMcadW9FqM/Qywouoy0bcesVCHMk0O8kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYOdIJ/dJMcadW9FqM/Qywouoy0bcesVCHMk0O8kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYOdIJ/dJMcadW9FqM/Qywouoy0bcesVCHMk0O8kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYOdIJ%2FdJMcadW9FqM%2FQywouoy0bcesVCHMk0O8kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1067&quot; height=&quot;227&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 Players 테이블에 대해 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;항목 생성&lt;/span&gt;을 선택&lt;/b&gt;하여&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt; 속성 - 값(Key - Value)&lt;/span&gt;의 데이터를 추가&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbeaLr/dJMcafHuZGE/8sfeYCu3pMNHh8knOKEwUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbeaLr/dJMcafHuZGE/8sfeYCu3pMNHh8knOKEwUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbeaLr/dJMcafHuZGE/8sfeYCu3pMNHh8knOKEwUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbeaLr%2FdJMcafHuZGE%2F8sfeYCu3pMNHh8knOKEwUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1612&quot; height=&quot;442&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가할 &lt;b&gt;속성 - 값의 쌍에 대한 &lt;span style=&quot;color: #0593d3;&quot;&gt;속성의 유형&lt;/span&gt;을 정의&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzdAxX/dJMcaidaOXx/TuK8hOcQ1nqv4vq4WmeApK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzdAxX/dJMcaidaOXx/TuK8hOcQ1nqv4vq4WmeApK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzdAxX/dJMcaidaOXx/TuK8hOcQ1nqv4vq4WmeApK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzdAxX%2FdJMcaidaOXx%2FTuK8hOcQ1nqv4vq4WmeApK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1062&quot; height=&quot;121&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 위와 같이 구성된 데이터 테이블을 생성하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 테이블에서&lt;b&gt; 속성을 선택하여 제거하는 작업&lt;/b&gt;도 &lt;b&gt;가능&lt;/b&gt;하다&lt;/p&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1356</guid>
      <comments>https://monstrosite.tistory.com/1356#entry1356comment</comments>
      <pubDate>Fri, 24 Jul 2026 11:04:06 +0900</pubDate>
    </item>
    <item>
      <title>PlayerSession 처리 - 최종) UI를 통한 게임에 접속한 플레이어 표시</title>
      <link>https://monstrosite.tistory.com/1355</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비에 &lt;span style=&quot;color: #ee2323;&quot;&gt;UI&lt;/span&gt;를 추가하여 한 게임의 &lt;span style=&quot;color: #ee2323;&quot;&gt;GameSession&lt;/span&gt;에 &lt;span style=&quot;color: #ee2323;&quot;&gt;접속하는 플레이어들&lt;/span&gt;을 표시&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 스크립트 작업&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) LobbyState 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhBfSQ/dJMcag7m9D8/3ynACvkru5IGwgoIDkymXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhBfSQ/dJMcag7m9D8/3ynACvkru5IGwgoIDkymXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhBfSQ/dJMcag7m9D8/3ynACvkru5IGwgoIDkymXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhBfSQ%2FdJMcag7m9D8%2F3ynACvkru5IGwgoIDkymXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;30&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nKjJg/dJMcaalKPjM/Esv7aq6I4xlrj8INgfpTh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nKjJg/dJMcaalKPjM/Esv7aq6I4xlrj8INgfpTh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nKjJg/dJMcaalKPjM/Esv7aq6I4xlrj8INgfpTh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKjJg%2FdJMcaalKPjM%2FEsv7aq6I4xlrj8INgfpTh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;87&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GetPlayers 함수&lt;/b&gt;를 추가하여 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;PlayerInfoArray&lt;/span&gt;로부터 &lt;span style=&quot;color: #ef5369;&quot;&gt;Players&lt;/span&gt; 변수를 반환&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) PlayerLabel 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnzUF6/dJMcaf8qwzk/I0gd0jxNKd5UMHH02vPLRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnzUF6/dJMcaf8qwzk/I0gd0jxNKd5UMHH02vPLRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnzUF6/dJMcaf8qwzk/I0gd0jxNKd5UMHH02vPLRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnzUF6%2FdJMcaf8qwzk%2FI0gd0jxNKd5UMHH02vPLRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;277&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게임에 접속하는 &lt;span style=&quot;color: #006dd7;&quot;&gt;플레이어&lt;/span&gt;에 대한&lt;span style=&quot;color: #006dd7;&quot;&gt; 한 개의 행&lt;/span&gt;을 의미&lt;/b&gt;하는 &lt;b&gt;PlayerLabel 클래스&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멤버변수의 구성&lt;/b&gt;은 위와 같다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;TexyBlock_UserName&lt;/span&gt; 멤버변수 : 플레이어의 &lt;span style=&quot;color: #006dd7;&quot;&gt;이름&lt;/span&gt;을 보여주는 &lt;span style=&quot;color: #006dd7;&quot;&gt;TextBlock&lt;/span&gt; UI&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHeRAn/dJMcafU0TkU/mIM6WVxydPXwKirE6FJhEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHeRAn/dJMcafU0TkU/mIM6WVxydPXwKirE6FJhEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHeRAn/dJMcafU0TkU/mIM6WVxydPXwKirE6FJhEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHeRAn%2FdJMcafU0TkU%2FmIM6WVxydPXwKirE6FJhEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;177&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;TextBlock UI&lt;/span&gt;에 대한 2개의 함수&lt;/b&gt;를 정의한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SetUserName 함수&lt;/b&gt;를 호출하여 &lt;b&gt;TextBlock UI의 텍스트를 &lt;span style=&quot;color: #006dd7;&quot;&gt;설정&lt;/span&gt;&lt;/b&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GetUserName 함수&lt;/b&gt;를 호출하여&lt;b&gt; TextBlock UI의 텍스트를 &lt;span style=&quot;color: #006dd7;&quot;&gt;가져&lt;/span&gt;&lt;/b&gt;온다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) LobbyPlayerBox 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFK45/dJMcagGpHtA/Oeh5jCg6jKcgH0iGv0cFY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFK45/dJMcagGpHtA/Oeh5jCg6jKcgH0iGv0cFY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFK45/dJMcagGpHtA/Oeh5jCg6jKcgH0iGv0cFY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFK45%2FdJMcagGpHtA%2FOeh5jCg6jKcgH0iGv0cFY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;620&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabel&lt;/span&gt;을 담고 있는 &lt;span style=&quot;color: #0593d3;&quot;&gt;박스&lt;/span&gt;의 역할을 수행하는 LobbyPlayerBox 클래스&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멤버변수의 구성&lt;/b&gt;은 위와 같다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;ScrollBox_PlayerInfo&lt;/span&gt; 멤버변수 : PlayerLabel을 담고 있는 &lt;span style=&quot;color: #0593d3;&quot;&gt;Scroll Box UI&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabelClass&lt;/span&gt; 멤버변수 : 표현할 &lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabel&lt;/span&gt;의 &lt;span style=&quot;color: #0593d3;&quot;&gt;Subclass&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMagKP/dJMcahedJin/tuu3uetZKjrbv2gPDJyYs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMagKP/dJMcahedJin/tuu3uetZKjrbv2gPDJyYs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMagKP/dJMcahedJin/tuu3uetZKjrbv2gPDJyYs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMagKP%2FdJMcahedJin%2Ftuu3uetZKjrbv2gPDJyYs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;257&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FindPlayerLabel 함수&lt;/b&gt;를 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;스크롤 박스&lt;/span&gt; 안에 있는 &lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabel&lt;/span&gt;을 가져와 &lt;span style=&quot;color: #0593d3;&quot;&gt;인자로 받은 플레이어의 이름&lt;/span&gt;에 대한 PlayerLabel을 반환&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vhZ3b/dJMcadiBlM9/TiudICpkKnaOBKnG685gfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vhZ3b/dJMcadiBlM9/TiudICpkKnaOBKnG685gfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vhZ3b/dJMcadiBlM9/TiudICpkKnaOBKnG685gfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvhZ3b%2FdJMcadiBlM9%2FTiudICpkKnaOBKnG685gfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;135&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OnPlayerRemoved 함수&lt;/b&gt;를 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;인자로 받은 LobbyPlayerInfo의 플레이어&lt;/span&gt;에 대한 &lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabel&lt;/span&gt;을 스크롤 박스에서 제거&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjRXOF/dJMcaiKRvyD/G8RyCs8b5MoSWRFVXPH0f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjRXOF/dJMcaiKRvyD/G8RyCs8b5MoSWRFVXPH0f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjRXOF/dJMcaiKRvyD/G8RyCs8b5MoSWRFVXPH0f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjRXOF%2FdJMcaiKRvyD%2FG8RyCs8b5MoSWRFVXPH0f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;302&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CreateAndAddPlayerLabel 함수&lt;/b&gt;의 로직을 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새로운 &lt;span style=&quot;color: #0593d3;&quot;&gt;PlayerLabel&lt;/span&gt;을 생성하고 &lt;span style=&quot;color: #0593d3;&quot;&gt;스크롤 박스&lt;/span&gt;에 추가&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WSNxh/dJMcahk1qBg/IfDESfkDAVKM3P0IBPkRBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WSNxh/dJMcahk1qBg/IfDESfkDAVKM3P0IBPkRBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WSNxh/dJMcahk1qBg/IfDESfkDAVKM3P0IBPkRBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWSNxh%2FdJMcahk1qBg%2FIfDESfkDAVKM3P0IBPkRBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;160&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UpdatePlayerInfo 함수&lt;/b&gt;를 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스크롤 박스에 저장된 &lt;span style=&quot;color: #0593d3;&quot;&gt;다른 UI들&lt;/span&gt;을 초기화&lt;/b&gt;하고&amp;nbsp;&lt;b&gt;현재 로비에 &lt;span style=&quot;color: #0593d3;&quot;&gt;존재하는 플레이어&lt;/span&gt;에 대한 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;LobbyPlayerInfo&lt;/span&gt;만큼 순회&lt;/b&gt;하면서&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt; PlayerLabel&lt;/span&gt;을 생성하고 스크롤 박스에 추가&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSAF89/dJMcaijRqnt/eQZtbzK0DWPBDn1HRWib9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSAF89/dJMcaijRqnt/eQZtbzK0DWPBDn1HRWib9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSAF89/dJMcaijRqnt/eQZtbzK0DWPBDn1HRWib9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSAF89%2FdJMcaijRqnt%2FeQZtbzK0DWPBDn1HRWib9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;212&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OnLobbyStateInitialized 함수&lt;/b&gt;를 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인자로 받은 &lt;span style=&quot;color: #0593d3;&quot;&gt;LobbyState&lt;/span&gt;의 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnPlayerInfoAdded&lt;/span&gt;와 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnPlayerInfoRemoved&lt;/span&gt;에 필요한 멤버 함수를 바인드&lt;/b&gt;하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비에 플레이어가 &lt;span style=&quot;color: #0593d3;&quot;&gt;입장&lt;/span&gt; / &lt;span style=&quot;color: #0593d3;&quot;&gt;퇴장&lt;/span&gt;하면 &lt;span style=&quot;color: #0593d3;&quot;&gt;CreateAndAddPlayerLabel&lt;/span&gt; 함수와 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnPlayerRemoved&lt;/span&gt; 함수를 호출&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddNzOX/dJMcahrLVTh/7kSPdGKsnBpkM4lo9ugzB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddNzOX/dJMcahrLVTh/7kSPdGKsnBpkM4lo9ugzB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddNzOX/dJMcahrLVTh/7kSPdGKsnBpkM4lo9ugzB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddNzOX%2FdJMcahrLVTh%2F7kSPdGKsnBpkM4lo9ugzB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;360&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위젯 생성 후에 &lt;span style=&quot;color: #0593d3;&quot;&gt;한번만 호출&lt;/span&gt;하는 NativeOnInitialized 함수&lt;/b&gt;를 위와 같이 오버라이드한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DSGameState의 &lt;span style=&quot;color: #0593d3;&quot;&gt;LobbyState&lt;/span&gt;를 가져와 &lt;span style=&quot;color: #0593d3;&quot;&gt;유효한지&lt;/span&gt; 체크&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;유효하다&lt;/span&gt;면 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnLobbyStateInitialized&lt;/span&gt; 함수에 &lt;span style=&quot;color: #0593d3;&quot;&gt;LobbyState&lt;/span&gt;를 인자로 넘&lt;/b&gt;겨준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;유효하지 않다&lt;/span&gt;면 DSGameState의 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnLobbyStateInitialized&lt;/span&gt; 델리게이트에 &lt;span style=&quot;color: #0593d3;&quot;&gt;OnLobbyStateInitialized&lt;/span&gt; 함수를 연결&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) DS_LobbyGameMode 클래스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/prXGi/dJMcaiRHK7W/ZEfX6t953yxdkss2kULl8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/prXGi/dJMcaiRHK7W/ZEfX6t953yxdkss2kULl8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/prXGi/dJMcaiRHK7W/ZEfX6t953yxdkss2kULl8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FprXGi%2FdJMcaiRHK7W%2FZEfX6t953yxdkss2kULl8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;781&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CancleCountdown 멤버함수를 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;CheckAndStopLobbyCountdown&lt;/span&gt; 함수로 변경&lt;/b&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이&lt;b&gt; 3개의 새로운 함수를 추가&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PeUs7/dJMcag7naS6/NSNunTFwg3wTpM7NDyIroK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PeUs7/dJMcag7naS6/NSNunTFwg3wTpM7NDyIroK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PeUs7/dJMcag7naS6/NSNunTFwg3wTpM7NDyIroK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPeUs7%2FdJMcag7naS6%2FNSNunTFwg3wTpM7NDyIroK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;164&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CheckAndStopLobbyCountdown 함수&lt;/b&gt;를 위와 같이 &lt;b&gt;이름을 변경&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIOvr7/dJMcaidaol9/ZQokCAbKxl8QpSMKOq21N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIOvr7/dJMcaidaol9/ZQokCAbKxl8QpSMKOq21N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIOvr7/dJMcaidaol9/ZQokCAbKxl8QpSMKOq21N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIOvr7%2FdJMcaidaol9%2FZQokCAbKxl8QpSMKOq21N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;177&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CheckAndStartLobbyCountdown 함수&lt;/b&gt;를 위와 같이 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비의 상태를 &lt;span style=&quot;color: #009a87;&quot;&gt;Seamless Travel&lt;/span&gt; 상태로 변경하고&lt;span style=&quot;color: #009a87;&quot;&gt; 카운트다운을 시작&lt;/span&gt;하는 기존 함수들의 로직을 함수로 구성&lt;/b&gt;하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNUFna/dJMcafAF6bE/9NUVQBF7YPHgM7k0pR6Ni0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNUFna/dJMcafAF6bE/9NUVQBF7YPHgM7k0pR6Ni0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNUFna/dJMcafAF6bE/9NUVQBF7YPHgM7k0pR6Ni0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNUFna%2FdJMcafAF6bE%2F9NUVQBF7YPHgM7k0pR6Ni0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;195&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AddPlayerInfoToLobbyState 함수&lt;/b&gt;의 로직을 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인자로 받은 플레이어에 대한 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyPlayerInfo&lt;/span&gt;를 &lt;span style=&quot;color: #009a87;&quot;&gt;DSGameState&lt;/span&gt;의 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyState&lt;/span&gt;에 저장&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEEu8/dJMcafU0Uo8/iU0kz01B87Zko4k3N564GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEEu8/dJMcafU0Uo8/iU0kz01B87Zko4k3N564GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEEu8/dJMcafU0Uo8/iU0kz01B87Zko4k3N564GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEEu8%2FdJMcafU0Uo8%2FiU0kz01B87Zko4k3N564GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;170&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RemovePlayerInfoFromLobbyState 함수&lt;/b&gt;의 로직을 위와 같이 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;DSGameState&lt;/span&gt;의 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyState&lt;/span&gt;에서 인자로 받은 플레이어에 대한 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyPlayerInfo&lt;/span&gt;를 제거&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF0VD1/dJMcahedKrX/H0zbGaHgAZkjwkVkR0H2BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF0VD1/dJMcahedKrX/H0zbGaHgAZkjwkVkR0H2BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF0VD1/dJMcahedKrX/H0zbGaHgAZkjwkVkR0H2BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF0VD1%2FdJMcahedKrX%2FH0zbGaHgAZkjwkVkR0H2BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;212&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;InitSeamlessTravelPlayer 함수&lt;/b&gt;에 위와 같이 로직을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;CheckAndStartLobbyCountdown&lt;/span&gt; 함수를 호출&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Seamless Travel&lt;/span&gt;에 대한 카운트다운을 시작&lt;/b&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;AddPlayerInfoToLobbyState&lt;/span&gt; 함수를 호출&lt;/b&gt;하여 &lt;b&gt;새로운 맵에 대해 &lt;span style=&quot;color: #009a87;&quot;&gt;재설정된&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;플레이어&lt;/span&gt;에 대한 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyPlayerInfo&lt;/span&gt;를 저장&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/83yf2/dJMcabSwStx/66VYNmtCIt56yGFeVkLLhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/83yf2/dJMcabSwStx/66VYNmtCIt56yGFeVkLLhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/83yf2/dJMcabSwStx/66VYNmtCIt56yGFeVkLLhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F83yf2%2FdJMcabSwStx%2F66VYNmtCIt56yGFeVkLLhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;252&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Logout 함수&lt;/b&gt;에 위와 같이 로직을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;CheckAndStopLobbyCountdown&lt;/span&gt; 함수를 호출&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;로비 상태&lt;/span&gt;를 변경하고 카운트다운을&lt;span style=&quot;color: #009a87;&quot;&gt; 중단&lt;/span&gt;&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; 로비 상태&lt;/span&gt;가 변경되었다면 &lt;span style=&quot;color: #009a87;&quot;&gt;RemovePlayerInfoFromLobbyState&lt;/span&gt; 함수를 호출&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bosQQu/dJMcaaGclfU/kWsZzblkEOB71ltnzG8JKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bosQQu/dJMcaaGclfU/kWsZzblkEOB71ltnzG8JKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bosQQu/dJMcaaGclfU/kWsZzblkEOB71ltnzG8JKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbosQQu%2FdJMcaaGclfU%2FkWsZzblkEOB71ltnzG8JKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;117&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PostLogin 함수&lt;/b&gt;에서 &lt;b&gt;CheckAndStartLobbyCountdown 함수를 호출&lt;/b&gt;하도록 수정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2w5FM/dJMcaazoyBY/H8Y3nb4RsviWk0KKsAK5Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2w5FM/dJMcaazoyBY/H8Y3nb4RsviWk0KKsAK5Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2w5FM/dJMcaazoyBY/H8Y3nb4RsviWk0KKsAK5Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2w5FM%2FdJMcaazoyBY%2FH8Y3nb4RsviWk0KKsAK5Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1205&quot; height=&quot;382&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;새로 접속한 플레이어&lt;/span&gt;의 PlayerController가 &lt;span style=&quot;color: #009a87;&quot;&gt;생성된 후에 호출&lt;/span&gt;하는 InitNewPlayer 함수&lt;/b&gt;에 로직을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비의 상태가 &lt;span style=&quot;color: #009a87;&quot;&gt;Seamless Travel&lt;/span&gt;이 아니라면,&amp;nbsp; &lt;span style=&quot;color: #009a87;&quot;&gt;AddPlayerInfoToLobbyState&lt;/span&gt; 함수를 호출&lt;/b&gt;하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;접속한 플레이어&lt;/span&gt;에게 생성된 &lt;span style=&quot;color: #009a87;&quot;&gt;PlayerController&lt;/span&gt;의 &lt;span style=&quot;color: #009a87;&quot;&gt;LobbyPlayerInfo&lt;/span&gt;를 저장&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 블루프린트 작업&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) WBP_LobbyPlayerLabel 위젯 블루프린트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LiKja/dJMcagTTAxY/iOYwq3GrkbKDusHjkCimOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LiKja/dJMcagTTAxY/iOYwq3GrkbKDusHjkCimOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LiKja/dJMcagTTAxY/iOYwq3GrkbKDusHjkCimOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiKja%2FdJMcagTTAxY%2FiOYwq3GrkbKDusHjkCimOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1285&quot; height=&quot;135&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구성된&lt;b&gt; PlayerLabel 위젯 블루프린트&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하위 UI의 이름&lt;/b&gt;을 클래스의 &lt;b&gt;멤버변수 이름&lt;/b&gt;과 통일한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) WBP_LobbyPlayerBox 위젯 블루프린트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3U6SE/dJMcabSwSLb/YC0jRdKrFT52Wa8HpKOo5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3U6SE/dJMcabSwSLb/YC0jRdKrFT52Wa8HpKOo5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3U6SE/dJMcabSwSLb/YC0jRdKrFT52Wa8HpKOo5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3U6SE%2FdJMcabSwSLb%2FYC0jRdKrFT52Wa8HpKOo5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;467&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1)에서 생성한 위젯 블루프린트를 포함하는 PlayerBox 위젯 블루프린트&lt;/b&gt;를 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일하게 &lt;b&gt;하위 UI의 이름&lt;/b&gt;과 클래스의 &lt;b&gt;멤버변수 이름&lt;/b&gt;을 통일하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lM7xj/dJMcadbGqyF/uzrDBzLMFYomqa56mLuH3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lM7xj/dJMcadbGqyF/uzrDBzLMFYomqa56mLuH3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lM7xj/dJMcadbGqyF/uzrDBzLMFYomqa56mLuH3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlM7xj%2FdJMcadbGqyF%2FuzrDBzLMFYomqa56mLuH3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;67&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PlayerLabelClass 멤버변수&lt;/b&gt;를 &lt;b&gt;1)에서 생성한 위젯 블루프린트&lt;/b&gt;로 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) WBP_LobbyOverlay 위젯 블루프린트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/culodU/dJMcaixqa6i/6qWHhk4X4feYtVo8pN7kI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/culodU/dJMcaixqa6i/6qWHhk4X4feYtVo8pN7kI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/culodU/dJMcaixqa6i/6qWHhk4X4feYtVo8pN7kI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FculodU%2FdJMcaixqa6i%2F6qWHhk4X4feYtVo8pN7kI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;816&quot; height=&quot;471&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비에서 사용&lt;/b&gt;하는 &lt;b&gt;Overlay 위젯 블루프린트&lt;/b&gt;에 &lt;b&gt;2)에서 생성한 위젯 블루프린트&lt;/b&gt;를 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) BP_LobbyGameMode 블루프린트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rwWOf/dJMb991ym7Y/wdApIn6EkTF3zQozKDk5jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rwWOf/dJMb991ym7Y/wdApIn6EkTF3zQozKDk5jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rwWOf/dJMb991ym7Y/wdApIn6EkTF3zQozKDk5jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrwWOf%2FdJMb991ym7Y%2FwdApIn6EkTF3zQozKDk5jK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;297&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로비 레벨에서의 GameMode&lt;/b&gt;에서 &lt;b&gt;사용할 GameState의 클래스&lt;/b&gt;를 위와 같이 설정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;pre id=&quot;code_1784801595415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1) 토큰 발급
aws gamelift get-compute-auth-token ^
--fleet-id &quot;플릿 ID&quot; ^
--compute-name &quot;컴퓨팅 자원 이름&quot; ^
--region &quot;사용중인 리전&quot; ^
--profile &quot;프로필 이름&quot; // 해당 옵션은 필요한 경우 사용

# 2) 발급된 토큰을 사용하여 서버 exe 파일 실행
&quot;경로\Build\Build_5\운영체제Server\프로젝트Server.exe&quot; -log -glAnywhere ^
-glAnywhereAuthToken=&quot;발급된토큰&quot; ^
-glAnywhereHostId=&quot;컴퓨팅 자원 이름&quot; ^
-glAnywhereFleetId=&quot;플릿 ID&quot; ^
-glAnywhereWebSocketUrl=&quot;리전에 따른 소켓 URL&quot; ^
-port=7777 // 기본 포트번호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프로젝트를 패키징하여 &lt;b&gt;Build_5 폴더&lt;/b&gt;에 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키징이 끝난 후에 위와 같이 명령어를 입력하여 &lt;b&gt;서버 exe 파일을 실행&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2026-07-23 16-29-58-104 (1).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDQAXn/dJMcaae5JfZ/foWkwFYYsIoGTADb3NW961/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDQAXn/dJMcaae5JfZ/foWkwFYYsIoGTADb3NW961/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDQAXn/dJMcaae5JfZ/foWkwFYYsIoGTADb3NW961/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bDQAXn/dJMcaae5JfZ/foWkwFYYsIoGTADb3NW961/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;361&quot; data-filename=&quot;bandicam 2026-07-23 16-29-58-104 (1).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트</category>
      <category>AWS를 활용한 FPS 게임</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1355</guid>
      <comments>https://monstrosite.tistory.com/1355#entry1355comment</comments>
      <pubDate>Thu, 23 Jul 2026 19:14:44 +0900</pubDate>
    </item>
    <item>
      <title>로컬 좌표를 사용한 구 바운딩 볼륨 생성</title>
      <link>https://monstrosite.tistory.com/1354</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jaxjj/dJMcabLSCtb/NLGrFfKXMXzCvzs6jwBwO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jaxjj/dJMcabLSCtb/NLGrFfKXMXzCvzs6jwBwO0/img.png&quot; data-alt=&quot;Render3D 함수의 로직 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jaxjj/dJMcabLSCtb/NLGrFfKXMXzCvzs6jwBwO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaxjj%2FdJMcabLSCtb%2FNLGrFfKXMXzCvzs6jwBwO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;96&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Render3D 함수의 로직 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절두체 컬링에 사용하는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;구 바운딩 볼륨&lt;/span&gt;은 &lt;span style=&quot;color: #ee2323;&quot;&gt;로컬 좌표&lt;/span&gt;를 기준으로 생성되는 데이터&lt;/b&gt;다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;절두체 컬링&lt;/span&gt;은 &lt;span style=&quot;color: #ee2323;&quot;&gt;뷰 공간&lt;/span&gt;에서 수행&lt;/b&gt;된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이전에 &lt;b&gt;수동으로 로컬 좌표로 저장된 &lt;span style=&quot;color: #ee2323;&quot;&gt;구 바운딩 볼륨&lt;/span&gt;을 &lt;span style=&quot;color: #ee2323;&quot;&gt;뷰 공간&lt;/span&gt;으로 변환&lt;/b&gt;하여 절두체 컬링을 진행하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 매번 로컬 공간에 저장된 바운딩 볼륨을 뷰 공간으로 변환하는 작업은 다소 불편하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;이를 개선하여 &lt;span style=&quot;color: #ee2323;&quot;&gt;로컬 공간의 데이터&lt;/span&gt;로 바로 절두체 컬링을 진행&lt;/b&gt;하도록 수정한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개선 : 로컬 공간의 데이터를 활용한 바운딩 볼륨의 생성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUsP47/dJMcafUZYFz/DM0q8grrx98rPgEASUWQd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUsP47/dJMcafUZYFz/DM0q8grrx98rPgEASUWQd1/img.png&quot; data-alt=&quot;원근 투영 행렬을 사용한 평면의 방정식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUsP47/dJMcafUZYFz/DM0q8grrx98rPgEASUWQd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUsP47%2FdJMcafUZYFz%2FDM0q8grrx98rPgEASUWQd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;122&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원근 투영 행렬을 사용한 평면의 방정식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰 공간에서의 영역 판정을 위해 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;원근 투영 행렬&lt;/span&gt;을 사용하여 &lt;span style=&quot;color: #ef5369;&quot;&gt;평면의 방정식&lt;/span&gt;을 생성&lt;/b&gt;할 수 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 &lt;b&gt;사용한 &lt;span style=&quot;color: #ef5369;&quot;&gt;원근 투영 행렬&lt;/span&gt;을 &lt;span style=&quot;color: #ef5369;&quot;&gt;P&lt;/span&gt;로, &lt;span style=&quot;color: #ef5369;&quot;&gt;클립 공간의 좌표&lt;/span&gt;를 &lt;span style=&quot;color: #ef5369;&quot;&gt;V(clip)&lt;/span&gt;으로, &lt;span style=&quot;color: #ef5369;&quot;&gt;뷰 공간의 좌표&lt;/span&gt;를 &lt;span style=&quot;color: #ef5369;&quot;&gt;V(view)&lt;/span&gt;로 표시&lt;/b&gt;하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 수식을 정리할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJiM0/dJMcafHtCWq/IsDRxcDVmgnlmRaK8KOkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJiM0/dJMcafHtCWq/IsDRxcDVmgnlmRaK8KOkq0/img.png&quot; data-alt=&quot;위 식에서 뷰 행렬과 모델링 행렬을 사용한 복합 행렬과 로컬 공간의 좌표를 사용한 버전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJiM0/dJMcafHtCWq/IsDRxcDVmgnlmRaK8KOkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJiM0%2FdJMcafHtCWq%2FIsDRxcDVmgnlmRaK8KOkq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;112&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 식에서 뷰 행렬과 모델링 행렬을 사용한 복합 행렬과 로컬 공간의 좌표를 사용한 버전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;P&lt;/span&gt; 행렬을 구성하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;행벡터&lt;/span&gt;를 사용하여 각 &lt;span style=&quot;color: #ef5369;&quot;&gt;평면의 방정식&lt;/span&gt;을 추출&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 뷰 공간의 좌표가 아닌 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;로컬 공간의 좌표&lt;/span&gt;를 의미하는&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;V(local)&lt;/span&gt;을 사용&lt;/b&gt;한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;모델링 행렬&lt;/span&gt;을 의미하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;M&lt;/span&gt; 행렬과 &lt;span style=&quot;color: #ef5369;&quot;&gt;뷰 행렬&lt;/span&gt;을 의미하는 &lt;span style=&quot;color: #ef5369;&quot;&gt;V&lt;/span&gt; 행렬을 사용&lt;/b&gt;하여 위와 같이 &lt;b&gt;수식을 수정&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 식에서 &lt;b&gt;세 개의 행렬을 곱한 &lt;span style=&quot;color: #ef5369;&quot;&gt;PVM&lt;/span&gt; 행렬은 &lt;span style=&quot;color: #ef5369;&quot;&gt;4X4&lt;/span&gt; 행렬&lt;/b&gt;이므로 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;행벡터&lt;/span&gt;를 사용하여 &lt;span style=&quot;color: #ef5369;&quot;&gt;평면의 방정식&lt;/span&gt;을 생성&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평면의 방정식을 통해 &lt;b&gt;만들어진 평면은 &lt;span style=&quot;color: #ef5369;&quot;&gt;로컬 공간의 평면&lt;/span&gt;이 되므로&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;b&gt; 로컬 공간의 &lt;span style=&quot;color: #ef5369;&quot;&gt;바운딩 볼륨 정보&lt;/span&gt;로 &lt;span style=&quot;color: #ef5369;&quot;&gt;절두체 컬링&lt;/span&gt;을 수행하는 것이 가능&lt;/b&gt;하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 예제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Rk7V/dJMcaic9raj/IdKz4JR2l4MbIOy2YIMs10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Rk7V/dJMcaic9raj/IdKz4JR2l4MbIOy2YIMs10/img.png&quot; data-alt=&quot;Render3D 함수의 로직 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Rk7V/dJMcaic9raj/IdKz4JR2l4MbIOy2YIMs10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Rk7V%2FdJMcaic9raj%2FIdKz4JR2l4MbIOy2YIMs10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;877&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Render3D 함수의 로직 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링을 수행하는 &lt;b&gt;Render3D 함수&lt;/b&gt;의 로직을 위와 같이 구성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;원근 투영 행렬&lt;/span&gt;과 &lt;span style=&quot;color: #006dd7;&quot;&gt;뷰 행렬&lt;/span&gt;이 결합된 &lt;span style=&quot;color: #006dd7;&quot;&gt;pvMatrix&lt;/span&gt; 로컬 변수에&lt;span style=&quot;color: #006dd7;&quot;&gt; 모델링 행렬&lt;/span&gt;을 곱&lt;/b&gt;하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;최종 행렬&lt;/span&gt;을 의미하는 &lt;span style=&quot;color: #006dd7;&quot;&gt;finalMatrix&lt;/span&gt; 로컬 변수를 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;finalMatrix 로컬 변수로부터 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Transpose&lt;/span&gt; 함수를 호출하여 &lt;span style=&quot;color: #006dd7;&quot;&gt;전치&lt;/span&gt;시킨 후에 &lt;span style=&quot;color: #006dd7;&quot;&gt;행벡터&lt;/span&gt;에 접근&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전치된 행렬로부터 절두체를 구성하는 &lt;span style=&quot;color: #006dd7;&quot;&gt;6개의 평면&lt;/span&gt;을 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 절두체의 평면으로부터 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CheckBound&lt;/span&gt; 함수를 호출하고 &lt;span style=&quot;color: #006dd7;&quot;&gt;구 바운딩 볼륨&lt;/span&gt;을 넘겨&lt;/b&gt;주어 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;절두체 컬링&lt;/span&gt;을 수행&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2026-07-22 19-21-49-264.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDUry/dJMcahSGXnG/azVNLsVPOkkkmyXqHoKPlk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDUry/dJMcahSGXnG/azVNLsVPOkkkmyXqHoKPlk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDUry/dJMcahSGXnG/azVNLsVPOkkkmyXqHoKPlk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/QDUry/dJMcahSGXnG/azVNLsVPOkkkmyXqHoKPlk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;474&quot; data-filename=&quot;bandicam 2026-07-22 19-21-49-264.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수학/이득우의 게임 수학 - 실습 예제</category>
      <category>게임 수학 실습 예제</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1354</guid>
      <comments>https://monstrosite.tistory.com/1354#entry1354comment</comments>
      <pubDate>Wed, 22 Jul 2026 19:23:43 +0900</pubDate>
    </item>
    <item>
      <title>구 바운딩 볼륨을 이용한 절두체 컬링</title>
      <link>https://monstrosite.tistory.com/1353</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQNs3p/dJMcaiRGEC1/86w6VlKuN84jWZ4yY72WuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQNs3p/dJMcaiRGEC1/86w6VlKuN84jWZ4yY72WuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQNs3p/dJMcaiRGEC1/86w6VlKuN84jWZ4yY72WuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQNs3p%2FdJMcaiRGEC1%2F86w6VlKuN84jWZ4yY72WuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;430&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;구 바운딩 볼륨&lt;/span&gt;을 사용&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;절두체 영역&lt;/span&gt;과 &lt;span style=&quot;color: #ee2323;&quot;&gt;구 영역&lt;/span&gt;을 비교하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;CheckBound&lt;/span&gt; 함수를 사용&lt;/b&gt;하여 &lt;b&gt;절두체 컬링을 진행&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;절두체 영역과 &lt;span style=&quot;color: #ee2323;&quot;&gt;겹치는 구 영역&lt;/span&gt;의 게임 오브젝트는 &lt;span style=&quot;color: #ee2323;&quot;&gt;붉은색&lt;/span&gt;으로 표시&lt;/b&gt;하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;절두체 영역&lt;span style=&quot;color: #ee2323;&quot;&gt; 내부에 포함된 구 영역&lt;/span&gt;의 게임 오브젝트는 &lt;span style=&quot;color: #ee2323;&quot;&gt;일반적으로&lt;/span&gt; 표시&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 예제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQ3MK/dJMb99UIdz2/pu0gebbvHFumrtnBMDSX3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQ3MK/dJMb99UIdz2/pu0gebbvHFumrtnBMDSX3k/img.png&quot; data-alt=&quot;Render3D 함수의 로직 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQ3MK/dJMb99UIdz2/pu0gebbvHFumrtnBMDSX3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQ3MK%2FdJMb99UIdz2%2Fpu0gebbvHFumrtnBMDSX3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;887&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Render3D 함수의 로직 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링을 진행하는 &lt;b&gt;Render3D 함수&lt;/b&gt;의 로직을 위와 같이 구성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;intersectedObjects&lt;/span&gt; 로컬 변수를 사용&lt;/b&gt;하여 &lt;b&gt;절두체 영역과 구 영역이 &lt;span style=&quot;color: #ef5369;&quot;&gt;겹치는 경우&lt;/span&gt;를 파악&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;finalColor&lt;/span&gt; 로컬 변수를 사용&lt;/b&gt;하여 &lt;b&gt;게임 오브젝트의 &lt;span style=&quot;color: #ef5369;&quot;&gt;색상&lt;/span&gt;을 지정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;메시의 &lt;span style=&quot;color: #ef5369;&quot;&gt;구 바운딩 볼륨&lt;/span&gt;을 가져와 &lt;span style=&quot;color: #ef5369;&quot;&gt;sphereBound&lt;/span&gt; 로컬 변수에 저장&lt;/b&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sphereBound의 &lt;span style=&quot;color: #ef5369;&quot;&gt;반지름&lt;/span&gt;을 &lt;span style=&quot;color: #ef5369;&quot;&gt;트랜스폼의 세 가지 값&lt;/span&gt; 중에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;가장 큰 값&lt;/span&gt;으로 반영&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, &lt;b&gt;sphereBound의 &lt;span style=&quot;color: #ef5369;&quot;&gt;중점&lt;/span&gt;을 로컬 공간에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;뷰 공간&lt;/span&gt;으로 변환&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;CheckBound&lt;/span&gt; 함수를 호출&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;절두체 영역&lt;/span&gt;과 &lt;span style=&quot;color: #ef5369;&quot;&gt;구 영역&lt;/span&gt;을 비교&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절두체 영역과 구 영역이&lt;b&gt; 겹치면 &lt;span style=&quot;color: #ef5369;&quot;&gt;intersectedObjects&lt;/span&gt;의 값을 1 증가&lt;/b&gt;시키고 &lt;b&gt;해당 오브젝트의 색상을 &lt;span style=&quot;color: #ef5369;&quot;&gt;붉은색&lt;/span&gt;으로 설정&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 최종 실행 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2026-07-22 16-21-44-519.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOlks4/dJMcadvW9T1/PZEKKzSP84Ldgmqm5kr2uk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOlks4/dJMcadvW9T1/PZEKKzSP84Ldgmqm5kr2uk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOlks4/dJMcadvW9T1/PZEKKzSP84Ldgmqm5kr2uk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bOlks4/dJMcadvW9T1/PZEKKzSP84Ldgmqm5kr2uk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;474&quot; data-filename=&quot;bandicam 2026-07-22 16-21-44-519.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수학/이득우의 게임 수학 - 실습 예제</category>
      <category>게임 수학 실습 예제</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1353</guid>
      <comments>https://monstrosite.tistory.com/1353#entry1353comment</comments>
      <pubDate>Wed, 22 Jul 2026 16:23:52 +0900</pubDate>
    </item>
    <item>
      <title>바운딩 볼륨</title>
      <link>https://monstrosite.tistory.com/1352</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0AJ5V/dJMcag7lJDp/IQgfbUghtaiQol78lsKOQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0AJ5V/dJMcag7lJDp/IQgfbUghtaiQol78lsKOQK/img.png&quot; data-alt=&quot;절두체에 걸쳐 있지만 절두체 컬링에 의해 그리기에서 제거된 게임 오브젝트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0AJ5V/dJMcag7lJDp/IQgfbUghtaiQol78lsKOQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0AJ5V%2FdJMcag7lJDp%2FIQgfbUghtaiQol78lsKOQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;472&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;절두체에 걸쳐 있지만 절두체 컬링에 의해 그리기에서 제거된 게임 오브젝트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 원근 투영 행렬을 활용한&lt;b&gt; 절두체 컬링에서 카메라를 이동&lt;/b&gt;시키면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;화면 가장자리&lt;/span&gt;의 게임 오브젝트가 갑자기&lt;span style=&quot;color: #ee2323;&quot;&gt; 튀어오르&lt;/span&gt;거나 &lt;span style=&quot;color: #ee2323;&quot;&gt;사라지는&lt;/span&gt; 현상이 발생&lt;/b&gt;하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 현상이 발생하는 이유는&lt;b&gt; 게임 오브젝트의 &lt;span style=&quot;color: #ee2323;&quot;&gt;메시&lt;/span&gt;가 차지하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;공간 영역&lt;/span&gt;이 있음에도 불구&lt;/b&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게임 오브젝트의 &lt;span style=&quot;color: #ee2323;&quot;&gt;기존 위치&lt;/span&gt;만 가지고 절두체 컬링을 수행하기 때문&lt;/b&gt;이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위의 이미지와 같은 상황&lt;/b&gt;에서 해당 게임 오브젝트는 그려져야 하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 절두체 컬링 로직을 사용한다면 &lt;b&gt;절두체의 &lt;span style=&quot;color: #ee2323;&quot;&gt;외부&lt;/span&gt;에 있다고 판단하여 그리기를 생략&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 바운딩 볼륨의 도입&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byhqFU/dJMcacjyYEg/EeHFnknvKDS20YzBB3tcKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byhqFU/dJMcacjyYEg/EeHFnknvKDS20YzBB3tcKK/img.png&quot; data-alt=&quot;이미치 출처 : https://gamedev.stackexchange.com/questions/114700/bounding-box-rotated-on-import&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byhqFU/dJMcacjyYEg/EeHFnknvKDS20YzBB3tcKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyhqFU%2FdJMcacjyYEg%2FEeHFnknvKDS20YzBB3tcKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;617&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미치 출처 : https://gamedev.stackexchange.com/questions/114700/bounding-box-rotated-on-import&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 해결하기 위해 &lt;b&gt;절두체 컬링&lt;/b&gt;은 게임 오브젝트의 위치가 아닌, &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;메시가 차지하는 영역&lt;/span&gt;을 대상으로 진행&lt;/b&gt;해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 엔진은 &lt;b&gt;메시가 차지하는 영역을 효과적으로 관리&lt;/b&gt;하기 위해 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;구&lt;/span&gt;나 &lt;span style=&quot;color: #ef5369;&quot;&gt;박스&lt;/span&gt;와 같은 &lt;span style=&quot;color: #ef5369;&quot;&gt;원시 도형&lt;/span&gt;을 사용&lt;/b&gt;하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;원시 도형&lt;/span&gt;으로 설정한 공간 데이터를 &lt;span style=&quot;color: #ef5369;&quot;&gt;바운딩 볼륨&lt;/span&gt;이라고 표현&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지에서 회색 선으로 구성된 박스가 바운딩 볼륨을 의미한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) 구 바운딩 볼륨의 판정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bobO5K/dJMcafnak24/8ZSP929N9bKrPLRjKYzgKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bobO5K/dJMcafnak24/8ZSP929N9bKrPLRjKYzgKK/img.png&quot; data-alt=&quot;한 점이 구의 외부에 있는지 판단하는 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bobO5K/dJMcafnak24/8ZSP929N9bKrPLRjKYzgKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbobO5K%2FdJMcafnak24%2F8ZSP929N9bKrPLRjKYzgKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;267&quot; height=&quot;95&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한 점이 구의 외부에 있는지 판단하는 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFrZDA/dJMcaixoAfN/A88WtJyyWUuYnhtSCFbLs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFrZDA/dJMcaixoAfN/A88WtJyyWUuYnhtSCFbLs1/img.png&quot; data-alt=&quot;위 공식의 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFrZDA/dJMcaixoAfN/A88WtJyyWUuYnhtSCFbLs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFrZDA%2FdJMcaixoAfN%2FA88WtJyyWUuYnhtSCFbLs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;317&quot; height=&quot;295&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 공식의 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;구&lt;/span&gt;를 사용한 바운딩 볼륨&lt;/b&gt;의 판정 과정을 알아본다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구는 두 영역이 서로 &lt;span style=&quot;color: #006dd7;&quot;&gt;겹치는지&lt;/span&gt;, &lt;span style=&quot;color: #006dd7;&quot;&gt;떨어져 있는지&lt;/span&gt;를 쉽게 판단&lt;/b&gt;할 수 있어 바운딩 볼륨에서 손쉽게 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;하나의 점&lt;/span&gt;이 &lt;span style=&quot;color: #006dd7;&quot;&gt;구의 외부&lt;/span&gt;에 있는지 판단하는 방법&lt;/b&gt;은 &lt;b&gt;구의 &lt;span style=&quot;color: #006dd7;&quot;&gt;중점에서부터 점까지의 거리&lt;/span&gt;와 구의 &lt;span style=&quot;color: #006dd7;&quot;&gt;반지름&lt;/span&gt;을 비교&lt;/b&gt;하는 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOWyL/dJMcacqq9db/FFHw5PqPAdIDNbmHZl5sbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOWyL/dJMcacqq9db/FFHw5PqPAdIDNbmHZl5sbK/img.png&quot; data-alt=&quot;두 구의 영역이 서로 떨어져 있는지 판단하는 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOWyL/dJMcacqq9db/FFHw5PqPAdIDNbmHZl5sbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOWyL%2FdJMcacqq9db%2FFFHw5PqPAdIDNbmHZl5sbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;107&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 구의 영역이 서로 떨어져 있는지 판단하는 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTosL/dJMcajbTcy4/aE4KJ1KJZc5bb6Khl6E8A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTosL/dJMcajbTcy4/aE4KJ1KJZc5bb6Khl6E8A0/img.png&quot; data-alt=&quot;위 공식의 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTosL/dJMcajbTcy4/aE4KJ1KJZc5bb6Khl6E8A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTosL%2FdJMcajbTcy4%2FaE4KJ1KJZc5bb6Khl6E8A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;322&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 공식의 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;두 개의 구의 영역&lt;/span&gt;이 서로 &lt;span style=&quot;color: #006dd7;&quot;&gt;떨어져 있는지 여부&lt;/span&gt;를 판단&lt;/b&gt;하는 공식은 위와 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 구의 &lt;span style=&quot;color: #006dd7;&quot;&gt;중점 사이의 거리&lt;/span&gt;와 두 구의 &lt;span style=&quot;color: #006dd7;&quot;&gt;반지름의 합&lt;/span&gt;을 비교&lt;/b&gt;하여 두 구의 겹침을 판단할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) 프로젝트에서 구 바운딩 볼륨의 구현&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 1) 구의 선언&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k29Ii/dJMcagM91Se/YnNfRIKKOQ4D6oWqMbEPNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k29Ii/dJMcagM91Se/YnNfRIKKOQ4D6oWqMbEPNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k29Ii/dJMcagM91Se/YnNfRIKKOQ4D6oWqMbEPNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk29Ii%2FdJMcagM91Se%2FYnNfRIKKOQ4D6oWqMbEPNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;492&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sphere 구조체&lt;/b&gt;를 통해 프로젝트에서 구를 사용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멤버변수&lt;/b&gt;는 다음과 같다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Center&lt;/span&gt; 멤버변수 : 구의 &lt;span style=&quot;color: #0593d3;&quot;&gt;중점&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Radius&lt;/span&gt; 멤버변수 : 구의 &lt;span style=&quot;color: #0593d3;&quot;&gt;반지름&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멤버함수&lt;/b&gt;는 다음과 같다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;IsInside&lt;/span&gt; 멤버 함수 : 구 영역이 &lt;span style=&quot;color: #0593d3;&quot;&gt;어느 한 점을 포함&lt;/span&gt;하는지 판단&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; 해당 함수를 호출하여 &lt;span style=&quot;color: #0593d3;&quot;&gt;주어진 점과 중점과의 거리&lt;/span&gt;가&lt;span style=&quot;color: #0593d3;&quot;&gt; 반지름&lt;/span&gt;보다 &lt;span style=&quot;color: #0593d3;&quot;&gt;작으면&lt;/span&gt; 주어진 점은 구 안에 &lt;span style=&quot;color: #0593d3;&quot;&gt;포함&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Intersect&lt;/span&gt; 멤버 함수 : 두 구의&lt;span style=&quot;color: #0593d3;&quot;&gt; 영역이 겹치는지&lt;/span&gt; 판단&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;해당 함수를 호출하여 &lt;span style=&quot;color: #0593d3;&quot;&gt;두 구의 중점간의 거리&lt;/span&gt;가 &lt;span style=&quot;color: #0593d3;&quot;&gt;두 구의 반지름의 합&lt;/span&gt;보다 &lt;span style=&quot;color: #0593d3;&quot;&gt;작으면&lt;/span&gt; 두 구는 &lt;span style=&quot;color: #0593d3;&quot;&gt;겹치게&lt;/span&gt; 됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 2) 메시 정보로부터 구를 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DtAK3/dJMcahys4QF/TsrK2F4D3kXvm0IQvYbO01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DtAK3/dJMcahys4QF/TsrK2F4D3kXvm0IQvYbO01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DtAK3/dJMcahys4QF/TsrK2F4D3kXvm0IQvYbO01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDtAK3%2FdJMcahys4QF%2FTsrK2F4D3kXvm0IQvYbO01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;432&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sphere 구조체의 &lt;b&gt;생성자&lt;/b&gt;에 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;메시의 정보&lt;/span&gt;를 넘겨주어 메시를 감싸는 &lt;span style=&quot;color: #009a87;&quot;&gt;구 영역&lt;/span&gt;을 생성&lt;/b&gt;할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메시를 구성하는 &lt;span style=&quot;color: #009a87;&quot;&gt;모든 점의 위치 값&lt;/span&gt;에 대한 &lt;span style=&quot;color: #009a87;&quot;&gt;평균&lt;/span&gt;을 계산하여 &lt;span style=&quot;color: #009a87;&quot;&gt;중점 위치&lt;/span&gt;를 계산&lt;/b&gt;하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중점에서 &lt;span style=&quot;color: #009a87;&quot;&gt;가장 먼 점과의 거리&lt;/span&gt;를 &lt;span style=&quot;color: #009a87;&quot;&gt;구의&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;반지름&lt;/span&gt;으로 결정&lt;/b&gt;하면 메시의 모든 영역을 감싸는 구 영역을 생성할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 3) 메시에 대한 바운딩 볼륨을 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TGrQ7/dJMcafnalup/iHqmmbdRrAlStgKL55075K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TGrQ7/dJMcafnalup/iHqmmbdRrAlStgKL55075K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TGrQ7/dJMcafnalup/iHqmmbdRrAlStgKL55075K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTGrQ7%2FdJMcafnalup%2FiHqmmbdRrAlStgKL55075K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;712&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LoadResources 함수&lt;/b&gt;는 &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;메시&lt;/span&gt;를 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때&lt;b&gt; 내부적으로 &lt;span style=&quot;color: #409d00;&quot;&gt;CaclulateBounds&lt;/span&gt; 함수를 실행&lt;/b&gt;하여 &lt;b&gt;메시가 생성된 후에&lt;span style=&quot;color: #409d00;&quot;&gt; 메시의 바운딩 볼륨&lt;/span&gt;을 생성&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 - 4) 구 영역을 활용한 절두체 컬링&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cimBGn/dJMcadJu7ct/PCHWKy5q4z2hYkWRkGg5kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cimBGn/dJMcadJu7ct/PCHWKy5q4z2hYkWRkGg5kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cimBGn/dJMcadJu7ct/PCHWKy5q4z2hYkWRkGg5kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcimBGn%2FdJMcadJu7ct%2FPCHWKy5q4z2hYkWRkGg5kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;337&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;구 영역&lt;/span&gt;을 활용한 &lt;span style=&quot;color: #8a3db6;&quot;&gt;CheckBound&lt;/span&gt; 함수&lt;/b&gt;를 구성하여 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;구&lt;/span&gt;를 사용한 &lt;span style=&quot;color: #8a3db6;&quot;&gt;절두체 컬링&lt;/span&gt;을 구현&lt;/b&gt;한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;총 3개의 조건&lt;/b&gt;을 통해&lt;b&gt;&amp;nbsp;게임 오브젝트를 &lt;span style=&quot;color: #8a3db6;&quot;&gt;그려야 하는지&lt;/span&gt; 판단&lt;/b&gt;한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평면으로부터의 거리값 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; 구의 반지름 : 해당 게임 오브젝트의 메시는 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;절두체의 외부&lt;/span&gt;&lt;/b&gt;에 존재&lt;/li&gt;
&lt;li&gt;평면으로부터의 거리값 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;/b&gt; 구의 반지름 : 해당 게임 오브젝트의 메시는 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;절두체의 경계&lt;/span&gt;&lt;/b&gt;에 존재&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;그 외&lt;/span&gt;&lt;/b&gt;의 경우 : 해당 게임 오브젝트의 메시는 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;절두체의 내부&lt;/span&gt;&lt;/b&gt;에 존재&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수학/이득우의 게임 수학</category>
      <category>게임 수학</category>
      <author>monstro</author>
      <guid isPermaLink="true">https://monstrosite.tistory.com/1352</guid>
      <comments>https://monstrosite.tistory.com/1352#entry1352comment</comments>
      <pubDate>Wed, 22 Jul 2026 11:05:46 +0900</pubDate>
    </item>
  </channel>
</rss>