<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>지훈</title>
    <link>https://jh009.tistory.com/</link>
    <description>내일배움캠프 전용 블로그</description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 04:04:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jh009</managingEditor>
    <item>
      <title>26.06.24 TIL / 3D 게임 개발 챕터4 정리 완료, 과제 5번 준비</title>
      <link>https://jh009.tistory.com/87</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오늘&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C++와 Unreal Engine으로 3D 게임 개발 정리 완료&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 195359.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beevwV/dJMcaaTjmdl/DR3aQL6HbXfhhx4nKqnWt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beevwV/dJMcaaTjmdl/DR3aQL6HbXfhhx4nKqnWt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beevwV/dJMcaaTjmdl/DR3aQL6HbXfhhx4nKqnWt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeevwV%2FdJMcaaTjmdl%2FDR3aQL6HbXfhhx4nKqnWt0%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;587&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2026-06-24 195359.png&quot; data-origin-width=&quot;587&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;&lt;a href=&quot;https://jh009.tistory.com/85&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/85&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782288608039&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 4-3&quot; data-og-description=&quot;4-3. UI 애니메이션 효과 및 3D 위젯 UI 구현하기 1. UI 애니메이션 효과 디자인하기 UMG와 Animation에 대한 이해언리얼 엔진에서는 UI를 만들 때 주로 UMG 사용 (Unreal Motion Graphics)UMG에는 Animation 기능이 &quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/85&quot; data-og-url=&quot;https://jh009.tistory.com/85&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oeM6v/dJMb8XSfQOF/U8GbdyyH15omKnvewCVcqk/img.jpg?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/Da0Tq/dJMb82eWYpP/IBEioUvxZX2PHLwcTe6CNk/img.jpg?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/bbRc0t/dJMb88Ge07T/jBMfWUqzsJ73YbLCwCVolK/img.png?width=635&amp;amp;height=640&amp;amp;face=0_0_635_640&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/85&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oeM6v/dJMb8XSfQOF/U8GbdyyH15omKnvewCVcqk/img.jpg?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/Da0Tq/dJMb82eWYpP/IBEioUvxZX2PHLwcTe6CNk/img.jpg?width=800&amp;amp;height=458&amp;amp;face=0_0_800_458,https://scrap.kakaocdn.net/dn/bbRc0t/dJMb88Ge07T/jBMfWUqzsJ73YbLCwCVolK/img.png?width=635&amp;amp;height=640&amp;amp;face=0_0_635_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 4-3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;4-3. UI 애니메이션 효과 및 3D 위젯 UI 구현하기 1. UI 애니메이션 효과 디자인하기 UMG와 Animation에 대한 이해언리얼 엔진에서는 UI를 만들 때 주로 UMG 사용 (Unreal Motion Graphics)UMG에는 Animation 기능이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;a href=&quot;https://jh009.tistory.com/86&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/86&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782288647932&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 4-4&quot; data-og-description=&quot;4-4. 파티클과 사운드로 게임 효과 연출하기 1. 파티클 시각 효과 추가하기 파티클 시스템 (Particla System) 기본 개념 이해 게임 내에서 불꽃, 연기, 폭발, 먼지 등 다양한 시각적 효과를 구현하기 위&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/86&quot; data-og-url=&quot;https://jh009.tistory.com/86&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dkpHzG/dJMb81f2BEK/OdUY7yiVfZ3ZqldaE6PFtK/img.png?width=619&amp;amp;height=311&amp;amp;face=0_0_619_311,https://scrap.kakaocdn.net/dn/mmwjH/dJMb84qiyRH/tkydhMR4kTW17ZZw3W9y40/img.png?width=619&amp;amp;height=311&amp;amp;face=0_0_619_311,https://scrap.kakaocdn.net/dn/3bzLR/dJMb9bwb8ME/nV9xRiQFM2F8EIwZZuEsN1/img.png?width=629&amp;amp;height=719&amp;amp;face=0_0_629_719&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/86&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/86&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dkpHzG/dJMb81f2BEK/OdUY7yiVfZ3ZqldaE6PFtK/img.png?width=619&amp;amp;height=311&amp;amp;face=0_0_619_311,https://scrap.kakaocdn.net/dn/mmwjH/dJMb84qiyRH/tkydhMR4kTW17ZZw3W9y40/img.png?width=619&amp;amp;height=311&amp;amp;face=0_0_619_311,https://scrap.kakaocdn.net/dn/3bzLR/dJMb9bwb8ME/nV9xRiQFM2F8EIwZZuEsN1/img.png?width=629&amp;amp;height=719&amp;amp;face=0_0_629_719');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 4-4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;4-4. 파티클과 사운드로 게임 효과 연출하기 1. 파티클 시각 효과 추가하기 파티클 시스템 (Particla System) 기본 개념 이해 게임 내에서 불꽃, 연기, 폭발, 먼지 등 다양한 시각적 효과를 구현하기 위&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5번 과제 필수 구현 기능 준비&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0sOoV/dJMcadiejxj/lSg6kZtaql5z6yeAv3Nk70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0sOoV/dJMcadiejxj/lSg6kZtaql5z6yeAv3Nk70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0sOoV/dJMcadiejxj/lSg6kZtaql5z6yeAv3Nk70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0sOoV%2FdJMcadiejxj%2FlSg6kZtaql5z6yeAv3Nk70%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;526&quot; height=&quot;583&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;748&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;3단계 레벨 전환을 구현하기 위해 Level_1_Map, Level_2_Map, Level_3_Map 총 3개의 맵을 생성하였음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 194706.png&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLSiwG/dJMcahZaMwq/mM1Bs2fxvpkWUyUGh1q0FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLSiwG/dJMcahZaMwq/mM1Bs2fxvpkWUyUGh1q0FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLSiwG/dJMcahZaMwq/mM1Bs2fxvpkWUyUGh1q0FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLSiwG%2FdJMcahZaMwq%2FmM1Bs2fxvpkWUyUGh1q0FK%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;298&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2026-06-24 194706.png&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;204&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;각 맵을 직관적으로 구분하기 위해 맵 상단에 숫자 1, 2, 3 형태의 도트 오브젝트를 배치하여 레벨 환경을 구성하였음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpRJNc/dJMcacp5Vpw/CsWfymDzWF0kPw5cxtL5Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpRJNc/dJMcacp5Vpw/CsWfymDzWF0kPw5cxtL5Nk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;587&quot; data-filename=&quot;스크린샷 2026-06-24 194716.png&quot; style=&quot;width: 32.451%; margin-right: 10px;&quot; data-widthpercent=&quot;33.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpRJNc/dJMcacp5Vpw/CsWfymDzWF0kPw5cxtL5Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpRJNc%2FdJMcacp5Vpw%2FCsWfymDzWF0kPw5cxtL5Nk%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;1054&quot; height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmbzHy/dJMcacp5Vpv/JSMFBXGj6RkPqWq1GdrzA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmbzHy/dJMcacp5Vpv/JSMFBXGj6RkPqWq1GdrzA0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;582&quot; data-filename=&quot;스크린샷 2026-06-24 194735.png&quot; style=&quot;width: 32.6366%; margin-right: 10px;&quot; data-widthpercent=&quot;33.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmbzHy/dJMcacp5Vpv/JSMFBXGj6RkPqWq1GdrzA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmbzHy%2FdJMcacp5Vpv%2FJSMFBXGj6RkPqWq1GdrzA0%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;1051&quot; height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D8wVy/dJMcacp5Vpu/T6xdzzieiSF5wuZOgNKTe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D8wVy/dJMcacp5Vpu/T6xdzzieiSF5wuZOgNKTe1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;584&quot; data-filename=&quot;스크린샷 2026-06-24 194746.png&quot; style=&quot;width: 32.5868%;&quot; data-widthpercent=&quot;33.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D8wVy/dJMcacp5Vpu/T6xdzzieiSF5wuZOgNKTe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD8wVy%2FdJMcacp5Vpu%2FT6xdzzieiSF5wuZOgNKTe1%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;1053&quot; height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회고&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++와 언리얼 엔진을 활용한 3D 게임 개발 강의를 수강 완료하였다. (강의 정리한 내용을 바탕으로 복습을 진행할 예정)&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;3번의 레벨 전환이 필요한 만큼, 혼동을 방지하고자 각 맵마다 큐브를 활용해 숫자 오브젝트를 배치하여 시각적 직관성을 확보했다.&lt;/p&gt;</description>
      <category>본 캠프 TIL</category>
      <category>til</category>
      <category>내일배움캠프</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/87</guid>
      <comments>https://jh009.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 24 Jun 2026 20:06:56 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 4-4</title>
      <link>https://jh009.tistory.com/86</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 4-4. &lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;파티클과 사운드로 게임 효과 연출하기&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;1.&amp;nbsp;파티클&amp;nbsp;시각&amp;nbsp;효과&amp;nbsp;추가하기&lt;/span&gt;&lt;/h4&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 data-token-index=&quot;0&quot;&gt;파티클 시스템 (Particla System) 기본 개념 이해&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;/li&gt;
&lt;li&gt;다수의 작은 입자 (Particle)들이 모여 움직이면서 특정한 모양, 색상, 혹은 애니메이션 효과를 만들어냄&lt;/li&gt;
&lt;li&gt;언리얼 엔진에서는 파티클 시스템을 사용해 효과적인 VFX (Visual Effects) 를 구현할 수 있도록 기능을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;Cascade / Niagara&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cascade&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진 3 시절부터 제공된 &lt;b&gt;오래된 파티클 편집 툴&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진 4, 5 호환 가능 / 신규 기능 업데이트 &amp;rarr; 주로 Niagara 위주로 이루어지고 있음&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;/b&gt;하고 빠르게 결과를 볼 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;레거시 프로젝트&lt;/b&gt;나 기존 아티스트 툴체인에서 많이 사용&lt;/li&gt;
&lt;li&gt;복잡하거나 고급스러운 VFX 연출에는 한계&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Niagara&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진 4 후반부터 새롭게 도입된 &lt;b&gt;차세대 파티클 시스템&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진 5에서 공식적으로 권장되는 방식&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;/b&gt;로 다양한 파티클 동작을 정교하게 제어 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;블루프린트&lt;/b&gt;나 &lt;b&gt;머티리얼&lt;/b&gt;, &lt;b&gt;스크립팅&lt;/b&gt;과 유기적으로 연동되어 고급 VFX를 쉽게 만들 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPU 파티클&lt;/b&gt;, &lt;b&gt;신규 기능 업데이트&lt;/b&gt;가 빠르게 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파티클 효과를 빠르게 만들어봐야 한다면 &lt;span data-token-index=&quot;1&quot;&gt;Cascade&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 프로젝트를 계획 중이고 고급 이펙트를 구현하고 싶다면 &lt;span data-token-index=&quot;1&quot;&gt;Niagara&lt;/span&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;span data-token-index=&quot;0&quot;&gt;이름 앞에 P_ 또는 Niagara_ 와 같은 접두어를 붙여두면, 프로젝트 내에서 파티클 에셋을 쉽게 구분할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;아이템 획득에&lt;/span&gt; 파티클 적용 / 사운드&amp;nbsp;효과&amp;nbsp;추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 아이템은 상호작용 시 ActivateItem 함수를 실행하도로 설계 했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에&amp;nbsp;파티클을&amp;nbsp;붙인다면&amp;nbsp;BaseItem을&amp;nbsp;상속받는&amp;nbsp;아이템들&amp;nbsp;모두에서&amp;nbsp;파티클을&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있음&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BaseItem.h &lt;/b&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 160724.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwAEcn/dJMcabSaDcN/MsBfa2qtUvMbW5PKqFkJ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwAEcn/dJMcabSaDcN/MsBfa2qtUvMbW5PKqFkJ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwAEcn/dJMcabSaDcN/MsBfa2qtUvMbW5PKqFkJ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwAEcn%2FdJMcabSaDcN%2FMsBfa2qtUvMbW5PKqFkJ7K%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;619&quot; height=&quot;311&quot; data-filename=&quot;스크린샷 2026-06-24 160724.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;311&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 162400.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSjpDw/dJMcafG7Dr5/NihSmXXXpS6Ws9AmxtLKC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSjpDw/dJMcafG7Dr5/NihSmXXXpS6Ws9AmxtLKC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSjpDw/dJMcafG7Dr5/NihSmXXXpS6Ws9AmxtLKC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSjpDw%2FdJMcafG7Dr5%2FNihSmXXXpS6Ws9AmxtLKC0%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;640&quot; height=&quot;348&quot; data-filename=&quot;스크린샷 2026-06-24 162400.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; BaseItem.cpp &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 161940.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXQOF/dJMb99UnMd9/T50x7EbHNgyO7dNHjy4vW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXQOF/dJMb99UnMd9/T50x7EbHNgyO7dNHjy4vW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXQOF/dJMb99UnMd9/T50x7EbHNgyO7dNHjy4vW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXQOF%2FdJMb99UnMd9%2FT50x7EbHNgyO7dNHjy4vW1%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;646&quot; height=&quot;126&quot; data-filename=&quot;스크린샷 2026-06-24 161940.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;122&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 161850.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXOQR/dJMcacp5Jat/nzmLzIkwJAtI6vTlIxuQLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXOQR/dJMcacp5Jat/nzmLzIkwJAtI6vTlIxuQLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXOQR/dJMcacp5Jat/nzmLzIkwJAtI6vTlIxuQLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXOQR%2FdJMcacp5Jat%2FnzmLzIkwJAtI6vTlIxuQLk%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;606&quot; height=&quot;678&quot; data-filename=&quot;스크린샷 2026-06-24 161850.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;721&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;letter-spacing: 0px;&quot;&gt;사운드 효과 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 163218.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HZImT/dJMcabq9UH7/pzsq9DyHKysLWtulQvsvuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HZImT/dJMcabq9UH7/pzsq9DyHKysLWtulQvsvuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HZImT/dJMcabq9UH7/pzsq9DyHKysLWtulQvsvuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHZImT%2FdJMcabq9UH7%2Fpzsq9DyHKysLWtulQvsvuK%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;607&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2026-06-24 163218.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;719&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Details 창 &amp;rarr; Item 카테고리 &amp;rarr; Effects 라는 카테고리가 생긴 것을 확인 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Particle 과 Sound 를 원하는 것으로 할당 후 컴파일 저장&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djCRaX/dJMcaf75Yi1/4FWH7zkTq8BptyLdXUdsqK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djCRaX/dJMcaf75Yi1/4FWH7zkTq8BptyLdXUdsqK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djCRaX/dJMcaf75Yi1/4FWH7zkTq8BptyLdXUdsqK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjCRaX%2FdJMcaf75Yi1%2F4FWH7zkTq8BptyLdXUdsqK%2Fimg.webp&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;506&quot; height=&quot;136&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;지뢰&lt;/span&gt; 아이템에 파티클 적용 / 사운드&amp;nbsp;효과&amp;nbsp;추가&lt;/b&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; MineItem.h&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 163839.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9uzNk/dJMcahSnqTL/5DZZzCaofGuhekfXafKvbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9uzNk/dJMcahSnqTL/5DZZzCaofGuhekfXafKvbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9uzNk/dJMcahSnqTL/5DZZzCaofGuhekfXafKvbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9uzNk%2FdJMcahSnqTL%2F5DZZzCaofGuhekfXafKvbk%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;568&quot; height=&quot;704&quot; data-filename=&quot;스크린샷 2026-06-24 163839.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;704&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사운드&amp;nbsp;효과&amp;nbsp;추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 164908.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSYKK/dJMcaiqfWbM/jHK3GR4Fd5O4cTnIXDJiUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSYKK/dJMcaiqfWbM/jHK3GR4Fd5O4cTnIXDJiUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSYKK/dJMcaiqfWbM/jHK3GR4Fd5O4cTnIXDJiUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSYKK%2FdJMcaiqfWbM%2FjHK3GR4Fd5O4cTnIXDJiUK%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;564&quot; height=&quot;651&quot; data-filename=&quot;스크린샷 2026-06-24 164908.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MineItem.cpp&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 165353.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ST893/dJMcaf75ZB5/ges3au8KYP2rqpkGAPVkH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ST893/dJMcaf75ZB5/ges3au8KYP2rqpkGAPVkH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ST893/dJMcaf75ZB5/ges3au8KYP2rqpkGAPVkH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FST893%2FdJMcaf75ZB5%2Fges3au8KYP2rqpkGAPVkH1%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;644&quot; height=&quot;761&quot; data-filename=&quot;스크린샷 2026-06-24 165353.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 165407.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coH2RJ/dJMcac4DntF/qaYPrk7MyVccfN2jqBTnl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coH2RJ/dJMcac4DntF/qaYPrk7MyVccfN2jqBTnl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coH2RJ/dJMcac4DntF/qaYPrk7MyVccfN2jqBTnl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoH2RJ%2FdJMcac4DntF%2FqaYPrk7MyVccfN2jqBTnl0%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;636&quot; height=&quot;688&quot; data-filename=&quot;스크린샷 2026-06-24 165407.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 165418.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnLTJe/dJMcaf75ZB4/ewewRMFvjyCAWwYDTwdiw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnLTJe/dJMcaf75ZB4/ewewRMFvjyCAWwYDTwdiw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnLTJe/dJMcaf75ZB4/ewewRMFvjyCAWwYDTwdiw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnLTJe%2FdJMcaf75ZB4%2FewewRMFvjyCAWwYDTwdiw0%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;635&quot; height=&quot;407&quot; data-filename=&quot;스크린샷 2026-06-24 165418.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;415&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사운드&amp;nbsp;효과&amp;nbsp;추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 165645.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nFKXJ/dJMcaiDOoRV/hkqiO4K74clEk6yqOGPF00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nFKXJ/dJMcaiDOoRV/hkqiO4K74clEk6yqOGPF00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nFKXJ/dJMcaiDOoRV/hkqiO4K74clEk6yqOGPF00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnFKXJ%2FdJMcaiDOoRV%2FhkqiO4K74clEk6yqOGPF00%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;638&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2026-06-24 165645.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/86</guid>
      <comments>https://jh009.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 24 Jun 2026 17:06:54 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 4-3</title>
      <link>https://jh009.tistory.com/85</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 4-3. &lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;UI 애니메이션 효과 및 3D 위젯 UI 구현하기&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.&amp;nbsp;UI&amp;nbsp;애니메이션&amp;nbsp;효과&amp;nbsp;디자인하기&lt;/h4&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 data-token-index=&quot;0&quot;&gt;UMG와 Animation에 대한 이해&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진에서는 UI를 만들 때 주로 UMG 사용 (Unreal Motion Graphics)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UMG에는 Animation 기능이 탑재되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 버튼이 클릭될 때 색이 바뀌거나, 텍스트가 화면 위로 등장했다가 사라지는 등 다양한 연출을 쉽게 구현 가능&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;Animation 패널&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;UMG 에디터 내에서 메뉴 상단에서 Window - Animations를 클릭하면 애니메이션을 다루는 창이 뜸&lt;/li&gt;
&lt;li&gt;UMG 에디터 왼쪽 하단 (기본 레이아웃 기준)에 위치한 패널&lt;/li&gt;
&lt;li&gt;여기서 새 애니메이션을 생성하거나, 이미 만든 애니메이션을 선택해 타임라인을 확인&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Keyframe(키 프레임)&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;특정 시간대에 UI 속성(크기, 위치, 투명도, 색상 등)을 어떻게 바꿀지를 기록하는 지점&lt;/li&gt;
&lt;li&gt;여러 개의 키 프레임을 연결하여 하나의 애니메이션 타임라인을 완성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Text 위젯에 애니메이션 적용하기&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WBP_MainMenu &amp;rarr; 디자이너 화면 TextBlock 2개 추가 &amp;rarr; 이름 설정 GameOverText / TotalScoreText&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 TextBlock 모두 기본 Text를 설정 (Content - Text 카테고리에 입력)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsMNZ3/dJMcaalpRwJ/HnB7b0o7j8Tcf9DCdnP4nK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsMNZ3/dJMcaalpRwJ/HnB7b0o7j8Tcf9DCdnP4nK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsMNZ3/dJMcaalpRwJ/HnB7b0o7j8Tcf9DCdnP4nK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsMNZ3%2FdJMcaalpRwJ%2FHnB7b0o7j8Tcf9DCdnP4nK%2Fimg.webp&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;527&quot; height=&quot;302&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;568&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;span data-token-index=&quot;0&quot;&gt;GameOverText와&amp;nbsp;TotalScoreText를&amp;nbsp;Hidden&amp;nbsp;(또는&amp;nbsp;Opacity=0)&amp;nbsp;상태로&amp;nbsp;배치&lt;/span&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&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 data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;게임&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;바로&amp;nbsp;보이지&amp;nbsp;않도록,&amp;nbsp;TextBlock의&amp;nbsp;Visibility를&amp;nbsp;Hidden&amp;nbsp;으로&amp;nbsp;설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이션으로 텍스트를 천천히 보이게 할 것임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8JP7/dJMcadCm3k5/hmkkmSkz2cK7glYydBHsj1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8JP7/dJMcadCm3k5/hmkkmSkz2cK7glYydBHsj1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8JP7/dJMcadCm3k5/hmkkmSkz2cK7glYydBHsj1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8JP7%2FdJMcadCm3k5%2FhmkkmSkz2cK7glYydBHsj1%2Fimg.webp&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;490&quot; height=&quot;135&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;490&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; &lt;span data-token-index=&quot;0&quot;&gt;애니메이션 트랙 생성&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GameOverText를 누른 상태로 &lt;span data-token-index=&quot;0&quot;&gt;+ Animation 새 애니메이션 추가 &amp;rarr;&amp;nbsp; 이름 설정 Anim_TimeOver&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMUrY7/dJMcacKo1Ib/FohSfMQrJGYBW3NNrcOQCK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMUrY7/dJMcacKo1Ib/FohSfMQrJGYBW3NNrcOQCK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMUrY7/dJMcacKo1Ib/FohSfMQrJGYBW3NNrcOQCK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMUrY7%2FdJMcacKo1Ib%2FFohSfMQrJGYBW3NNrcOQCK%2Fimg.webp&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;246&quot; height=&quot;163&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;163&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;+&amp;nbsp;Add&amp;nbsp;를&amp;nbsp;클릭하고&amp;nbsp;GameOverText를&amp;nbsp;선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pz6Cf/dJMcahLEmSD/QoLQKFodKyLY8UmrTpTM70/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pz6Cf/dJMcahLEmSD/QoLQKFodKyLY8UmrTpTM70/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pz6Cf/dJMcahLEmSD/QoLQKFodKyLY8UmrTpTM70/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpz6Cf%2FdJMcahLEmSD%2FQoLQKFodKyLY8UmrTpTM70%2Fimg.webp&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;524&quot; height=&quot;344&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;344&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 data-token-index=&quot;0&quot;&gt;Keyframe (키 프레임) 설정&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Render Opacity &lt;/span&gt;(투명도)를 트랙에 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzDchS/dJMcaiqfr1C/WDXpMl3ZuZ42qrYfK21vuK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzDchS/dJMcaiqfr1C/WDXpMl3ZuZ42qrYfK21vuK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzDchS/dJMcaiqfr1C/WDXpMl3ZuZ42qrYfK21vuK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzDchS%2FdJMcaiqfr1C%2FWDXpMl3ZuZ42qrYfK21vuK%2Fimg.webp&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;616&quot; height=&quot;355&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;355&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;시간 바를 옮기면서 각각 Render Opacity 값을 변경하면 자동으로 트랙에 Key가 등록됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZVeE9/dJMcaicMVuB/ckFo30EnKrAeIvaXOQ4Dz1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZVeE9/dJMcaicMVuB/ckFo30EnKrAeIvaXOQ4Dz1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZVeE9/dJMcaicMVuB/ckFo30EnKrAeIvaXOQ4Dz1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZVeE9%2FdJMcaicMVuB%2FckFo30EnKrAeIvaXOQ4Dz1%2Fimg.webp&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;634&quot; height=&quot;246&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;애니메이션을 Blueprint 재생 함수로 묶어두기&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;이벤트 그래프에서 PlayGameOverAnim Function을 만들기&lt;/span&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;Details 패널 &amp;rarr; GameOverText &amp;rarr; is Variable 체크&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;PlayTimeOverAnim을 호출하면 Anim_TimeOver 애니메이션이 재생되도록 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이션&amp;nbsp;재생이&amp;nbsp;끝나면&amp;nbsp;자연스럽게&amp;nbsp;점수가&amp;nbsp;뜰&amp;nbsp;수&amp;nbsp;있도록,&amp;nbsp;TotalScoreText&amp;nbsp;를&amp;nbsp;visible&amp;nbsp;처리를&amp;nbsp;하도록&amp;nbsp;연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CuUD7/dJMcadPXmpx/g1sdco6f4KYj69NZXvZ0Xk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CuUD7/dJMcadPXmpx/g1sdco6f4KYj69NZXvZ0Xk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CuUD7/dJMcadPXmpx/g1sdco6f4KYj69NZXvZ0Xk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCuUD7%2FdJMcadPXmpx%2Fg1sdco6f4KYj69NZXvZ0Xk%2Fimg.webp&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;990&quot; height=&quot;252&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;2.&amp;nbsp;게임&amp;nbsp;오버&amp;nbsp;UI&amp;nbsp;애니메이션&amp;nbsp;효과&amp;nbsp;추가하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;최종 점수 표시 애니메이션 호출&lt;/span&gt; &lt;/b&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782262531551&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SpartaPlayerController.cpp

void ASpartaPlayerController::ShowMainMenu(bool bIsRestart)
{
	if (HUDWidgetInstance)
	{
		HUDWidgetInstance-&amp;gt;RemoveFromParent();
		HUDWidgetInstance = nullptr;
	}

	if (MainMenuWidgetInstance)
	{
		MainMenuWidgetInstance-&amp;gt;RemoveFromParent();
		MainMenuWidgetInstance = nullptr;
	}

	if (MainMenuWidgetClass)
	{
		MainMenuWidgetInstance = CreateWidget&amp;lt;UUserWidget&amp;gt;(this, MainMenuWidgetClass);
		if (MainMenuWidgetInstance)
		{
			MainMenuWidgetInstance-&amp;gt;AddToViewport();
			
			bShowMouseCursor = true;
			SetInputMode(FInputModeUIOnly());
		}
		
		if (UTextBlock* ButtonText = 
        Cast&amp;lt;UTextBlock&amp;gt;(MainMenuWidgetInstance-&amp;gt;GetWidgetFromName(TEXT(&quot;StartButtonText&quot;))))
		{
			if (bIsRestart)
			{
				ButtonText-&amp;gt;SetText(FText::FromString(TEXT(&quot;Restart&quot;)));
			}
			else
			{
				ButtonText-&amp;gt;SetText(FText::FromString(TEXT(&quot;Start&quot;)));
			}
		}

// 추가
		if (bIsRestart)
		{
			UFunction* PlayAnimFunc = 
			MainMenuWidgetInstance-&amp;gt;FindFunction(FName(&quot;PlayGameOverAnim&quot;));
			if (PlayAnimFunc)
			{
				MainMenuWidgetInstance-&amp;gt;ProcessEvent(PlayAnimFunc, nullptr);
			}
			
			if (UTextBlock* TotalScoreText = Cast&amp;lt;UTextBlock&amp;gt; 
			   (MainMenuWidgetInstance-&amp;gt;GetWidgetFromName(&quot;TotalScoreText&quot;)))
			{
				if (USpartaGameInstance* SpartaGameInstance = Cast&amp;lt;USpartaGameInstance&amp;gt;
				   (UGameplayStatics::GetGameInstance(this)))
				{
					TotalScoreText-&amp;gt;SetText(FText::FromString(
					FString::Printf(TEXT(&quot;Total Score: %d&quot;), 
					SpartaGameInstance-&amp;gt;TotalScore)));
				}
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;3. WidgetComponent로 캐릭터 체력 표시하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;WidgetComponent 개념 이해&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;UMG (언리얼 모션 그래픽스)로 만든 위젯 (텍스트, 이미지, 버튼 등)을 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3D 월드&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에 붙일 수 있게 해주는 컴포넌트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: &amp;ldquo;NPC 머리 위 체력바&amp;rdquo;, &amp;ldquo;아이템 위에 &amp;lsquo;F 키를 누르세요&amp;rsquo; 텍스트&amp;rdquo; 등&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;WidgetComponent&lt;/b&gt;를 사용하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2D로만 보이던 UI를 공간 내 특정 위치에 붙여 놓고, 카메라 각도에 따라 회전하거나 크기가 달라지는 모습을 만들 수 있음&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;Actor에 부착(Attach)할 수 있는 컴포넌트 특정 UUserWidget(UMG Blueprint 클래스)을 3D 상에 표시하게 해줌&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통은 SetWidgetSpace(EWidgetSpace::World)로 설정하여, 월드 공간에 UI 가 존재하게 만듦&lt;/li&gt;
&lt;li&gt;초기 상태에서 SetVisibility(false)로 해 두고, 플레이어가 가까이 왔을 때 SetVisibility(true)로 변경하여 표시할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;Widget Blueprint 준비하기&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contents Browser&lt;b&gt;&amp;nbsp;&amp;rarr;&lt;/b&gt; UI - Widgets 폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Interface &amp;rarr; Widget Blueprint - User Widget 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 위젯 블루프린트 만들기 &amp;rarr; 이름 설정 WBP_HP&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; WBP_HP&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Palette &amp;rarr; Common - Text 선택 &amp;rarr; 이름 설정 OverHeadHP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;10 / 100&amp;rsquo; 과 같이 예시 텍스트를 임시로 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트 종류, 크기, 색상 등은 자유롭게 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJXptJ/dJMcageUyIT/vfbUDsnTSnWVYsoxPmoN81/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJXptJ/dJMcageUyIT/vfbUDsnTSnWVYsoxPmoN81/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJXptJ/dJMcageUyIT/vfbUDsnTSnWVYsoxPmoN81/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJXptJ%2FdJMcageUyIT%2FvfbUDsnTSnWVYsoxPmoN81%2Fimg.webp&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;578&quot; height=&quot;330&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;Character 클래스에 WidgetComponent 추가&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; SpartaCharacter.h &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115249.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tgGwl/dJMcadPXpyh/J6iFQrmlAg28siaGrxNbp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tgGwl/dJMcadPXpyh/J6iFQrmlAg28siaGrxNbp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tgGwl/dJMcadPXpyh/J6iFQrmlAg28siaGrxNbp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtgGwl%2FdJMcadPXpyh%2FJ6iFQrmlAg28siaGrxNbp1%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;635&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2026-06-24 115249.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115308.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dj1aD/dJMcacQ4A88/ikHhEBaUkq3r9rkcS613PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dj1aD/dJMcacQ4A88/ikHhEBaUkq3r9rkcS613PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dj1aD/dJMcacQ4A88/ikHhEBaUkq3r9rkcS613PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDj1aD%2FdJMcacQ4A88%2FikHhEBaUkq3r9rkcS613PK%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;633&quot; height=&quot;450&quot; data-filename=&quot;스크린샷 2026-06-24 115308.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;456&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;SpartaCharacter.cpp&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 data-ke-size=&quot;size16&quot;&gt;OverheadWidget-&amp;gt;SetWidgetSpace(EWidgetSpace::&lt;b&gt;Screen&lt;/b&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;스크린 모드: UI가 항상 화면에 고정된 것처럼 보임 / 플레이어의 카메라 방향과 상관없이 항상 정면에서 보임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;월드 모드: 캐릭터의 움직임에 따라 글씨도 같이 돌아감&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115533.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cblPEg/dJMcac4CWt4/OlX06QuRmqfGsT2oXgYtvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cblPEg/dJMcac4CWt4/OlX06QuRmqfGsT2oXgYtvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cblPEg/dJMcac4CWt4/OlX06QuRmqfGsT2oXgYtvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcblPEg%2FdJMcac4CWt4%2FOlX06QuRmqfGsT2oXgYtvK%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;641&quot; height=&quot;784&quot; data-filename=&quot;스크린샷 2026-06-24 115533.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115600.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t9k8Y/dJMcah50NVo/V1vPwIb2SSNTI33fZuyfPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t9k8Y/dJMcah50NVo/V1vPwIb2SSNTI33fZuyfPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t9k8Y/dJMcah50NVo/V1vPwIb2SSNTI33fZuyfPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft9k8Y%2FdJMcah50NVo%2FV1vPwIb2SSNTI33fZuyfPK%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;638&quot; height=&quot;117&quot; data-filename=&quot;스크린샷 2026-06-24 115600.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115730.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bugO58/dJMcahroPdV/njYbEulqAGfgEDkLWSFme0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bugO58/dJMcahroPdV/njYbEulqAGfgEDkLWSFme0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bugO58/dJMcahroPdV/njYbEulqAGfgEDkLWSFme0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbugO58%2FdJMcahroPdV%2FnjYbEulqAGfgEDkLWSFme0%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;638&quot; height=&quot;519&quot; data-filename=&quot;스크린샷 2026-06-24 115730.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 115813.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMSoo/dJMb99UnmKo/Elb3JyzCOK88MaaRaETxa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMSoo/dJMb99UnmKo/Elb3JyzCOK88MaaRaETxa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMSoo/dJMb99UnmKo/Elb3JyzCOK88MaaRaETxa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMSoo%2FdJMb99UnmKo%2FElb3JyzCOK88MaaRaETxa0%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;640&quot; height=&quot;383&quot; data-filename=&quot;스크린샷 2026-06-24 115813.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;Character 클래스에서 WidgetComponent 위치 설정&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BP_SpartaCharacter &amp;rarr; Components 중 Overhead Widget 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; User Interface 카테고리 &amp;rarr; Widget Class를 WBP_HP로 설정&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;rarr; Space는 World로 우선 셋팅을 한 후 위젯의 위치와 크기 조정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Screen으로 설정해 놓으면 블루프린트 상에서 위젯이 보이지 않을 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 Space를 다시 Screen으로 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ABVCx/dJMcaff3oyB/1KCB1uYQB1PwK2WtGlqdUK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ABVCx/dJMcaff3oyB/1KCB1uYQB1PwK2WtGlqdUK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ABVCx/dJMcaff3oyB/1KCB1uYQB1PwK2WtGlqdUK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FABVCx%2FdJMcaff3oyB%2F1KCB1uYQB1PwK2WtGlqdUK%2Fimg.webp&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;584&quot; height=&quot;312&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; SpartaCharacter.cpp &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 153922.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brzPnl/dJMcagF2RTj/D2f2Eo1EkBPZBZA5cykMm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brzPnl/dJMcagF2RTj/D2f2Eo1EkBPZBZA5cykMm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brzPnl/dJMcagF2RTj/D2f2Eo1EkBPZBZA5cykMm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrzPnl%2FdJMcagF2RTj%2FD2f2Eo1EkBPZBZA5cykMm0%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;639&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2026-06-24 153922.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;204&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; SpartaGameState.cpp &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 154252.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xzjhJ/dJMcahSnntB/wHLZa5nNWUJd07DG3ccaWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xzjhJ/dJMcahSnntB/wHLZa5nNWUJd07DG3ccaWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xzjhJ/dJMcahSnntB/wHLZa5nNWUJd07DG3ccaWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxzjhJ%2FdJMcahSnntB%2FwHLZa5nNWUJd07DG3ccaWk%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;647&quot; height=&quot;247&quot; data-filename=&quot;스크린샷 2026-06-24 154252.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;247&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;SpartaPlayerController.cpp &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 154415.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wl1uV/dJMcaa6S6cM/xs5jtD2gIwk4OrMJ7qNDc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wl1uV/dJMcaa6S6cM/xs5jtD2gIwk4OrMJ7qNDc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wl1uV/dJMcaa6S6cM/xs5jtD2gIwk4OrMJ7qNDc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWl1uV%2FdJMcaa6S6cM%2Fxs5jtD2gIwk4OrMJ7qNDc1%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;645&quot; height=&quot;243&quot; data-filename=&quot;스크린샷 2026-06-24 154415.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;243&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;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/85</guid>
      <comments>https://jh009.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 24 Jun 2026 15:46:51 +0900</pubDate>
    </item>
    <item>
      <title>26.06.23 TIL / 3D 게임 개발 강의 정리, 방어 코드 짜보기</title>
      <link>https://jh009.tistory.com/84</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오늘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C++와 Unreal Engine으로 3D 게임 개발 정리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/81&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/81&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782186512465&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 4-1&quot; data-og-description=&quot;4-1. UI 위젯 설계와 실시간 데이터 연동하기 1. UMG (Unreal Motion Graphics) 위젯 기초 디자인 이해하기 HUD (Heads-Up Dispaly)게임 내에서 플레이어에게 정보를 제공하기 위한 화면게임 중 화면의 일부에 배&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/81&quot; data-og-url=&quot;https://jh009.tistory.com/81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9LmRC/dJMb9g5kIPJ/jNtyfjVpH4120ydlaObUfk/img.jpg?width=611&amp;amp;height=175&amp;amp;face=0_0_611_175,https://scrap.kakaocdn.net/dn/doQASh/dJMb9kmmg8L/EseLFJaAELdstpsAWbNn1K/img.jpg?width=611&amp;amp;height=175&amp;amp;face=0_0_611_175,https://scrap.kakaocdn.net/dn/eFJIst/dJMb9efnJQb/LKcvmyeX1YdPGLw4F7BHBK/img.png?width=643&amp;amp;height=837&amp;amp;face=0_0_643_837&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9LmRC/dJMb9g5kIPJ/jNtyfjVpH4120ydlaObUfk/img.jpg?width=611&amp;amp;height=175&amp;amp;face=0_0_611_175,https://scrap.kakaocdn.net/dn/doQASh/dJMb9kmmg8L/EseLFJaAELdstpsAWbNn1K/img.jpg?width=611&amp;amp;height=175&amp;amp;face=0_0_611_175,https://scrap.kakaocdn.net/dn/eFJIst/dJMb9efnJQb/LKcvmyeX1YdPGLw4F7BHBK/img.png?width=643&amp;amp;height=837&amp;amp;face=0_0_643_837');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 4-1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;4-1. UI 위젯 설계와 실시간 데이터 연동하기 1. UMG (Unreal Motion Graphics) 위젯 기초 디자인 이해하기 HUD (Heads-Up Dispaly)게임 내에서 플레이어에게 정보를 제공하기 위한 화면게임 중 화면의 일부에 배&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;a href=&quot;https://jh009.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/83&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782213163572&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 4-2&quot; data-og-description=&quot;4-2. 게임 흐름에 맞춘 메뉴 UI 구현하기 1. 게임 메뉴 UI 디자인하기 메뉴 위젯 생성하고 버튼 추가 UI 폴더 우클릭 &amp;rarr; User Interface &amp;rarr; Widget Blueprint 선택 &amp;rarr; 위젯 이름 설정 WBP_MainMenu Canvas Panel을 놓아&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/83&quot; data-og-url=&quot;https://jh009.tistory.com/83&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/me4D4/dJMb8U83xy8/klH2fwTPVRFBdKGoABu52k/img.jpg?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/bChNUn/dJMb8TCjG8f/rTrZxd18qBAIEv3S8h8ank/img.jpg?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/cJGCII/dJMb9frPbh4/UnEnfiyzrEudCDg79727x0/img.png?width=628&amp;amp;height=734&amp;amp;face=0_0_628_734&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/83&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/me4D4/dJMb8U83xy8/klH2fwTPVRFBdKGoABu52k/img.jpg?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/bChNUn/dJMb8TCjG8f/rTrZxd18qBAIEv3S8h8ank/img.jpg?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/cJGCII/dJMb9frPbh4/UnEnfiyzrEudCDg79727x0/img.png?width=628&amp;amp;height=734&amp;amp;face=0_0_628_734');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 4-2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;4-2. 게임 흐름에 맞춘 메뉴 UI 구현하기 1. 게임 메뉴 UI 디자인하기 메뉴 위젯 생성하고 버튼 추가 UI 폴더 우클릭 &amp;rarr; User Interface &amp;rarr; Widget Blueprint 선택 &amp;rarr; 위젯 이름 설정 WBP_MainMenu Canvas Panel을 놓아&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;&lt;a href=&quot;https://jh009.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/82&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782186532231&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;기초반 3강 / 컨트롤러, 총기 구현&quot; data-og-description=&quot;폴더 정리BP_PlayerCharacter &amp;rarr; Characters/Player/로 이동Characters 폴더 우클릭 &amp;rarr; Update Redirector References 폴더를 나눠서 관리하는 이유:나중에 몬스터도 추가될 예정이기에 미리 분리해놓으면 헷갈리는 일&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/82&quot; data-og-url=&quot;https://jh009.tistory.com/82&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfIBMB/dJMb8XkphLx/vInYuRRWB9qoLu4I4alUjk/img.png?width=713&amp;amp;height=313&amp;amp;face=0_0_713_313,https://scrap.kakaocdn.net/dn/k6elz/dJMb8U83tt5/MoYgNqe8MUQyWsc9Mo34d1/img.png?width=713&amp;amp;height=313&amp;amp;face=0_0_713_313,https://scrap.kakaocdn.net/dn/Xok0o/dJMb8UHY3JU/L8RSMXxLnKaN4JPWWDaMRk/img.png?width=934&amp;amp;height=636&amp;amp;face=0_0_934_636&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/82&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfIBMB/dJMb8XkphLx/vInYuRRWB9qoLu4I4alUjk/img.png?width=713&amp;amp;height=313&amp;amp;face=0_0_713_313,https://scrap.kakaocdn.net/dn/k6elz/dJMb8U83tt5/MoYgNqe8MUQyWsc9Mo34d1/img.png?width=713&amp;amp;height=313&amp;amp;face=0_0_713_313,https://scrap.kakaocdn.net/dn/Xok0o/dJMb8UHY3JU/L8RSMXxLnKaN4JPWWDaMRk/img.png?width=934&amp;amp;height=636&amp;amp;face=0_0_934_636');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;기초반 3강 / 컨트롤러, 총기 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;폴더 정리BP_PlayerCharacter &amp;rarr; Characters/Player/로 이동Characters 폴더 우클릭 &amp;rarr; Update Redirector References 폴더를 나눠서 관리하는 이유:나중에 몬스터도 추가될 예정이기에 미리 분리해놓으면 헷갈리는 일&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;1. PIE 모드 실행 시 언리얼 에디터 Crash&lt;/b&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;기초반 3강 컨트롤러 / 총기 구현 중 언리얼 에디터 Crash&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;SetupPlayerInputComponent 코드 수정 후 언리얼 에디터에서 PIE 실행 시 엔진 크래시 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWyeYJ/dJMcad3t91X/fRhsBmlQjJjTMHYFDhelJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWyeYJ/dJMcad3t91X/fRhsBmlQjJjTMHYFDhelJK/img.png&quot; width=&quot;561&quot; height=&quot;323&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;439&quot; data-filename=&quot;img (1).png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;58.08&quot; style=&quot;width: 57.4016%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWyeYJ/dJMcad3t91X/fRhsBmlQjJjTMHYFDhelJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWyeYJ%2FdJMcad3t91X%2FfRhsBmlQjJjTMHYFDhelJK%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;762&quot; height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXM39D/dJMcab5JjBw/2ebR6vXXbtf3PkeKugser1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXM39D/dJMcab5JjBw/2ebR6vXXbtf3PkeKugser1/img.png&quot; width=&quot;571&quot; height=&quot;456&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;589&quot; data-filename=&quot;img.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.4357%;&quot; data-widthpercent=&quot;41.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXM39D/dJMcab5JjBw/2ebR6vXXbtf3PkeKugser1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXM39D%2FdJMcab5JjBw%2F2ebR6vXXbtf3PkeKugser1%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;738&quot; height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/div&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 data-ke-size=&quot;size16&quot;&gt;BP_PlayerCharacter의 Details 패널 내 Input - Player Input Config 설정이 None으로 비어있는 것을 발견&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 103040.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBGxn/dJMcadCmhBH/t3nyAaOIKRTzmsmBBS29F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBGxn/dJMcadCmhBH/t3nyAaOIKRTzmsmBBS29F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBGxn/dJMcadCmhBH/t3nyAaOIKRTzmsmBBS29F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBGxn%2FdJMcadCmhBH%2Ft3nyAaOIKRTzmsmBBS29F1%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;378&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2026-06-23 103040.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;445&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;BP_PlayerCharacter의 Details 패널 &amp;rarr; Player Input Config 항목을 DA_PlayerInputConfig 로 할당&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img (2).png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xa3O8/dJMcaalo43Y/kQOaxwNcjRQTuvYE8Skg3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xa3O8/dJMcaalo43Y/kQOaxwNcjRQTuvYE8Skg3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xa3O8/dJMcaalo43Y/kQOaxwNcjRQTuvYE8Skg3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxa3O8%2FdJMcaalo43Y%2FkQOaxwNcjRQTuvYE8Skg3K%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;375&quot; height=&quot;403&quot; data-filename=&quot;img (2).png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;462&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;코드 수정을 했다면 언리얼에디터도 같이 수정해주고 PIE를 누르기&amp;nbsp; &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;if (PlayerInputConfig == nullptr) return;&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;Crash를 방지 가능&lt;/li&gt;
&lt;li&gt;어떤 문제인지 로그를 통해 바로 파악 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782190519428&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    // 데이터가 할당되었는지 안전하게 확인
    if (PlayerInputConfig == nullptr)
    {
        UE_LOG(LogTemp, Error, TEXT(&quot;PlayerInputConfig가 BP에서 설정되지 않았음.&quot;));
        return; 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 언리얼 에디터 Fab 로그인 확인&lt;/b&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;Fab&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;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 104417.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btI7ls/dJMcadPWzfc/m6cc4PLNAs7B2jkkwzyMiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btI7ls/dJMcadPWzfc/m6cc4PLNAs7B2jkkwzyMiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btI7ls/dJMcadPWzfc/m6cc4PLNAs7B2jkkwzyMiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtI7ls%2FdJMcadPWzfc%2Fm6cc4PLNAs7B2jkkwzyMiK%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;611&quot; height=&quot;672&quot; data-filename=&quot;스크린샷 2026-06-23 104417.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 105539.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8g41K%2FdJMcadbjYuI%2FEixelfdsT543C89UpmvlOK%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;339&quot; height=&quot;537&quot; data-filename=&quot;스크린샷 2026-06-23 105539.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;키워드 정리 [ Reflection, 가비지 컬렉터(UPROPERTY, UObject/TSubclassOf) ]&lt;br /&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 리플렉션(Reflection)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;프로그램이 실행 중, 자기 자신의 구조(클래스, 멤버 변수, 함수 등)를 조사하고 조작할 수 있는 기능을 의미&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;C++은 원래 리플렉션을 지원하지 않지만, 언리얼은 UHT(Unreal Header Tool)를 통해 구현&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;필요한 이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에디터에서 변수 값을 수정하기 위함&lt;/li&gt;
&lt;li&gt;가비지 컬렉터가 객체의 참조 관계를 파악하기 위함&lt;/li&gt;
&lt;li&gt;블루프린트와 C++ 간의 상호작용(함수 호출, 변수 노출)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UCLASS(), USTRUCT(), UPROPERTY(), UFUNCTION() 등이 붙은 항목만 리플렉션 시스템에 등록&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 가비지 컬렉터, GC (Garbage Collector)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;언리얼 엔진은 C++의 수동 메모리 관리 대신, 참조 기반 가비지 컬렉션 시스템을 사용&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;시스템은 UObject를 상속받은 객체들을 추적&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 data-ke-size=&quot;size16&quot;&gt;* UObject 기반 객체는 new가 아닌 NewObject&amp;lt;T&amp;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;GC가 객체를 안전하게 해제하려면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 객체를 가리키는 포인터가 UPROPERTY()로 마킹되어 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(GC가 누가 이 객체를 참조하고 있는지 알 수 있음)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. UPROPERTY()&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;리플렉션과 GC를 연결하는 가장 중요한 매크로&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;변수 위에 선언하여 엔진에게 이 변수의 정보를 알려줌&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC 보호:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPROPERTY()로 선언된 UObject* 포인터는 GC 시스템에 의해 참조 카운트가 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변수가 살아있는 한, 가리키는 객체는 메모리에서 삭제 X&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;/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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EditAnywhere: 에디터 어디서든 수정 가능&lt;/li&gt;
&lt;li&gt;BlueprintReadOnly / BlueprintReadWrite: 블루프린트에서 접근 가능 여부&lt;/li&gt;
&lt;li&gt;Category: 에디터 디테일 패널에서 항목 그룹화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. UObject와 TSubclassOf&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;UObject&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언리얼 엔진의 모든 클래스가 상속받는 최상위 베이스 클래스&lt;/li&gt;
&lt;li&gt;가비지 컬렉션, 리플렉션, 직렬화 등 엔진의 핵심 기능을 모두 지원 받을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;TSubclassOf&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 클래스의 타입만 허용하는 템플릿 클래스&lt;/li&gt;
&lt;li&gt;사용 예시: TSubclassOf&amp;lt;AActor&amp;gt; 라고 선언 &amp;rarr; 에디터에서 AActor를 상속받은 블루프린트 클래스만 선택할 수 있게 제한&lt;/li&gt;
&lt;li&gt;장점: 코딩 시 불필요한 타입 체크를 줄임, 에디터에서 디자이너가 잘못된 클래스를 할당하는 실수를 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회고&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 강의 챕터4 정리가 거의 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일쯤이면 강의 정리를 다 하고 과제 5번 시작을 해도될 것 같다.&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;기초반 3강 예습 도중, 특정 상황에 Crash가 나서 원인 분석과 해결책까지 정리했다.&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;if (PlayerInputConfig == nullptr) return;&lt;/b&gt; 가 있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Input - Player Input Config 설정이 None&lt;/b&gt; 으로 되어있어도 Crash까지는 일어나지 않았다.&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;그리고 리플렉션과 UPROPERTY 를 정리해보았는데, 이해가 갈듯말듯하다. 좀 더 정리가 필요하다.&lt;/p&gt;</description>
      <category>본 캠프 TIL</category>
      <category>til</category>
      <category>내일배움캠프</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/84</guid>
      <comments>https://jh009.tistory.com/84#entry84comment</comments>
      <pubDate>Tue, 23 Jun 2026 20:41:49 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 4-2</title>
      <link>https://jh009.tistory.com/83</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 4-2. &lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;게임 흐름에 맞춘 메뉴 UI 구현하기&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;1.&amp;nbsp;게임&amp;nbsp;메뉴&amp;nbsp;UI&amp;nbsp;디자인하기&lt;/span&gt;&lt;/h4&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 data-token-index=&quot;0&quot;&gt;메뉴 위젯 생성하고 버튼 추가&lt;/span&gt; &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI 폴더 우클릭 &amp;rarr; User Interface &amp;rarr; Widget Blueprint 선택 &amp;rarr; 위젯 이름 설정 WBP_MainMenu&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;Canvas Panel을 놓아서 기본적인 바탕 마련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Details - Size X &amp;rarr; 1920, Size Y &amp;rarr;&amp;nbsp; 1080&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Brush Color &amp;rarr; RGB 색깔 선택 후, 맨 아래 A (투명도) 도 취향에 맞게 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EL1Wo/dJMcabkpSzf/CaXUeDoD18kchPpXHnito0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EL1Wo/dJMcabkpSzf/CaXUeDoD18kchPpXHnito0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EL1Wo/dJMcabkpSzf/CaXUeDoD18kchPpXHnito0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEL1Wo%2FdJMcabkpSzf%2FCaXUeDoD18kchPpXHnito0%2Fimg.webp&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;594&quot; height=&quot;634&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;634&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;Common - &lt;span data-token-index=&quot;1&quot;&gt;Button&lt;/span&gt; 위젯 &amp;rarr; Start 버튼 하나만 Canvas Panel 아래에 두기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button 이름 &amp;rarr; StartButton&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqDlkG/dJMcaf1knvW/bTO4nS4c7W893p1jLTIzy1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqDlkG/dJMcaf1knvW/bTO4nS4c7W893p1jLTIzy1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqDlkG/dJMcaf1knvW/bTO4nS4c7W893p1jLTIzy1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqDlkG%2FdJMcaf1knvW%2FbTO4nS4c7W893p1jLTIzy1%2Fimg.webp&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;592&quot; height=&quot;336&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;631&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;Alignment를 (0.5, 0.5)로 놓고 X, Y의 위치를 화면 크기의 절반으로 두면 가운데에 딱 배치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AUOXW/dJMcabxRJQ4/FKVkn4Pz9KKHfV8kjf5DHK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AUOXW/dJMcabxRJQ4/FKVkn4Pz9KKHfV8kjf5DHK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AUOXW/dJMcabxRJQ4/FKVkn4Pz9KKHfV8kjf5DHK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAUOXW%2FdJMcabxRJQ4%2FFKVkn4Pz9KKHfV8kjf5DHK%2Fimg.webp&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;445&quot; height=&quot;246&quot; data-filename=&quot;image (3).webp&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;246&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;각 버튼마다 Common - Text를 끌어다 놓기 (왼쪽 하단에 Hierarchy 창에 드래그 앤 드랍을 하면 편함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Text 이름 &amp;rarr; StartButtonText&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ld6hY/dJMcahY9PFc/5UElbsdCHopgkW7Q7zQbTk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ld6hY/dJMcahY9PFc/5UElbsdCHopgkW7Q7zQbTk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ld6hY/dJMcahY9PFc/5UElbsdCHopgkW7Q7zQbTk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fld6hY%2FdJMcahY9PFc%2F5UElbsdCHopgkW7Q7zQbTk%2Fimg.webp&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;545&quot; height=&quot;318&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B29LM/dJMcabR9P4j/MGt94d1jKTXI5CiNqr2ki1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B29LM/dJMcabR9P4j/MGt94d1jKTXI5CiNqr2ki1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B29LM/dJMcabR9P4j/MGt94d1jKTXI5CiNqr2ki1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB29LM%2FdJMcabR9P4j%2FMGt94d1jKTXI5CiNqr2ki1%2Fimg.webp&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;391&quot; height=&quot;225&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&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;/li&gt;
&lt;li&gt;이 방식을 쓰면 Menu UI 와 Game Level 이 완전히 분리되어, 구조가 좀 더 명확해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File - New Level 선택 &amp;rarr; Basic 템플릿 생성, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Maps 폴더 &amp;rarr; MenuLevel 이름으로 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Editor - Project Settings &amp;rarr; Maps &amp;amp; Modes &amp;rarr; Default Maps 를 MenuLevel 로 지정&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 게임 흐름 내에 메뉴 UI 배치하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WBP_MainMenu 을 다양한 상황에서 &lt;span data-token-index=&quot;1&quot;&gt;표시&lt;/span&gt;하고, &lt;span data-token-index=&quot;3&quot;&gt;숨기고&lt;/span&gt;, &lt;span data-token-index=&quot;5&quot;&gt;다시 띄우는&lt;/span&gt; 로직을 단계별로 구현&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;플레이 버튼을 누르면 Menu UI가 가장 먼저 뜨기&lt;/li&gt;
&lt;li&gt;게임 시작 시 자동으로 HUD를 띄우기&lt;/li&gt;
&lt;li&gt;메뉴가 나타날 때마다, UI 입력 모드로 전환하여 버튼 클릭에 집중하게 만드는 방식으로 수정&lt;/li&gt;
&lt;li&gt;게임이 종료되면 메뉴가 다시 뜨도록 만들기&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;PlayerController에 기본 위젯 오픈 함수 구현&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;PlayerController&lt;/span&gt;가 &lt;span data-token-index=&quot;2&quot;&gt;UI&lt;/span&gt;를 다루기 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 모드도 가능하지만, 멀티플레이를 고려하면 PlayerController가 UI 담당이 좀 더 자연스러운 편&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;SpartaPlayerController.h&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 190500.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brLqEc/dJMcaalpCet/TUHxBzHFxL6IP8flhDYadK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brLqEc/dJMcaalpCet/TUHxBzHFxL6IP8flhDYadK/img.png&quot; data-alt=&quot;SpartaPlayerController.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brLqEc/dJMcaalpCet/TUHxBzHFxL6IP8flhDYadK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrLqEc%2FdJMcaalpCet%2FTUHxBzHFxL6IP8flhDYadK%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;628&quot; height=&quot;734&quot; data-filename=&quot;스크린샷 2026-06-23 190500.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaPlayerController.h&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;SpartaPlayerController.cpp&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2&quot;&gt;1. 기본 원리&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;PlayerController의 SetInputMode 함수를 통해 입력을 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;2&quot;&gt;UI&lt;/b&gt;에 집중시킬지, &lt;b data-index-in-node=&quot;62&quot; data-path-to-node=&quot;2&quot;&gt;게임&lt;/b&gt;에 집중시킬지 결정&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;2. UI 전용 모드 전환 (UI Only)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;메뉴 호출 시 캐릭터 조작을 막고 UI 입력만 받기 위한 단계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;구조체 설정:&lt;/b&gt; FInputModeUIOnly 생성 및 SetWidgetToFocus 로 포커스 대상(위젯) 지정&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;모드 적용:&lt;/b&gt; SetInputMode (InputMode) 호출&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;시각화:&lt;/b&gt; bShowMouseCursor = true 로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;3. 에디터 세팅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BP_SpartaPlayerController 의 MainMenuWidgetClass 변수에 WBP_MainMenu 위젯을 할당해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;SetInputMode로 입력 대상을 UI로 바꾸고, 마우스를 띄운 뒤, 컨트롤러에 위젯 클래스를 연결&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 마우스로 UI만 누를 수 있게 됨&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 190903.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CzSPr/dJMcai4MTza/tS1qFWQPcslrZTOO4kTt91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CzSPr/dJMcai4MTza/tS1qFWQPcslrZTOO4kTt91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CzSPr/dJMcai4MTza/tS1qFWQPcslrZTOO4kTt91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCzSPr%2FdJMcai4MTza%2FtS1qFWQPcslrZTOO4kTt91%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;628&quot; height=&quot;425&quot; data-filename=&quot;스크린샷 2026-06-23 190903.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 191037.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3S7p/dJMcahSmJAX/c8liiLX7RkTZBnytEBkCN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3S7p/dJMcahSmJAX/c8liiLX7RkTZBnytEBkCN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3S7p/dJMcahSmJAX/c8liiLX7RkTZBnytEBkCN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3S7p%2FdJMcahSmJAX%2Fc8liiLX7RkTZBnytEBkCN0%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;628&quot; height=&quot;590&quot; data-filename=&quot;스크린샷 2026-06-23 191037.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1782209542244&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 메뉴 UI 표시
void ASpartaPlayerController::ShowMainMenu(bool bIsRestart)
{
	// HUD가 켜져 있다면 닫기
	if (HUDWidgetInstance)
	{
		HUDWidgetInstance-&amp;gt;RemoveFromParent();
		HUDWidgetInstance = nullptr;
	}
	
	// 이미 메뉴가 떠 있으면 제거
	if (MainMenuWidgetInstance)
	{
		MainMenuWidgetInstance-&amp;gt;RemoveFromParent();
		MainMenuWidgetInstance = nullptr;
	}
	
	// 메뉴 UI 생성
	if (MainMenuWidgetClass)
	{		
		MainMenuWidgetInstance = CreateWidget&amp;lt;UUserWidget&amp;gt;(this, MainMenuWidgetClass);
		if (MainMenuWidgetInstance)
		{
			MainMenuWidgetInstance-&amp;gt;AddToViewport();
			
			bShowMouseCursor = true;
			SetInputMode(FInputModeUIOnly());
		}
		
		if (UTextBlock* ButtonText = Cast&amp;lt;UTextBlock&amp;gt;
        (MainMenuWidgetInstance-&amp;gt;GetWidgetFromName(TEXT(&quot;StartButtonText&quot;))))
		{
			if (bIsRestart)
			{
				ButtonText-&amp;gt;SetText(FText::FromString(TEXT(&quot;Restart&quot;)));
			}
			else
			{
				ButtonText-&amp;gt;SetText(FText::FromString(TEXT(&quot;Start&quot;)));
			}
		}
	}
}

// 게임 HUD 표시
void ASpartaPlayerController::ShowGameHUD()
{
	// HUD가 켜져 있다면 닫기
	if (HUDWidgetInstance)
	{
		HUDWidgetInstance-&amp;gt;RemoveFromParent();
		HUDWidgetInstance = nullptr;
	}
	
	// 이미 메뉴가 떠 있으면 제거
	if (MainMenuWidgetInstance)
	{
		MainMenuWidgetInstance-&amp;gt;RemoveFromParent();
		MainMenuWidgetInstance = nullptr;
	}

	if (HUDWidgetClass)
	{
		HUDWidgetInstance = CreateWidget&amp;lt;UUserWidget&amp;gt;(this, HUDWidgetClass);
		if (HUDWidgetInstance)
		{
			HUDWidgetInstance-&amp;gt;AddToViewport();
			
			bShowMouseCursor = false;
			SetInputMode(FInputModeGameOnly());
			
			ASpartaGameState* SpartaGameState 
			= GetWorld() ? GetWorld()-&amp;gt;GetGameState&amp;lt;ASpartaGameState&amp;gt;() : nullptr;
			if (SpartaGameState)
			{
				SpartaGameState-&amp;gt;UpdateHUD();
			}
		}
	}
}

// 게임 시작 - BasicLevel 오픈, GameInstance 데이터 리셋
void ASpartaPlayerController::StartGame()
{
	if (USpartaGameInstance* SpartaGameInstance 
		= Cast&amp;lt;USpartaGameInstance&amp;gt;(UGameplayStatics::GetGameInstance(this)))
	{
		SpartaGameInstance-&amp;gt;CurrentLevelIndex = 0;
		SpartaGameInstance-&amp;gt;TotalScore = 0;
	}
	
	UGameplayStatics::OpenLevel(GetWorld(), FName(&quot;BasicLevel&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;GameState에서 게임 흐름에 따라 UI 호출&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 data-ke-size=&quot;size16&quot;&gt;SpartaGameState.cpp 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 194542.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciA8TP/dJMcabkpZoN/ssI5vn7llElK5E3KkNxVGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciA8TP/dJMcabkpZoN/ssI5vn7llElK5E3KkNxVGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciA8TP/dJMcabkpZoN/ssI5vn7llElK5E3KkNxVGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciA8TP%2FdJMcabkpZoN%2FssI5vn7llElK5E3KkNxVGk%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;508&quot; data-filename=&quot;스크린샷 2026-06-23 194542.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 194607.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bobS6w/dJMcaiRjR6I/9W7gLVOhcL5KsMbIFK7f2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bobS6w/dJMcaiRjR6I/9W7gLVOhcL5KsMbIFK7f2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bobS6w/dJMcaiRjR6I/9W7gLVOhcL5KsMbIFK7f2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbobS6w%2FdJMcaiRjR6I%2F9W7gLVOhcL5KsMbIFK7f2k%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;640&quot; height=&quot;262&quot; data-filename=&quot;스크린샷 2026-06-23 194607.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;메뉴 UI가 PlayerController에 설정이 되었나 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BP_SpartaPlayerController &amp;rarr; Menu - Main Menu Widget Class &amp;rarr; WBP_MainMenu 로 설정 (메인 메뉴 추가하기)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;Start 버튼 클릭 이벤트에 함수 바인딩&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Designer 탭에서 StartButton 버튼을 선택 &amp;rarr; Is Variable 체크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb3I0I/dJMcageUfLa/b2eo8YnUJ7ijTI8GFj5RXk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb3I0I/dJMcageUfLa/b2eo8YnUJ7ijTI8GFj5RXk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb3I0I/dJMcageUfLa/b2eo8YnUJ7ijTI8GFj5RXk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb3I0I%2FdJMcageUfLa%2Fb2eo8YnUJ7ijTI8GFj5RXk%2Fimg.webp&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;447&quot; height=&quot;242&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;242&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;맨 하단에 Events 활성화 &amp;rarr; On Clicked 옆에 + 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcsWf5/dJMb99Um4HA/ruRKzR66ThQoExA5WiTLX0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcsWf5/dJMb99Um4HA/ruRKzR66ThQoExA5WiTLX0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcsWf5/dJMb99Um4HA/ruRKzR66ThQoExA5WiTLX0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcsWf5%2FdJMb99Um4HA%2FruRKzR66ThQoExA5WiTLX0%2Fimg.webp&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;455&quot; height=&quot;167&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;167&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;OnClicked (StartButton) 이벤트 노드가 자동 생성 이벤트 노드가 자동 생성 되며, 로직을 구현할 수 있음&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;PlayerController에서 Start Game함수를 가져와서 연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LwhFo/dJMcaay1sin/kfyP1wnkM0cyzrMgzOrgPK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LwhFo/dJMcaay1sin/kfyP1wnkM0cyzrMgzOrgPK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LwhFo/dJMcaay1sin/kfyP1wnkM0cyzrMgzOrgPK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLwhFo%2FdJMcaay1sin%2FkfyP1wnkM0cyzrMgzOrgPK%2Fimg.webp&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;1276&quot; height=&quot;399&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PlayerController 상에서 메뉴를 다 연결했다면 &lt;b&gt;SpartaPlayerController.cpp &amp;rarr; HUDWidget 부분 삭제하기&lt;/b&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;BeginPlay &amp;rarr; 레벨을 새로 갱신할 때마다 PlayerController가 다시 만들어지게 코드를 수정하였음&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;
&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;메인 메뉴 UI&lt;/b&gt;를 띄우는 작업으로 이해하면 됨&lt;/p&gt;
&lt;pre id=&quot;code_1782212282963&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SpartaPlayerController.cpp

// 삭제할 부분
if (HUDWidgetClass)
{
	HUDWidgetInstance = CreateWidget&amp;lt;UUserWidget&amp;gt;(this, HUDWidgetClass);
    if (HUDWidgetInstance)
    {
    	HUDWidgetInstance-&amp;gt;AddToViewport();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zdTod/dJMcag61x80/I1wBU8KXj09ykriBiabqY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zdTod/dJMcag61x80/I1wBU8KXj09ykriBiabqY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zdTod/dJMcag61x80/I1wBU8KXj09ykriBiabqY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzdTod%2FdJMcag61x80%2FI1wBU8KXj09ykriBiabqY0%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;536&quot; height=&quot;504&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/83</guid>
      <comments>https://jh009.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 23 Jun 2026 20:12:25 +0900</pubDate>
    </item>
    <item>
      <title>기초반 3강 / 컨트롤러, 총기 구현</title>
      <link>https://jh009.tistory.com/82</link>
      <description>&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;BP_PlayerCharacter &amp;rarr; Characters/Player/로 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 100620.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1XkeM/dJMcafUCQNQ/v3hGvObrkUk19KTKFsrTlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1XkeM/dJMcafUCQNQ/v3hGvObrkUk19KTKFsrTlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1XkeM/dJMcafUCQNQ/v3hGvObrkUk19KTKFsrTlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1XkeM%2FdJMcafUCQNQ%2Fv3hGvObrkUk19KTKFsrTlK%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;422&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2026-06-23 100620.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Characters 폴더 우클릭 &amp;rarr; &lt;span data-token-index=&quot;1&quot;&gt;Update Redirector References&lt;/span&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 100648.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRzbmA/dJMcaaZ2rem/X2N7I1MmFPf4lPJIWG2RjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRzbmA/dJMcaaZ2rem/X2N7I1MmFPf4lPJIWG2RjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRzbmA/dJMcaaZ2rem/X2N7I1MmFPf4lPJIWG2RjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRzbmA%2FdJMcaaZ2rem%2FX2N7I1MmFPf4lPJIWG2RjK%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;526&quot; height=&quot;451&quot; data-filename=&quot;스크린샷 2026-06-23 100648.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UPlayerInputConfigDataAsset&amp;nbsp;C++&amp;nbsp;클래스&amp;nbsp;만들기&lt;/b&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;span style=&quot;letter-spacing: 0px;&quot;&gt;New C++ Class &amp;rarr; &lt;span data-token-index=&quot;0&quot;&gt;DataAsset 생성 &amp;rarr; 이름설정 &lt;span data-token-index=&quot;0&quot;&gt;PlayerInputConfigDataAsset&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 103401.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6vH5Q/dJMcabq8CZI/hVbPuuPFne47WZLRsbpyC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6vH5Q/dJMcabq8CZI/hVbPuuPFne47WZLRsbpyC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6vH5Q/dJMcabq8CZI/hVbPuuPFne47WZLRsbpyC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6vH5Q%2FdJMcabq8CZI%2FhVbPuuPFne47WZLRsbpyC0%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;588&quot; height=&quot;390&quot; data-filename=&quot;스크린샷 2026-06-23 103401.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PlayerInputConfigDataAsset.h&lt;/b&gt; 내용 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 103438.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSrEpu/dJMcadPWyy1/vb0KSGIoYafqmNWv6iaVV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSrEpu/dJMcadPWyy1/vb0KSGIoYafqmNWv6iaVV0/img.png&quot; data-alt=&quot;PlayerInputConfigDataAsset.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSrEpu/dJMcadPWyy1/vb0KSGIoYafqmNWv6iaVV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSrEpu%2FdJMcadPWyy1%2Fvb0KSGIoYafqmNWv6iaVV0%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;611&quot; height=&quot;518&quot; data-filename=&quot;스크린샷 2026-06-23 103438.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerInputConfigDataAsset.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DA_PlayerInputConfig&amp;nbsp;인스턴스&amp;nbsp;만들기&lt;/b&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;Content/Input &amp;rarr; &lt;span data-token-index=&quot;1&quot;&gt;Miscellaneous&lt;/span&gt; &amp;rarr; &lt;span data-token-index=&quot;3&quot;&gt;Data Asset &amp;rarr; 이름 설정 DA_PlayerInputConfig &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101316.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egN8q4/dJMcai4MlSa/wKjFAlkA9LPGw3zNHxte6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egN8q4/dJMcai4MlSa/wKjFAlkA9LPGw3zNHxte6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egN8q4/dJMcai4MlSa/wKjFAlkA9LPGw3zNHxte6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegN8q4%2FdJMcai4MlSa%2FwKjFAlkA9LPGw3zNHxte6k%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;713&quot; height=&quot;636&quot; data-filename=&quot;스크린샷 2026-06-23 101316.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101351.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TbTe1/dJMcai4MlSp/GlKNu2ISAHWXkRkPWvQAA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TbTe1/dJMcai4MlSp/GlKNu2ISAHWXkRkPWvQAA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TbTe1/dJMcai4MlSp/GlKNu2ISAHWXkRkPWvQAA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTbTe1%2FdJMcai4MlSp%2FGlKNu2ISAHWXkRkPWvQAA1%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;614&quot; height=&quot;170&quot; data-filename=&quot;스크린샷 2026-06-23 101351.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt;DA_PlayerInputConfig &amp;rarr; Context, Actions 설정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101443.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ynIb/dJMcaijtUzj/kguiWbfEdMPwSj4ySkSUT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ynIb/dJMcaijtUzj/kguiWbfEdMPwSj4ySkSUT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ynIb/dJMcaijtUzj/kguiWbfEdMPwSj4ySkSUT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ynIb%2FdJMcaijtUzj%2FkguiWbfEdMPwSj4ySkSUT1%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;820&quot; height=&quot;452&quot; data-filename=&quot;스크린샷 2026-06-23 101443.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PlayerCharacter.h&lt;/b&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;InputMappingContext, Move, Look, Jump 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101525.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9IUyw/dJMcabq8CP0/GcW6U2YUSKZyoVnK972d71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9IUyw/dJMcabq8CP0/GcW6U2YUSKZyoVnK972d71/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9IUyw/dJMcabq8CP0/GcW6U2YUSKZyoVnK972d71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9IUyw%2FdJMcabq8CP0%2FGcW6U2YUSKZyoVnK972d71%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;664&quot; height=&quot;487&quot; data-filename=&quot;스크린샷 2026-06-23 101525.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&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;PlayerInputConfig 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101626.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/on1qq/dJMcacKobgb/ks0oe863ohC76TKTHCnD20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/on1qq/dJMcacKobgb/ks0oe863ohC76TKTHCnD20/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/on1qq/dJMcacKobgb/ks0oe863ohC76TKTHCnD20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fon1qq%2FdJMcacKobgb%2Fks0oe863ohC76TKTHCnD20%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;629&quot; height=&quot;487&quot; data-filename=&quot;스크린샷 2026-06-23 101626.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PlayerCharacter.cpp&amp;nbsp;&lt;/b&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;#include &quot;PlayerInputConfigDataAsset.h&quot; 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101736.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZEDl/dJMcabq8CP5/rvz0yeImlqzy5MH7od2zT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZEDl/dJMcabq8CP5/rvz0yeImlqzy5MH7od2zT1/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZEDl/dJMcabq8CP5/rvz0yeImlqzy5MH7od2zT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZEDl%2FdJMcabq8CP5%2Frvz0yeImlqzy5MH7od2zT1%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;210&quot; data-filename=&quot;스크린샷 2026-06-23 101736.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&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;span data-token-index=&quot;0&quot;&gt;BeginPlay 수정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101826.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBS0l/dJMcabq8CQb/JKQQKhC0F1vvBbH34QVII1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBS0l/dJMcabq8CQb/JKQQKhC0F1vvBbH34QVII1/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBS0l/dJMcabq8CQb/JKQQKhC0F1vvBbH34QVII1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBS0l%2FdJMcabq8CQb%2FJKQQKhC0F1vvBbH34QVII1%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;808&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2026-06-23 101826.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&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;span data-token-index=&quot;0&quot;&gt;SetupPlayerInputComponent 수정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 101917.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lh4dW/dJMcacKobgo/7JrReLYEFJGKwEisPOUaZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lh4dW/dJMcacKobgo/7JrReLYEFJGKwEisPOUaZ1/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lh4dW/dJMcacKobgo/7JrReLYEFJGKwEisPOUaZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flh4dW%2FdJMcacKobgo%2F7JrReLYEFJGKwEisPOUaZ1%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;762&quot; height=&quot;439&quot; data-filename=&quot;스크린샷 2026-06-23 101917.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BP_PlayerCharacter&amp;nbsp;슬롯&amp;nbsp;갱신&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Player Input Config&lt;/span&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;span data-token-index=&quot;2&quot;&gt;DA_PlayerInputConfig&lt;/span&gt; 할당 &amp;rarr; PIE 테스트 진행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 102751.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zTuTI/dJMcacDCrVr/OswjSVTsvCICzZbITMvDu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zTuTI/dJMcacDCrVr/OswjSVTsvCICzZbITMvDu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zTuTI/dJMcacDCrVr/OswjSVTsvCICzZbITMvDu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzTuTI%2FdJMcacDCrVr%2FOswjSVTsvCICzZbITMvDu0%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;462&quot; data-filename=&quot;스크린샷 2026-06-23 102751.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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 data-ke-size=&quot;size16&quot;&gt;FPS_Weapon_Bundle 다운&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 104417.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/npmjd/dJMcacQ3LFZ/1K9zjteRIjurlaHQqpYptK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/npmjd/dJMcacQ3LFZ/1K9zjteRIjurlaHQqpYptK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/npmjd/dJMcacQ3LFZ/1K9zjteRIjurlaHQqpYptK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnpmjd%2FdJMcacQ3LFZ%2F1K9zjteRIjurlaHQqpYptK%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;624&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2026-06-23 104417.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;672&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;언리얼 에디터 &amp;rarr; Fab으로 접속할 때 가끔 로그인이 풀리는 경우가 있음 &amp;rarr; 그럴 경우 다운이 아예 안되는 경우가 있으니 주의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 105539.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8g41K/dJMcadbjYuI/EixelfdsT543C89UpmvlOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8g41K%2FdJMcadbjYuI%2FEixelfdsT543C89UpmvlOK%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;251&quot; height=&quot;397&quot; data-filename=&quot;스크린샷 2026-06-23 105539.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;External 폴더 &amp;rarr; &lt;span data-token-index=&quot;0&quot;&gt;Move Here &amp;rarr; External 폴더 &lt;span data-token-index=&quot;0&quot;&gt;Update Redirector References &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mW11i/dJMcafAiYYa/ExAkx7eulYIt2v6SZiaV4k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mW11i/dJMcafAiYYa/ExAkx7eulYIt2v6SZiaV4k/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mW11i/dJMcafAiYYa/ExAkx7eulYIt2v6SZiaV4k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmW11i%2FdJMcafAiYYa%2FExAkx7eulYIt2v6SZiaV4k%2Fimg.webp&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;486&quot; height=&quot;372&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;501&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;FPS_Weapon_Bundle 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 에디터, 폴더 안에 있는 FPS_Weapon_Bundle 탐색기로 들어가서 수동으로 삭제하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BdlPr/dJMcacp4mA4/JVUZu0kIOC7K2V8li4xI1k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BdlPr/dJMcacp4mA4/JVUZu0kIOC7K2V8li4xI1k/img.webp&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;826&quot; data-filename=&quot;스크린샷_2026-05-29_092155.webp&quot; style=&quot;width: 28.9951%; margin-right: 10px;&quot; data-widthpercent=&quot;29.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BdlPr/dJMcacp4mA4/JVUZu0kIOC7K2V8li4xI1k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBdlPr%2FdJMcacp4mA4%2FJVUZu0kIOC7K2V8li4xI1k%2Fimg.webp&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;826&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F2lVp/dJMcajo3yRP/5FupuyEkRhZEQ9aLNgj06k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F2lVp/dJMcajo3yRP/5FupuyEkRhZEQ9aLNgj06k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;341&quot; data-filename=&quot;스크린샷 2026-06-23 110313.png&quot; style=&quot;width: 69.8421%;&quot; data-widthpercent=&quot;70.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2lVp/dJMcajo3yRP/5FupuyEkRhZEQ9aLNgj06k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF2lVp%2FdJMcajo3yRP%2F5FupuyEkRhZEQ9aLNgj06k%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;712&quot; height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/div&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;삭제 후 Content 폴더 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 110525.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf1qXn/dJMcadI9nhn/wSmEvx7rEtfKsKMKHhRobk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf1qXn/dJMcadI9nhn/wSmEvx7rEtfKsKMKHhRobk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf1qXn/dJMcadI9nhn/wSmEvx7rEtfKsKMKHhRobk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf1qXn%2FdJMcadI9nhn%2FwSmEvx7rEtfKsKMKHhRobk%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;650&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2026-06-23 110525.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; EquippedWeaponMesh 컴포넌트 추가&lt;/b&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;무기 메시를 들고 다닐 슬롯 1개를 캐릭터에 추가&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: #777777; text-align: center;&quot;&gt;&lt;/span&gt;PlayerCharacter.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 110846.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyBg3/dJMcabLvbAt/p4u7jg3IKd3pWOVzPGDA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyBg3/dJMcabLvbAt/p4u7jg3IKd3pWOVzPGDA60/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyBg3/dJMcabLvbAt/p4u7jg3IKd3pWOVzPGDA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyBg3%2FdJMcabLvbAt%2Fp4u7jg3IKd3pWOVzPGDA60%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;607&quot; height=&quot;771&quot; data-filename=&quot;스크린샷 2026-06-23 110846.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&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;PlayerCharacter.cpp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 110916.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p3I3o/dJMcaaMvYIu/hGMuODWIAJs4EYubhzdrq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p3I3o/dJMcaaMvYIu/hGMuODWIAJs4EYubhzdrq0/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p3I3o/dJMcaaMvYIu/hGMuODWIAJs4EYubhzdrq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp3I3o%2FdJMcaaMvYIu%2FhGMuODWIAJs4EYubhzdrq0%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;712&quot; height=&quot;524&quot; data-filename=&quot;스크린샷 2026-06-23 110916.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BP_PlayerCharacter &amp;rarr; EquippedWeaponMesh 생성되었는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 111207.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RUGtf/dJMcagF1yPf/KFmtS2p5c8IYiX0bryPgn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RUGtf/dJMcagF1yPf/KFmtS2p5c8IYiX0bryPgn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RUGtf/dJMcagF1yPf/KFmtS2p5c8IYiX0bryPgn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRUGtf%2FdJMcagF1yPf%2FKFmtS2p5c8IYiX0bryPgn1%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;447&quot; height=&quot;253&quot; data-filename=&quot;스크린샷 2026-06-23 111207.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UWeaponDataAsset C++ 클래스 만들기&lt;/b&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;New C++ Class &amp;rarr; &lt;span data-token-index=&quot;1&quot;&gt;DataAsset&lt;/span&gt; 생성 &amp;rarr; 이름설정 &lt;span data-token-index=&quot;0&quot;&gt;WeaponDataAsset&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 111714.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4xwIj/dJMcaa6RPXH/b7zpaXCh7iBYSJpae8OAG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4xwIj/dJMcaa6RPXH/b7zpaXCh7iBYSJpae8OAG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4xwIj/dJMcaa6RPXH/b7zpaXCh7iBYSJpae8OAG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4xwIj%2FdJMcaa6RPXH%2Fb7zpaXCh7iBYSJpae8OAG0%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;387&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2026-06-23 111714.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WeaponDataAsset.h&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BlueprintType &amp;rarr; enum 타입을 블루프린트 변수나 핀 타입으로 쓸 수 있게 노출하는 지정자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FTransform = Location + Rotation + Scale 을 한 묶음으로 담는 구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FTransform::Identity &amp;rarr; 추가 보정 없음 (기본값)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Location (0,0,0)&lt;/li&gt;
&lt;li&gt;Rotation (0,0,0)&lt;/li&gt;
&lt;li&gt;Scale (1,1,1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 111940.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1nSvu/dJMcaiqeF7E/aj2bF0STWePf7XiK2umY21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1nSvu/dJMcaiqeF7E/aj2bF0STWePf7XiK2umY21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1nSvu/dJMcaiqeF7E/aj2bF0STWePf7XiK2umY21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1nSvu%2FdJMcaiqeF7E%2Faj2bF0STWePf7XiK2umY21%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;592&quot; height=&quot;734&quot; data-filename=&quot;스크린샷 2026-06-23 111940.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DA_Weapon_Sniper&amp;nbsp;/&amp;nbsp;Grenade&amp;nbsp;/&amp;nbsp;Machine&amp;nbsp;인스턴스&amp;nbsp;만들기&lt;/b&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;1. Content 파일에 &lt;span data-token-index=&quot;0&quot;&gt;Weapons 폴더 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;2. Miscellaneous &amp;rarr; &lt;span data-token-index=&quot;1&quot;&gt;Data Asset&lt;/span&gt; &amp;rarr; 부모 &lt;span data-token-index=&quot;3&quot;&gt;WeaponDataAsset 3개 생성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 112352.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2Fj7/dJMcacXRC2Y/jOPodXhF9eP2qK3Bg8ksaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2Fj7/dJMcacXRC2Y/jOPodXhF9eP2qK3Bg8ksaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2Fj7/dJMcacXRC2Y/jOPodXhF9eP2qK3Bg8ksaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2Fj7%2FdJMcacXRC2Y%2FjOPodXhF9eP2qK3Bg8ksaK%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;785&quot; height=&quot;446&quot; data-filename=&quot;스크린샷 2026-06-23 112352.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;446&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;span style=&quot;letter-spacing: 0px;&quot;&gt;DA_Weapon_Grenade / &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DA_Weapon_Machine / DA_Weapon_Sniper&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 112704.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxwSq4/dJMcaaMvZwi/nBGw9P6eqkpMbebRpoEQC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxwSq4/dJMcaaMvZwi/nBGw9P6eqkpMbebRpoEQC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxwSq4/dJMcaaMvZwi/nBGw9P6eqkpMbebRpoEQC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxwSq4%2FdJMcaaMvZwi%2FnBGw9P6eqkpMbebRpoEQC1%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;518&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2026-06-23 112704.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;280&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;WeaponType, Mesh, Damage 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 113248.png&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZzL58/dJMcaiKuQcu/8gBs3zX90ccOME4KIIxPH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZzL58/dJMcaiKuQcu/8gBs3zX90ccOME4KIIxPH0/img.png&quot; data-alt=&quot;DA_Weapon_Grenade&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZzL58/dJMcaiKuQcu/8gBs3zX90ccOME4KIIxPH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZzL58%2FdJMcaiKuQcu%2F8gBs3zX90ccOME4KIIxPH0%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;723&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2026-06-23 113248.png&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DA_Weapon_Grenade&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 113302.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lWq9T/dJMcah5ZUdZ/brn3fAnujCHRK2DnudyGgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWq9T/dJMcah5ZUdZ/brn3fAnujCHRK2DnudyGgk/img.png&quot; data-alt=&quot;DA_Weapon_Machine&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWq9T/dJMcah5ZUdZ/brn3fAnujCHRK2DnudyGgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWq9T%2FdJMcah5ZUdZ%2Fbrn3fAnujCHRK2DnudyGgk%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;724&quot; height=&quot;305&quot; data-filename=&quot;스크린샷 2026-06-23 113302.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DA_Weapon_Machine&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 113404.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfSdYQ/dJMcaff2biM/jXZmYn6onylZ6mRu0RibMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfSdYQ/dJMcaff2biM/jXZmYn6onylZ6mRu0RibMk/img.png&quot; data-alt=&quot;DA_Weapon_Sniper&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfSdYQ/dJMcaff2biM/jXZmYn6onylZ6mRu0RibMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfSdYQ%2FdJMcaff2biM%2FjXZmYn6onylZ6mRu0RibMk%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;319&quot; data-filename=&quot;스크린샷 2026-06-23 113404.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DA_Weapon_Sniper&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;IA 3개 추가 (Sniper / Grenade / Machine)&lt;/p&gt;
&lt;table id=&quot;0966e60a-b18e-4b8f-bbc8-ccdd7b6dd849&quot; style=&quot;border-collapse: collapse; width: 29.0698%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 18.0419%;&quot;&gt;&lt;b&gt; 에셋 이름 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 20.6618%;&quot;&gt;Value Type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;f7f35fdd-293f-4f32-9ee2-bc70f7d82d28&quot;&gt;
&lt;td id=&quot;gD=Q&quot; style=&quot;width: 18.0419%;&quot;&gt;&lt;b&gt;IA_Sniper&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;:O&amp;lt;l&quot; style=&quot;width: 20.6618%; text-align: center;&quot;&gt;Digital (bool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;75fb5218-7e0d-4b64-bcd0-6e650049ba63&quot;&gt;
&lt;td id=&quot;gD=Q&quot; style=&quot;width: 18.0419%;&quot;&gt;&lt;b&gt;IA_Grenade&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;:O&amp;lt;l&quot; style=&quot;width: 20.6618%; text-align: center;&quot;&gt;Digital (bool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;5539981e-6229-4764-83e4-a8141016c79d&quot;&gt;
&lt;td id=&quot;gD=Q&quot; style=&quot;width: 18.0419%;&quot;&gt;&lt;b&gt;IA_Machine&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;:O&amp;lt;l&quot; style=&quot;width: 20.6618%; text-align: center;&quot;&gt;Digital (bool)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 113740.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJuBQ/dJMcai4MnSg/OOkXSExtvOs8rTVMSQmUc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJuBQ/dJMcai4MnSg/OOkXSExtvOs8rTVMSQmUc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJuBQ/dJMcai4MnSg/OOkXSExtvOs8rTVMSQmUc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJuBQ%2FdJMcai4MnSg%2FOOkXSExtvOs8rTVMSQmUc1%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;708&quot; height=&quot;213&quot; data-filename=&quot;스크린샷 2026-06-23 113740.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; IMC 키 매핑&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;IMC_PlayerInputMapping&lt;/span&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;A_Sniper &amp;rarr; 키 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IA_Grenade &amp;rarr; 키 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IA_Machine &amp;rarr; 키 3&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 114116.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP7rpb/dJMcaaFOfdz/pAyCZbJxzsgI7aViyXHKN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP7rpb/dJMcaaFOfdz/pAyCZbJxzsgI7aViyXHKN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP7rpb/dJMcaaFOfdz/pAyCZbJxzsgI7aViyXHKN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP7rpb%2FdJMcaaFOfdz%2FpAyCZbJxzsgI7aViyXHKN0%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;485&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2026-06-23 114116.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; PIC에 슬롯 추가&lt;/b&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;PlayerInputConfigDataAsset.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 114327.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do3wIH/dJMcadoR1OJ/S0NcDSp2ZmhdjzSOyBy5H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do3wIH/dJMcadoR1OJ/S0NcDSp2ZmhdjzSOyBy5H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do3wIH/dJMcadoR1OJ/S0NcDSp2ZmhdjzSOyBy5H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo3wIH%2FdJMcadoR1OJ%2FS0NcDSp2ZmhdjzSOyBy5H0%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;682&quot; height=&quot;609&quot; data-filename=&quot;스크린샷 2026-06-23 114327.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;DA_PlayerInputConfig (IA_Sniper, IA_Grenade, IA_Machine 슬롯 채우기)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 114536.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buuq0L/dJMcah5ZUF1/cSUkcbKT9TTpAfL6emZyik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buuq0L/dJMcah5ZUF1/cSUkcbKT9TTpAfL6emZyik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buuq0L/dJMcah5ZUF1/cSUkcbKT9TTpAfL6emZyik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuuq0L%2FdJMcah5ZUF1%2FcSUkcbKT9TTpAfL6emZyik%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;701&quot; height=&quot;589&quot; data-filename=&quot;스크린샷 2026-06-23 114536.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; APlayerCharacter에 무기 전환 로직&lt;/b&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;PlayerCharacter.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115034.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpHVC/dJMb997TKWQ/l9abfwp6L4bTPxzlKoqxS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpHVC/dJMb997TKWQ/l9abfwp6L4bTPxzlKoqxS1/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpHVC/dJMb997TKWQ/l9abfwp6L4bTPxzlKoqxS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvpHVC%2FdJMb997TKWQ%2Fl9abfwp6L4bTPxzlKoqxS1%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;690&quot; height=&quot;214&quot; data-filename=&quot;스크린샷 2026-06-23 115034.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115106.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvNLGQ/dJMcaa6RQYR/foPnQ0xkG8PpS8gf0ZkaAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvNLGQ/dJMcaa6RQYR/foPnQ0xkG8PpS8gf0ZkaAk/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvNLGQ/dJMcaa6RQYR/foPnQ0xkG8PpS8gf0ZkaAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvNLGQ%2FdJMcaa6RQYR%2FfoPnQ0xkG8PpS8gf0ZkaAk%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;689&quot; height=&quot;699&quot; data-filename=&quot;스크린샷 2026-06-23 115106.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&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;PlayerCharacter.cpp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115922.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IX9c2/dJMcafNTl20/jyucCUQkXL4r4oWWWkyTNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IX9c2/dJMcafNTl20/jyucCUQkXL4r4oWWWkyTNK/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IX9c2/dJMcafNTl20/jyucCUQkXL4r4oWWWkyTNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIX9c2%2FdJMcafNTl20%2FjyucCUQkXL4r4oWWWkyTNK%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;480&quot; height=&quot;233&quot; data-filename=&quot;스크린샷 2026-06-23 115922.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115412.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwOtG/dJMcaalo7ak/3NRiOVRrTaXSXeoHvW4keK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwOtG/dJMcaalo7ak/3NRiOVRrTaXSXeoHvW4keK/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwOtG/dJMcaalo7ak/3NRiOVRrTaXSXeoHvW4keK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwOtG%2FdJMcaalo7ak%2F3NRiOVRrTaXSXeoHvW4keK%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;683&quot; height=&quot;666&quot; data-filename=&quot;스크린샷 2026-06-23 115412.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&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;BeginPlay 끝에 기본 무기 장착&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115514.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIBBNK/dJMcaaThXT4/PPapja6fiib8eglBmgLIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIBBNK/dJMcaaThXT4/PPapja6fiib8eglBmgLIH1/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIBBNK/dJMcaaThXT4/PPapja6fiib8eglBmgLIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIBBNK%2FdJMcaaThXT4%2FPPapja6fiib8eglBmgLIH1%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;709&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2026-06-23 115514.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&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;SetupPlayerInputComponent 바인딩 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 115624.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6B8f/dJMcadvCc7H/R4D3sbKz0wynDbkSMH9aj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6B8f/dJMcadvCc7H/R4D3sbKz0wynDbkSMH9aj0/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6B8f/dJMcadvCc7H/R4D3sbKz0wynDbkSMH9aj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6B8f%2FdJMcadvCc7H%2FR4D3sbKz0wynDbkSMH9aj0%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;733&quot; height=&quot;576&quot; data-filename=&quot;스크린샷 2026-06-23 115624.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;BP_PlayerCharacter에 DA 3개 할당&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;BP_PlayerCharacter&lt;/span&gt; Class Defaults &amp;rarr; &lt;span data-token-index=&quot;2&quot;&gt;Weapon 카테고리에 에셋 할당&lt;/span&gt;&lt;span data-token-index=&quot;2&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 120329.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;845&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvpkdV/dJMcacDCvKS/eecnu4LGfAvk6KE7UojgM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvpkdV/dJMcacDCvKS/eecnu4LGfAvk6KE7UojgM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvpkdV/dJMcacDCvKS/eecnu4LGfAvk6KE7UojgM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvpkdV%2FdJMcacDCvKS%2Feecnu4LGfAvk6KE7UojgM1%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;415&quot; height=&quot;703&quot; data-filename=&quot;스크린샷 2026-06-23 120329.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;845&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; PIE 테스트 / 무기 전환&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;1번 &amp;rarr; Sniper (이미 들고 있음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 121307.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewqRuH/dJMcabLvept/mf5TwB9R9tPAG7La8YVvQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewqRuH/dJMcabLvept/mf5TwB9R9tPAG7La8YVvQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewqRuH/dJMcabLvept/mf5TwB9R9tPAG7La8YVvQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewqRuH%2FdJMcabLvept%2Fmf5TwB9R9tPAG7La8YVvQ1%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;381&quot; height=&quot;250&quot; data-filename=&quot;스크린샷 2026-06-23 121307.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;395&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;2번 &amp;rarr; Grenade&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 121318.png&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLesM/dJMcab5Jm90/0eHnwLHoK9GFU91Gzy8R60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLesM/dJMcab5Jm90/0eHnwLHoK9GFU91Gzy8R60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLesM/dJMcab5Jm90/0eHnwLHoK9GFU91Gzy8R60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLesM%2FdJMcab5Jm90%2F0eHnwLHoK9GFU91Gzy8R60%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;384&quot; height=&quot;286&quot; data-filename=&quot;스크린샷 2026-06-23 121318.png&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;374&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;3번 &amp;rarr; Machine&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 121334.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOWtBR/dJMcaasfrXI/mHXxVr34AjJGEaVeSsnWl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOWtBR/dJMcaasfrXI/mHXxVr34AjJGEaVeSsnWl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOWtBR/dJMcaasfrXI/mHXxVr34AjJGEaVeSsnWl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOWtBR%2FdJMcaasfrXI%2FmHXxVr34AjJGEaVeSsnWl0%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;386&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2026-06-23 121334.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;386&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;메시가 손에서 어색하지 않게 DA_Weapon_ &amp;rarr; &lt;span data-token-index=&quot;0&quot;&gt;AttachTransform&lt;/span&gt; 조정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 121134.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o1cys/dJMcabEDtA9/8bEjuPBCrovGbxgXbJZuQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o1cys/dJMcabEDtA9/8bEjuPBCrovGbxgXbJZuQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o1cys/dJMcabEDtA9/8bEjuPBCrovGbxgXbJZuQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo1cys%2FdJMcabEDtA9%2F8bEjuPBCrovGbxgXbJZuQ0%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;1442&quot; height=&quot;598&quot; data-filename=&quot;스크린샷 2026-06-23 121134.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;598&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 122426.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch7Bg5/dJMb99NyhzV/OpNS6UwOytG9sBS0TFomvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch7Bg5/dJMb99NyhzV/OpNS6UwOytG9sBS0TFomvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch7Bg5/dJMb99NyhzV/OpNS6UwOytG9sBS0TFomvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch7Bg5%2FdJMb99NyhzV%2FOpNS6UwOytG9sBS0TFomvk%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;677&quot; height=&quot;296&quot; data-filename=&quot;스크린샷 2026-06-23 122426.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 122440.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RlvGO/dJMcaiqeIi4/z2ZwY0IhhhfzEeBNE37k00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RlvGO/dJMcaiqeIi4/z2ZwY0IhhhfzEeBNE37k00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RlvGO/dJMcaiqeIi4/z2ZwY0IhhhfzEeBNE37k00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRlvGO%2FdJMcaiqeIi4%2Fz2ZwY0IhhhfzEeBNE37k00%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;676&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2026-06-23 122440.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 122451.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc1HIJ/dJMb99Nyhz5/4OkwvzUGN4i4uOL3pEboD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc1HIJ/dJMb99Nyhz5/4OkwvzUGN4i4uOL3pEboD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc1HIJ/dJMb99Nyhz5/4OkwvzUGN4i4uOL3pEboD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc1HIJ%2FdJMb99Nyhz5%2F4OkwvzUGN4i4uOL3pEboD1%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;676&quot; height=&quot;292&quot; data-filename=&quot;스크린샷 2026-06-23 122451.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;IA_Fire 추가 / Value Type : Digital bool&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 122735.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFzc0/dJMcaaMv2ga/Acmwh7h0lhuBdrnsJKQZNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFzc0/dJMcaaMv2ga/Acmwh7h0lhuBdrnsJKQZNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFzc0/dJMcaaMv2ga/Acmwh7h0lhuBdrnsJKQZNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFzc0%2FdJMcaaMv2ga%2FAcmwh7h0lhuBdrnsJKQZNK%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;333&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2026-06-23 122735.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;274&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;IMC_PlayerInputMapping &amp;rarr;&amp;nbsp;&lt;span data-token-index=&quot;1&quot;&gt;Left Mouse Button &amp;rarr; IA_Fire&lt;/span&gt; 매핑&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 122917.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSjEh/dJMcaiqeIAt/AiiASsfDFMW29UuKILCkY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSjEh/dJMcaiqeIAt/AiiASsfDFMW29UuKILCkY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSjEh/dJMcaiqeIAt/AiiASsfDFMW29UuKILCkY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSjEh%2FdJMcaiqeIAt%2FAiiASsfDFMW29UuKILCkY0%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;481&quot; height=&quot;449&quot; data-filename=&quot;스크린샷 2026-06-23 122917.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; PIC에 FireAction 추가 &lt;/b&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;PlayerInputConfigDataAsset.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 123110.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX9bG9/dJMcaaThZfN/K237oMAoQeyAkATN6bQEUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX9bG9/dJMcaaThZfN/K237oMAoQeyAkATN6bQEUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX9bG9/dJMcaaThZfN/K237oMAoQeyAkATN6bQEUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX9bG9%2FdJMcaaThZfN%2FK237oMAoQeyAkATN6bQEUk%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;624&quot; height=&quot;581&quot; data-filename=&quot;스크린샷 2026-06-23 123110.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 123225.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTbA87/dJMcabY0pRT/ZZjFyUiMer2fbTBxf8fBA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTbA87/dJMcabY0pRT/ZZjFyUiMer2fbTBxf8fBA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTbA87/dJMcabY0pRT/ZZjFyUiMer2fbTBxf8fBA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTbA87%2FdJMcabY0pRT%2FZZjFyUiMer2fbTBxf8fBA1%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;604&quot; height=&quot;539&quot; data-filename=&quot;스크린샷 2026-06-23 123225.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; APlayerCharacter &amp;rarr; FireGun&lt;/b&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;PlayerCharacter.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 123414.png&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CqOQo/dJMcageTJEP/JHiFv6Z54u4ffKCRHkDY8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CqOQo/dJMcageTJEP/JHiFv6Z54u4ffKCRHkDY8k/img.png&quot; data-alt=&quot;PlayerCharacter.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CqOQo/dJMcageTJEP/JHiFv6Z54u4ffKCRHkDY8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCqOQo%2FdJMcageTJEP%2FJHiFv6Z54u4ffKCRHkDY8k%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;705&quot; height=&quot;402&quot; data-filename=&quot;스크린샷 2026-06-23 123414.png&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.h&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;PlayerCharacter.cpp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 123501.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/my26k/dJMcageTJIM/RGaLn6rqdKvc7fuh05YNM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/my26k/dJMcageTJIM/RGaLn6rqdKvc7fuh05YNM1/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/my26k/dJMcageTJIM/RGaLn6rqdKvc7fuh05YNM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmy26k%2FdJMcageTJIM%2FRGaLn6rqdKvc7fuh05YNM1%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;444&quot; height=&quot;261&quot; data-filename=&quot;스크린샷 2026-06-23 123501.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 123833.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEeL52/dJMcagzblUT/dvuXekVsUUNAjVmV0KhhK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEeL52/dJMcagzblUT/dvuXekVsUUNAjVmV0KhhK0/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEeL52/dJMcagzblUT/dvuXekVsUUNAjVmV0KhhK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEeL52%2FdJMcagzblUT%2FdvuXekVsUUNAjVmV0KhhK0%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;689&quot; height=&quot;760&quot; data-filename=&quot;스크린샷 2026-06-23 123833.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&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;SetupPlayerInputComponent 바인딩 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 124010.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZMemN/dJMcaa6RTfJ/CZ84ZbYLCEk9aDid6SpO2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZMemN/dJMcaa6RTfJ/CZ84ZbYLCEk9aDid6SpO2K/img.png&quot; data-alt=&quot;PlayerCharacter.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZMemN/dJMcaa6RTfJ/CZ84ZbYLCEk9aDid6SpO2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZMemN%2FdJMcaa6RTfJ%2FCZ84ZbYLCEk9aDid6SpO2K%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;684&quot; height=&quot;606&quot; data-filename=&quot;스크린샷 2026-06-23 124010.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PlayerCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 최종 PIE 테스트&lt;/b&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;span data-token-index=&quot;0&quot;&gt;이동&lt;/span&gt;: WASD / 마우스 시점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;점프&lt;/span&gt;: Space&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;무기 전환&lt;/span&gt;: &lt;span data-token-index=&quot;2&quot;&gt;1&lt;/span&gt; (저격) / &lt;span data-token-index=&quot;4&quot;&gt;2&lt;/span&gt; (유탄) / &lt;span data-token-index=&quot;6&quot;&gt;3&lt;/span&gt; (머신건)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;발사&lt;/span&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;좌클릭 시 1번 무기 저격일때만 빨간 라인 + 충돌점 노란 구가 생기는 것을 확인 가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 124248.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Vq5B/dJMcacp4ruN/f5noSSwSr1SwmSvNQM62W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Vq5B/dJMcacp4ruN/f5noSSwSr1SwmSvNQM62W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Vq5B/dJMcacp4ruN/f5noSSwSr1SwmSvNQM62W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Vq5B%2FdJMcacp4ruN%2Ff5noSSwSr1SwmSvNQM62W1%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;691&quot; height=&quot;529&quot; data-filename=&quot;스크린샷 2026-06-23 124248.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;529&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;Output Log 창 바닥에 HIT 되어서 50의 데미지가 들어간 것을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 124434.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqlnWy/dJMcaasftIF/G1BBDb2K2lBnkMTQMs9m91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqlnWy/dJMcaasftIF/G1BBDb2K2lBnkMTQMs9m91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqlnWy/dJMcaasftIF/G1BBDb2K2lBnkMTQMs9m91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqlnWy%2FdJMcaasftIF%2FG1BBDb2K2lBnkMTQMs9m91%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;393&quot; height=&quot;283&quot; data-filename=&quot;스크린샷 2026-06-23 124434.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;283&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;</description>
      <category>기초반 강의</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/82</guid>
      <comments>https://jh009.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 23 Jun 2026 12:47:05 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 4-1</title>
      <link>https://jh009.tistory.com/81</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 4-1. &lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;UI 위젯 설계와 실시간 데이터 연동하기&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;1. UMG (Unreal Motion Graphics) 위젯 기초 디자인 이해하기&lt;/span&gt;&lt;/h4&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;HUD (Heads-Up Dispaly)&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;/li&gt;
&lt;li&gt;게임 중 화면의 일부에 배치&lt;/li&gt;
&lt;li&gt;플레이어가 현재 게임 상황을 이해하는 데 필요한 체력, 미니맵, 퀘스트 업데이트와 같은 데이터를 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 언리얼 엔진의 HUD 시스템&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Canvas 기반 HUD
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AHUD 클래스를 상속하여 구현&lt;/li&gt;
&lt;li&gt;기본적인 2D 그리기 작업(텍스트, 이미지 등) 가능&lt;/li&gt;
&lt;li&gt;레거시 방식으로 간주되며, 간단한 HUD에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UMG (Unreal Motion Graphics)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언리얼 엔진의 Widget Blueprint를 이용한 UI 시스템&lt;/li&gt;
&lt;li&gt;더 직관적이고 강력한 HUD 디자인 가능&lt;/li&gt;
&lt;li&gt;다양한 위젯(Text, Button, Image 등)을 사용하여 HUD를 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;위젯 블루프린트 (&lt;/span&gt;Widget Blueprint) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진에서 &lt;span data-token-index=&quot;1&quot;&gt;UI (User Interface)를 시각적으로 설계&lt;/span&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;Contents 하위에 UI 폴더 생성 &amp;rarr; 그 하위에 Widget 폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Widget 폴더에서 우클릭 &amp;rarr; User Interface &amp;rarr; Widget Blueprint 선택 &amp;rarr; 이름설정 (WBP_HUD)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZunQK/dJMcaaeHkUw/l2AkxKmLgsXiQIT3MsUB2K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZunQK/dJMcaaeHkUw/l2AkxKmLgsXiQIT3MsUB2K/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZunQK/dJMcaaeHkUw/l2AkxKmLgsXiQIT3MsUB2K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZunQK%2FdJMcaaeHkUw%2Fl2AkxKmLgsXiQIT3MsUB2K%2Fimg.webp&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;611&quot; height=&quot;175&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;UI 요소 (UI Elements&lt;/span&gt;) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 상단 Palette 탭 &amp;rarr; 다양한 UI 요소들을 제공&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Text Block: 캐릭터 체력, 점수, 남은 시간 등 텍스트를 보여줄 때&lt;/li&gt;
&lt;li&gt;Button: Start Game, Quit Game 등 클릭 이벤트가 필요한 메뉴 버튼&lt;/li&gt;
&lt;li&gt;Progress Bar: 체력 게이지나 로딩 게이지 등을 시각적으로 표시할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;점수, 시간, 레벨 표시를 위한 UI Widget 디자인&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 data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt;Canvas Panel&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Palette &amp;rarr; Panel &amp;rarr; Canvas Panel&lt;/li&gt;
&lt;li&gt;모든 UI 요소를 포함할 수 있는 큰 도화지 같은 역할&lt;/li&gt;
&lt;li&gt;UI 요소들을 자유롭게 배치할 수 있는 가장 기본적인 레이아웃 패널&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1nEbT/dJMcahrnAqQ/JQ3bbJKo2WAWXAWEL0JFg0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1nEbT/dJMcahrnAqQ/JQ3bbJKo2WAWXAWEL0JFg0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1nEbT/dJMcahrnAqQ/JQ3bbJKo2WAWXAWEL0JFg0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1nEbT%2FdJMcahrnAqQ%2FJQ3bbJKo2WAWXAWEL0JFg0%2Fimg.webp&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;671&quot; height=&quot;853&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;853&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;1920 x 1080 (16:9) 사이즈로 설정을 위해 21.5-24&amp;rdquo; monitor를 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x2h3A/dJMcahrnAqO/y21Xp4qyJafJw3eGOjDbBK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x2h3A/dJMcahrnAqO/y21Xp4qyJafJw3eGOjDbBK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x2h3A/dJMcahrnAqO/y21Xp4qyJafJw3eGOjDbBK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx2h3A%2FdJMcahrnAqO%2Fy21Xp4qyJafJw3eGOjDbBK%2Fimg.webp&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;281&quot; height=&quot;240&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원하는 Font 에셋 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼엔진에서는 기본적으로 Roboto 폰트 스타일만은 제공&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;폰트 스타일을 적용하기 위해서는 콘텐츠 폴더에 Font 를 import 해야함&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;원하는 폰트 파일 다운 (.ttf / .otf 확장자를 가진 폰트 파일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contents - UI - Fonts 폴더 만들기 &amp;rarr; 폴더 에서 마우스 우클릭 &amp;rarr; Import to /Game/UI/Fonts 클릭 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; .ttf , .otf 폰트 파일을 선택&amp;nbsp; &amp;rarr; 언리얼 엔진 내로 임포트가 진행&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;생성된 Font Asset 을 Font Family 를 지정할 때 이 에셋을 적용할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 200144.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8EryO/dJMcahEPqXP/1H9yYKaCobtWHZDcrglkAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8EryO/dJMcahEPqXP/1H9yYKaCobtWHZDcrglkAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8EryO/dJMcahEPqXP/1H9yYKaCobtWHZDcrglkAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8EryO%2FdJMcahEPqXP%2F1H9yYKaCobtWHZDcrglkAk%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;493&quot; data-filename=&quot;스크린샷 2026-06-22 200144.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;2.&amp;nbsp;HUD&amp;nbsp;Widget을&amp;nbsp;생성해&amp;nbsp;화면에&amp;nbsp;표시하기&lt;/span&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Widget (HUD나 UI 요소)은 보통 &lt;span data-token-index=&quot;1&quot;&gt;PlayerController&lt;/span&gt;에서 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Widget이 플레이어의 입력과 상호작용하며 화면에 표시되는 요소&lt;/span&gt;이기 때문임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 201154.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVy8jy/dJMcaff1S5z/TDel5ckQWajzC5MxtxBLKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVy8jy/dJMcaff1S5z/TDel5ckQWajzC5MxtxBLKK/img.png&quot; data-alt=&quot;SpartaPlayerController.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVy8jy/dJMcaff1S5z/TDel5ckQWajzC5MxtxBLKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVy8jy%2FdJMcaff1S5z%2FTDel5ckQWajzC5MxtxBLKK%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;632&quot; height=&quot;756&quot; data-filename=&quot;스크린샷 2026-06-22 201154.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaPlayerController.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 201228.png&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wRm09/dJMcaaThIcL/irNUs5ccz9rkNe0vTUzXwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wRm09/dJMcaaThIcL/irNUs5ccz9rkNe0vTUzXwk/img.png&quot; data-alt=&quot;SpartaPlayerController.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wRm09/dJMcaaThIcL/irNUs5ccz9rkNe0vTUzXwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwRm09%2FdJMcaaThIcL%2FirNUs5ccz9rkNe0vTUzXwk%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;643&quot; height=&quot;837&quot; data-filename=&quot;스크린샷 2026-06-22 201228.png&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaPlayerController.cpp&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;SpartaPlayerController &amp;rarr; HUD Widget 표시 로직을 넣기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASpartaPlayerController.h &amp;rarr; TSubclassOf&amp;lt;UUserWidget&amp;gt; 변수를 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partaPlayerController.cpp 의 BeginPlay() 에 EnhancedInput 설정 직후 HUD 생성 로직을 이어서 작성&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CreateWidget 이 작동하려면 UMG 모듈이 빌드 설정에 추가되어 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UMG 모듈을 추가하기&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;PublicDependencyModuleNames.&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Core : 코어 엔진의 기본 기능&lt;/li&gt;
&lt;li&gt;CoreUObject : 리플렉션 시스템, 가비지 컬렉터&lt;/li&gt;
&lt;li&gt;Engine : 게임 엔진의 주요 기능&lt;/li&gt;
&lt;li&gt;InputCore : 입력 시스템&lt;/li&gt;
&lt;li&gt;EnhancedInput : 기존 방식보다 유연하고 강력한 입력 처리 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가된 모듈&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UMG : 블루프린트와 관련된 모듈&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 202446.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFsPuR/dJMcaaloRJ5/zTn2wTkiAMvkvrdXKrJgC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFsPuR/dJMcaaloRJ5/zTn2wTkiAMvkvrdXKrJgC0/img.png&quot; data-alt=&quot;SpartaProject.Build.cs&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFsPuR/dJMcaaloRJ5/zTn2wTkiAMvkvrdXKrJgC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFsPuR%2FdJMcaaloRJ5%2FzTn2wTkiAMvkvrdXKrJgC0%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;634&quot; height=&quot;493&quot; data-filename=&quot;스크린샷 2026-06-22 202446.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaProject.Build.cs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;HUD Widget 테스트하기&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 data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;BP_SpartaPlayerController 디폴트 블루프린트 or 게임 모드 설정에서 HUDWidgetClass에 WBP_HUD 를 지정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSzT9/dJMcahkDa7f/T7Ql6BCFQE3JUQuKS6NAG1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSzT9/dJMcahkDa7f/T7Ql6BCFQE3JUQuKS6NAG1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSzT9/dJMcahkDa7f/T7Ql6BCFQE3JUQuKS6NAG1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSzT9%2FdJMcahkDa7f%2FT7Ql6BCFQE3JUQuKS6NAG1%2Fimg.webp&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;459&quot; height=&quot;63&quot; data-filename=&quot;image (2).webp&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;63&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;span data-token-index=&quot;0&quot;&gt;New Editor Window&lt;/span&gt;를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에디터 상단의 &lt;span data-token-index=&quot;1&quot;&gt;Play&lt;/span&gt; 드롭다운 메뉴 클릭 &amp;rarr; &lt;span data-token-index=&quot;3&quot;&gt;Advanced Settings&lt;/span&gt;&amp;nbsp;선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 203637.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JV2cp/dJMcagF1g8j/mOthXzISQekSZ5KFsUomC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JV2cp/dJMcagF1g8j/mOthXzISQekSZ5KFsUomC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JV2cp/dJMcagF1g8j/mOthXzISQekSZ5KFsUomC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJV2cp%2FdJMcagF1g8j%2FmOthXzISQekSZ5KFsUomC0%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;372&quot; height=&quot;478&quot; data-filename=&quot;스크린샷 2026-06-22 203637.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;478&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;Advanced Settings&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 뷰포트 세팅을 HUD와 동일하게 1920x1080 사이즈로 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yb1Wt/dJMcabko80H/CYiHBEtvL2PbapjOL51IAK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yb1Wt/dJMcabko80H/CYiHBEtvL2PbapjOL51IAK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yb1Wt/dJMcabko80H/CYiHBEtvL2PbapjOL51IAK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyb1Wt%2FdJMcabko80H%2FCYiHBEtvL2PbapjOL51IAK%2Fimg.webp&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;715&quot; height=&quot;182&quot; data-filename=&quot;image (4).webp&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;3.&amp;nbsp;HUD&amp;nbsp;위젯과&amp;nbsp;GameState&amp;nbsp;데이터&amp;nbsp;연동하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;GameState에서 점수 데이터 바인딩하기&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 data-ke-size=&quot;size16&quot;&gt;언리얼 에디터 &amp;rarr; WBP_HUD (Widget Blueprint)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Details 패널 &amp;rarr; Text 속성 &amp;rarr; Bind 버튼 &amp;rarr; Create Binding 선택&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 092722.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYG6SZ/dJMb991a6Xh/YoqAALaT6qqQoIg7VAiBu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYG6SZ/dJMb991a6Xh/YoqAALaT6qqQoIg7VAiBu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYG6SZ/dJMb991a6Xh/YoqAALaT6qqQoIg7VAiBu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYG6SZ%2FdJMb991a6Xh%2FYoqAALaT6qqQoIg7VAiBu0%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;446&quot; height=&quot;101&quot; data-filename=&quot;스크린샷 2026-06-23 092722.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;101&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; Binding 방식 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적이긴하나, 매 프레임마다 틱 함수를 호출하기 때문에 UI가 복잡할 경우 과부하가 올 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFM7Xa/dJMcagTv5yA/FIHzbQbg6O1ksjxb7kfzsk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFM7Xa/dJMcagTv5yA/FIHzbQbg6O1ksjxb7kfzsk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFM7Xa/dJMcagTv5yA/FIHzbQbg6O1ksjxb7kfzsk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFM7Xa%2FdJMcagTv5yA%2FFIHzbQbg6O1ksjxb7kfzsk%2Fimg.webp&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;979&quot; height=&quot;298&quot; data-filename=&quot;image (1).webp&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;SetText 방식으로 위젯 갱신하기&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 data-ke-size=&quot;size16&quot;&gt;SpartaPlayerController.h / .cpp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 093641.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGfgp/dJMcaiRjdox/E5Djj6mBugJaEkXPwBB6UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGfgp/dJMcaiRjdox/E5Djj6mBugJaEkXPwBB6UK/img.png&quot; data-alt=&quot;SpartaPlayerController.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGfgp/dJMcaiRjdox/E5Djj6mBugJaEkXPwBB6UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGfgp%2FdJMcaiRjdox%2FE5Djj6mBugJaEkXPwBB6UK%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;636&quot; height=&quot;786&quot; data-filename=&quot;스크린샷 2026-06-23 093641.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaPlayerController.h&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J1mYt/dJMcagTv5MM/8oN3hrLGDegtBkTPsloSn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J1mYt/dJMcagTv5MM/8oN3hrLGDegtBkTPsloSn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J1mYt/dJMcagTv5MM/8oN3hrLGDegtBkTPsloSn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ1mYt%2FdJMcagTv5MM%2F8oN3hrLGDegtBkTPsloSn1%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;322&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 093759.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ALbTx/dJMb991a7cF/4Cf1VPaJS4mjowa3ycft41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ALbTx/dJMb991a7cF/4Cf1VPaJS4mjowa3ycft41/img.png&quot; data-alt=&quot;SpartaPlayerController.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ALbTx/dJMb991a7cF/4Cf1VPaJS4mjowa3ycft41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FALbTx%2FdJMb991a7cF%2F4Cf1VPaJS4mjowa3ycft41%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;777&quot; data-filename=&quot;스크린샷 2026-06-23 093759.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaPlayerController.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpartaGameState.h / .cpp&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 093510.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bapQgI/dJMcacXRyzQ/wqZkeCZZMTTs8MYSdEtwx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bapQgI/dJMcacXRyzQ/wqZkeCZZMTTs8MYSdEtwx0/img.png&quot; data-alt=&quot;SpartaGameState.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bapQgI/dJMcacXRyzQ/wqZkeCZZMTTs8MYSdEtwx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbapQgI%2FdJMcacXRyzQ%2FwqZkeCZZMTTs8MYSdEtwx0%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;747&quot; data-filename=&quot;스크린샷 2026-06-23 093510.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.h&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 094052.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doqygb/dJMcageTDvI/jQYknjqNa7xnpAc5k1OMXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doqygb/dJMcageTDvI/jQYknjqNa7xnpAc5k1OMXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doqygb/dJMcageTDvI/jQYknjqNa7xnpAc5k1OMXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdoqygb%2FdJMcageTDvI%2FjQYknjqNa7xnpAc5k1OMXK%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;623&quot; height=&quot;727&quot; data-filename=&quot;스크린샷 2026-06-23 094052.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 094117.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caICyP/dJMb997TGbp/g8ZJXhEZSUKQkARmxwhvgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caICyP/dJMb997TGbp/g8ZJXhEZSUKQkARmxwhvgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caICyP/dJMb997TGbp/g8ZJXhEZSUKQkARmxwhvgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaICyP%2FdJMb997TGbp%2Fg8ZJXhEZSUKQkARmxwhvgk%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;623&quot; height=&quot;672&quot; data-filename=&quot;스크린샷 2026-06-23 094117.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 094625.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbQQ1/dJMcageTDvJ/3hel57Qy8y3hsbmXnFGnXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbQQ1/dJMcageTDvJ/3hel57Qy8y3hsbmXnFGnXk/img.png&quot; data-alt=&quot;SpartaGameState.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbQQ1/dJMcageTDvJ/3hel57Qy8y3hsbmXnFGnXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmbQQ1%2FdJMcageTDvJ%2F3hel57Qy8y3hsbmXnFGnXk%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;1085&quot; height=&quot;708&quot; data-filename=&quot;스크린샷 2026-06-23 094625.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/81</guid>
      <comments>https://jh009.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 23 Jun 2026 10:02:13 +0900</pubDate>
    </item>
    <item>
      <title>26.06.22 TIL / C++, Unreal Engine 3D 게임 개발 챕터3 정리</title>
      <link>https://jh009.tistory.com/80</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오늘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 챕터3 정리 끝&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;a href=&quot;https://jh009.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/77&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782128571751&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 3-3&quot; data-og-description=&quot;3-3. 아이템 스폰 및 레벨 데이터 관리하기 레벨 셋팅하기 BasicLevel, Intermediate, Level Advanced Level 순서로 난이도에 따라 맵의 크기가 작아짐스폰 영역(Spawn Volume) 설정 방법가장 직관적이고 효율적으&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/77&quot; data-og-url=&quot;https://jh009.tistory.com/77&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bM5lRY/dJMb86PbsQA/TmIHtGGxsGmbmRLXFGWcA0/img.jpg?width=748&amp;amp;height=259&amp;amp;face=0_0_748_259,https://scrap.kakaocdn.net/dn/lVLdl/dJMb83kCGRr/DZYMRKz5KcoLFS00ZIeCKK/img.jpg?width=748&amp;amp;height=259&amp;amp;face=0_0_748_259,https://scrap.kakaocdn.net/dn/HynkC/dJMb9aKOHyi/8AnywreRPbdbn6SBXmIhV0/img.png?width=602&amp;amp;height=791&amp;amp;face=0_0_602_791&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/77&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bM5lRY/dJMb86PbsQA/TmIHtGGxsGmbmRLXFGWcA0/img.jpg?width=748&amp;amp;height=259&amp;amp;face=0_0_748_259,https://scrap.kakaocdn.net/dn/lVLdl/dJMb83kCGRr/DZYMRKz5KcoLFS00ZIeCKK/img.jpg?width=748&amp;amp;height=259&amp;amp;face=0_0_748_259,https://scrap.kakaocdn.net/dn/HynkC/dJMb9aKOHyi/8AnywreRPbdbn6SBXmIhV0/img.png?width=602&amp;amp;height=791&amp;amp;face=0_0_602_791');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 3-3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3-3. 아이템 스폰 및 레벨 데이터 관리하기 레벨 셋팅하기 BasicLevel, Intermediate, Level Advanced Level 순서로 난이도에 따라 맵의 크기가 작아짐스폰 영역(Spawn Volume) 설정 방법가장 직관적이고 효율적으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/78&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782128583350&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 3-4&quot; data-og-description=&quot;3-4. 캐릭터 체력 및 점수 관리 시스템 구현하기 1. 캐릭터 체력 시스템 구현하기 캐릭터 클래스에 체력 변수 및 함수 선언 PlayerState를 쓰지 않는 이유주로 멀티플레이 환경에서 각 플레이어 간 데&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/78&quot; data-og-url=&quot;https://jh009.tistory.com/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdpdL2/dJMb8XSfAtO/JJsQOKi0HCuFWVofA1YhAk/img.png?width=625&amp;amp;height=611&amp;amp;face=0_0_625_611,https://scrap.kakaocdn.net/dn/40ZDC/dJMb8SXHDKI/KsabU7CYDsSvIyICRFDpFk/img.png?width=625&amp;amp;height=611&amp;amp;face=0_0_625_611,https://scrap.kakaocdn.net/dn/cKVPdd/dJMb9iIQv80/SYSOYWkT4vCgii0ge2C110/img.png?width=634&amp;amp;height=554&amp;amp;face=0_0_634_554&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdpdL2/dJMb8XSfAtO/JJsQOKi0HCuFWVofA1YhAk/img.png?width=625&amp;amp;height=611&amp;amp;face=0_0_625_611,https://scrap.kakaocdn.net/dn/40ZDC/dJMb8SXHDKI/KsabU7CYDsSvIyICRFDpFk/img.png?width=625&amp;amp;height=611&amp;amp;face=0_0_625_611,https://scrap.kakaocdn.net/dn/cKVPdd/dJMb9iIQv80/SYSOYWkT4vCgii0ge2C110/img.png?width=634&amp;amp;height=554&amp;amp;face=0_0_634_554');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 3-4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3-4. 캐릭터 체력 및 점수 관리 시스템 구현하기 1. 캐릭터 체력 시스템 구현하기 캐릭터 클래스에 체력 변수 및 함수 선언 PlayerState를 쓰지 않는 이유주로 멀티플레이 환경에서 각 플레이어 간 데&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jh009.tistory.com/79&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782128589054&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++와 Unreal Engine으로 3D 게임 개발 3-5&quot; data-og-description=&quot;3-5. 게임 루프 설계를 통한 게임 흐름 제어하기1. GameState를 이용한 게임 루프 구현 언리얼 엔진에서 게임 루프나 전역 상태를 관리할 때 대표적으로 고려되는 클래스 GameState, GameMode GameMode를 쓰&quot; data-og-host=&quot;jh009.tistory.com&quot; data-og-source-url=&quot;https://jh009.tistory.com/79&quot; data-og-url=&quot;https://jh009.tistory.com/79&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sImu6/dJMb9fZEWVG/MhZVlHFQdOoS1SJcv2FLxk/img.png?width=645&amp;amp;height=815&amp;amp;face=0_0_645_815,https://scrap.kakaocdn.net/dn/bt7Rbo/dJMb85W23P8/r7ScmRZmT4dktO33pnVlVk/img.png?width=645&amp;amp;height=815&amp;amp;face=0_0_645_815,https://scrap.kakaocdn.net/dn/cdGxei/dJMb9jOww6G/1eciI6IAITybQDLDcqU4k0/img.png?width=640&amp;amp;height=705&amp;amp;face=0_0_640_705&quot;&gt;&lt;a href=&quot;https://jh009.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jh009.tistory.com/79&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sImu6/dJMb9fZEWVG/MhZVlHFQdOoS1SJcv2FLxk/img.png?width=645&amp;amp;height=815&amp;amp;face=0_0_645_815,https://scrap.kakaocdn.net/dn/bt7Rbo/dJMb85W23P8/r7ScmRZmT4dktO33pnVlVk/img.png?width=645&amp;amp;height=815&amp;amp;face=0_0_645_815,https://scrap.kakaocdn.net/dn/cdGxei/dJMb9jOww6G/1eciI6IAITybQDLDcqU4k0/img.png?width=640&amp;amp;height=705&amp;amp;face=0_0_640_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C++와 Unreal Engine으로 3D 게임 개발 3-5&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3-5. 게임 루프 설계를 통한 게임 흐름 제어하기1. GameState를 이용한 게임 루프 구현 언리얼 엔진에서 게임 루프나 전역 상태를 관리할 때 대표적으로 고려되는 클래스 GameState, GameMode GameMode를 쓰&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jh009.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챕터 4 정리 이후 바로 개인과제 진행할 예정&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회고&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 코드를 활용하여 진행되는 강의라서 이해하는 데 시간이 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30일에 과제 제출이기 때문에 내일까지 다 듣고 과제를 시작할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요새 강의를 듣느라 AI 문제풀이를 소홀히 한 것 같다. 과제를 빠르게 끝내고 문제풀이와 복습도 진행해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>본 캠프 TIL</category>
      <category>til</category>
      <category>내일배움캠프</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/80</guid>
      <comments>https://jh009.tistory.com/80#entry80comment</comments>
      <pubDate>Mon, 22 Jun 2026 20:48:55 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 3-5</title>
      <link>https://jh009.tistory.com/79</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 3-5. 게임 루프 설계를 통한 게임 흐름 제어하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. GameState를 이용한 게임 루프 구현&lt;/b&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;span data-token-index=&quot;1&quot;&gt;게임 루프나 전역 상태&lt;/span&gt;를 관리할 때 대표적으로 고려되는 클래스 GameState, GameMode&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 전용 로직&lt;/li&gt;
&lt;li&gt;게임 규칙 (팀 배정, 승패 조건, 플레이어 스폰 등)을 서버에서 제어하는 데 사용&lt;/li&gt;
&lt;li&gt;클라이언트는 GameMode에 직접 접근 X&lt;/li&gt;
&lt;li&gt;클라이언트도 알아야 하는 정보 (예시: 남은 시간, 현재 점수 등)를 GameMode에만 두면 복잡해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티플레이를 고려할 때 많이 사용하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요 규칙 로직 &amp;rarr; GameMode&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버-클라이언트가 공통으로 알아야 하는 상태 &amp;rarr; GameState&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;GameState를 쓰는 이유&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;/li&gt;
&lt;li&gt;전역 상태가 필요할 경우 GameState를 활용&lt;/li&gt;
&lt;li&gt;GameState 객체는 게임이 시작될 때 서버에서 생성&lt;/li&gt;
&lt;li&gt;클라이언트는 이를 복제 받아서 똑같은 정보를 읽을 수 있음 &amp;rarr; 서버와 클라이언트 모두 동일한 정보를 가지게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;SpawnVolume 클래스 스폰 데이터 반환 수정&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스폰된 아이템의 정보 (코인이 맞는지, 혹은 다른 아이템인지)를 추후 GameState에서 카운팅을 하게 해야함&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;기존: 스폰 함수가 void를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정: 스폰 함수가 스폰된 AActor*를 반환해야됨&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;SpawnRandomItem() 이 스폰된 액터 포인터를 반환하도록 수정, 그 액터가 코인인지 확인할 수 있게 만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBX7XV/dJMcac4BfyX/KkGcgT1AiNUrKoYRpZ6iK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBX7XV/dJMcac4BfyX/KkGcgT1AiNUrKoYRpZ6iK1/img.png&quot; data-alt=&quot;SpawnVolume.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBX7XV/dJMcac4BfyX/KkGcgT1AiNUrKoYRpZ6iK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBX7XV%2FdJMcac4BfyX%2FKkGcgT1AiNUrKoYRpZ6iK1%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;632&quot; height=&quot;664&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpawnVolume.h&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIVOiV/dJMcaiKtZoY/J9sTkb6CVh7rEX7kVA17HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIVOiV/dJMcaiKtZoY/J9sTkb6CVh7rEX7kVA17HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIVOiV/dJMcaiKtZoY/J9sTkb6CVh7rEX7kVA17HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIVOiV%2FdJMcaiKtZoY%2FJ9sTkb6CVh7rEX7kVA17HK%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;633&quot; height=&quot;608&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ms9Ud/dJMcaalojG5/rjGrf4NnievbyQPUSC5ST0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ms9Ud/dJMcaalojG5/rjGrf4NnievbyQPUSC5ST0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ms9Ud/dJMcaalojG5/rjGrf4NnievbyQPUSC5ST0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fms9Ud%2FdJMcaalojG5%2FrjGrf4NnievbyQPUSC5ST0%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;634&quot; height=&quot;698&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM4IKx/dJMb991ajhQ/A7bksmUkzsfRe4E5XACEWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM4IKx/dJMb991ajhQ/A7bksmUkzsfRe4E5XACEWk/img.png&quot; data-alt=&quot;SpawnVolume.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM4IKx/dJMb991ajhQ/A7bksmUkzsfRe4E5XACEWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM4IKx%2FdJMb991ajhQ%2FA7bksmUkzsfRe4E5XACEWk%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;633&quot; height=&quot;528&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpawnVolume.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;GameState 기반의 게임 루프 구현&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GameStateBase를 상속한 SpartaGameStateBase는 삭제, GameState를 상속한 SpartaGameState를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; GameMode 버전과의 일관성을 위함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SpartaGameStateBase.h 와 cpp 에 있는 내용을 SpartaGameState에 복붙 후 수정&lt;/li&gt;
&lt;li&gt;파일에서 SpartaGameStateBase.h 와 cpp 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092002.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YMNKQ/dJMcaiRikfF/GDOW1oXxq94eqxsC1t6YE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YMNKQ/dJMcaiRikfF/GDOW1oXxq94eqxsC1t6YE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YMNKQ/dJMcaiRikfF/GDOW1oXxq94eqxsC1t6YE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYMNKQ%2FdJMcaiRikfF%2FGDOW1oXxq94eqxsC1t6YE1%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;645&quot; height=&quot;815&quot; data-filename=&quot;스크린샷 2026-06-22 092002.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092025.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4AzoP/dJMcaicLa7t/Vn4tubv2u69BTSiZmVOXR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4AzoP/dJMcaicLa7t/Vn4tubv2u69BTSiZmVOXR0/img.png&quot; data-alt=&quot;SpartaGameState.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4AzoP/dJMcaicLa7t/Vn4tubv2u69BTSiZmVOXR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4AzoP%2FdJMcaicLa7t%2FVn4tubv2u69BTSiZmVOXR0%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;643&quot; height=&quot;376&quot; data-filename=&quot;스크린샷 2026-06-22 092025.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.h&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092543.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mF4eX/dJMcah5YX9l/0QPNgJCkqn5NrKNrBsFeFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mF4eX/dJMcah5YX9l/0QPNgJCkqn5NrKNrBsFeFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mF4eX/dJMcah5YX9l/0QPNgJCkqn5NrKNrBsFeFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmF4eX%2FdJMcah5YX9l%2F0QPNgJCkqn5NrKNrBsFeFk%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;639&quot; height=&quot;718&quot; data-filename=&quot;스크린샷 2026-06-22 092543.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092653.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3EZjT/dJMcadoQ7iP/wuT0vmTjsCo0Ny2u23cE60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3EZjT/dJMcadoQ7iP/wuT0vmTjsCo0Ny2u23cE60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3EZjT/dJMcadoQ7iP/wuT0vmTjsCo0Ny2u23cE60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3EZjT%2FdJMcadoQ7iP%2FwuT0vmTjsCo0Ny2u23cE60%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;795&quot; data-filename=&quot;스크린샷 2026-06-22 092653.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092724.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gj9pM/dJMcaiKtZab/beyoIcQm5BU9smmZHUXK61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gj9pM/dJMcaiKtZab/beyoIcQm5BU9smmZHUXK61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gj9pM/dJMcaiKtZab/beyoIcQm5BU9smmZHUXK61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGj9pM%2FdJMcaiKtZab%2FbeyoIcQm5BU9smmZHUXK61%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;641&quot; height=&quot;815&quot; data-filename=&quot;스크린샷 2026-06-22 092724.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 092738.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4K3N0/dJMcadoQ7iQ/iVgDKDiRwR5999CGjdD2uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4K3N0/dJMcadoQ7iQ/iVgDKDiRwR5999CGjdD2uK/img.png&quot; data-alt=&quot;SpartaGameState.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4K3N0/dJMcadoQ7iQ/iVgDKDiRwR5999CGjdD2uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4K3N0%2FdJMcadoQ7iQ%2FiVgDKDiRwR5999CGjdD2uK%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;379&quot; data-filename=&quot;스크린샷 2026-06-22 092738.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.cpp&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;맵 전환 (OpenLevel) 시 주의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UGameplayStatics::OpenLevel 호출 &amp;rarr; 지금 월드가 제거 &amp;rarr; 새로운 맵이 로드 &amp;rarr; BeginPlay() 다시 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 GameState도 새로 생성되기 때문에, 이전 레벨에서 유지하던 변수가 모두 초기화될 수 있음&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;BeginPlay(): 게임 시작 시 StartLevel() 호출&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;StartLevel():&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;코인 개수들 초기화 (SpawnedCoinCount=0, CollectedCoinCount=0)&lt;/li&gt;
&lt;li&gt;스폰 볼륨들을 찾아서 40개 아이템 스폰(반복)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 SpawnRandomItem()이 ACoinItem을 반환하면 SpawnedCoinCount++&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;30초 타이머 설정 (OnLevelTimeUp 호출)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OnLevelTimeUp(): 30초가 만료되면 레벨 종료(EndLevel())&lt;/li&gt;
&lt;li&gt;OnCoinCollected(): 코인 아이템을 먹을 때마다 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CollectedCoinCount++&lt;/li&gt;
&lt;li&gt;CollectedCoinCount &amp;gt;= SpawnedCoinCount 이면, 즉시 EndLevel()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EndLevel()
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 레벨 타이머 정리&lt;/li&gt;
&lt;li&gt;CurrentLevelIndex++&lt;/li&gt;
&lt;li&gt;만약 CurrentLevelIndex &amp;gt;= MaxLevels 이면 OnGameOver()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아니면 다음 레벨 StartLevel()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;OnGameOver()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GameOver 로그 출력 (혹은 UI 호출 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&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 data-ke-size=&quot;size16&quot;&gt;CoinItem &amp;rarr; 플레이어가 닿았을 때 (ActivateItem) 점수를 획득하고 자기 자신을 제거하는 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 추가로 코인을 하나 더 먹었다고 GameState에게 알려야 함&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782093486428&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// CoinItem.cpp
#include &quot;CoinItem.h&quot;
#include &quot;Engine/World.h&quot;
#include &quot;SpartaGameState.h&quot;

ACoinItem::ACoinItem()
{
		PointValue = 0;
		ItemType = &quot;DefaultCoin&quot;;
}

void ACoinItem::ActivateItem(AActor* Activator)
{
	if (Activator &amp;amp;&amp;amp; Activator-&amp;gt;ActorHasTag(&quot;Player&quot;))
	{
		if (UWorld* World = GetWorld())
		{
			if (ASpartaGameState* GameState = World-&amp;gt;GetGameState&amp;lt;ASpartaGameState&amp;gt;())
			{
				GameState-&amp;gt;AddScore(PointValue);
				// 추가
				GameState-&amp;gt;OnCoinCollected();
			}
		}
		
		DestroyItem();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;2.&amp;nbsp;Game&amp;nbsp;Instance를&amp;nbsp;활용한&amp;nbsp;데이터&amp;nbsp;유지하기&lt;/span&gt;&lt;/h4&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 data-ke-size=&quot;size16&quot;&gt;이전 레벨에서 획득한 점수, 플레이어 상태 등을 모든 레벨에 걸쳐 유지하고 싶을 때 쓰는 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Game Instance
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트가 시작될 때부터 애플리케이션이 완전히 종료될 때까지 유일하게 계속 살아있는 객체&lt;/li&gt;
&lt;li&gt;맵이 전환되어도 파괴 X, 여기서 전역 데이터를 유지 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Seamless Travel
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티플레이 환경에서 주로 사용되는 레벨 전환 방식&lt;/li&gt;
&lt;li&gt;GameState, PlayerController 등을 파괴하지 않고 그대로 다음 맵으로 넘어가는 기능&lt;/li&gt;
&lt;li&gt;대부분의 객체를 유지할 수 있지만, 설정과 로직이 조금 더 복잡함&lt;/li&gt;
&lt;li&gt;싱글 플레이 전용 간단 프로젝트라면 GameInstance 를 사용하기 쉬움&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt; Game Instance 생성 및 변수 선언&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ Class &amp;rarr; Game Instance 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 114334.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCyZJ1/dJMcajimUAe/mNCbJN2b2HraKouT0ydbC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCyZJ1/dJMcajimUAe/mNCbJN2b2HraKouT0ydbC1/img.png&quot; data-alt=&quot;SpartaGameInstance.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCyZJ1/dJMcajimUAe/mNCbJN2b2HraKouT0ydbC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCyZJ1%2FdJMcajimUAe%2FmNCbJN2b2HraKouT0ydbC1%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;638&quot; height=&quot;535&quot; data-filename=&quot;스크린샷 2026-06-22 114334.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameInstance.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 114401.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c93npj/dJMcafAidDq/ApUBmPfBI74FBTFPbuZvm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c93npj/dJMcafAidDq/ApUBmPfBI74FBTFPbuZvm0/img.png&quot; data-alt=&quot;SpartaGameInstance.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c93npj/dJMcafAidDq/ApUBmPfBI74FBTFPbuZvm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc93npj%2FdJMcafAidDq%2FApUBmPfBI74FBTFPbuZvm0%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;636&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2026-06-22 114401.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameInstance.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;인스턴스 값을 기존에 스테이트에 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782097647217&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SpartaGameState.cpp

#include &quot;SpartaGameInstance.h&quot; // 추가

// 삭제
// Score += Amount;                    
// UE_LOG(LogTemp, Warning, TEXT(&quot;Score: %d&quot;), Score); 

void ASpartaGameState::AddScore(int32 Amount)
{
	// 추가
	if (UGameInstance* GameUnstance = GetGameInstance())
    {
    	USpartaGameInstance* SpartaGameInstance = Cast&amp;lt;USpartaGameInstance&amp;gt;(GameInstance);
        if(SpartaGameInstance)
        {
        	SpartaGameInstance-&amp;gt;AddToScore(Amount);
        }
    }
}

void ASpartaGameState::StartLevel()
// CurrentLevelIndex 추가
{
	if (UGameInstance* GameUnstance = GetGameInstance())
    {
    	USpartaGameInstance* SpartaGameInstance = Cast&amp;lt;USpartaGameInstance&amp;gt;(GameInstance);
        if(SpartaGameInstance)
        {
        	CurrentLevelIndex = SpartaGameInstance-&amp;gt;CurrentLevelIndex;
        }
    }
.
.
.
void ASpartaGameState::EndLevel()
{		
	GetWorldTimerManager().ClearTimer(LevelTimerHandle);
	
    // 추가 및 수정
	if (UGameInstance* GameUnstance = GetGameInstance())
    {
    	USpartaGameInstance* SpartaGameInstance = Cast&amp;lt;USpartaGameInstance&amp;gt;(GameInstance);
        if(SpartaGameInstance)
        {
        	AddScore(Score);
            CurrentLevelIndex++;
        	SpartaGameInstance-&amp;gt;CurrentLevelIndex = CurrentLevelIndex
        }
    }

	if (CurrentLevelIndex &amp;gt;= MaxLevels)
	{
		OnGameOver();
		return;
	}
		
	if (LevelMapNames.IsValidIndex(CurrentLevelIndex))
	{
		UGamePlayStatics::OpenLevel(GetWorld(), LevelMapNames[CurrentLevelIndex]);
	}
	else
	{
		OnGameOver();
	}
}&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;빌드 이후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BP_SpartaGameInstance 생성&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;Project Settings &amp;rarr; Maps &amp;amp; Modes &amp;rarr; 맨 아래 Game Instance &amp;rarr; BP_SpartaGameInstance 선택&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;전체 게임 루프 요약&lt;/span&gt; &lt;/b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;게임 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GameInstance 생성, GameMode/GameState 생성, 첫 레벨 로드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BeginPlay()
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASpartaGameState::BeginPlay() &amp;rarr; StartLevel()&lt;/li&gt;
&lt;li&gt;스폰 볼륨(SpawnVolume)에서 40개 아이템 스폰&lt;/li&gt;
&lt;li&gt;코인 개수 추적(SpawnedCoinCount)&lt;/li&gt;
&lt;li&gt;30초 타이머 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;플레이어가 코인 획득
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CoinItem::ActivateItem()에서 GameState-&amp;gt;AddScore(), OnCoinCollected()&lt;/li&gt;
&lt;li&gt;모든 코인을 모으면 즉시 EndLevel()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레벨 종료
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EndLevel()에서 CurrentLevelIndex++&lt;/li&gt;
&lt;li&gt;남은 레벨이 있으면 UGameplayStatics::OpenLevel(...)로 다음 맵 로드&lt;/li&gt;
&lt;li&gt;더 이상 레벨이 없으면 OnGameOver()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음 맵 로드 시
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 GameState가 생성 &amp;rarr; 다시 BeginPlay() &amp;rarr; StartLevel()&lt;/li&gt;
&lt;li&gt;이전 레벨에서 유지하고 싶은 정보는 GameInstance나 &amp;ldquo;Seamless Travel&amp;rdquo; 등을 통해 별도로 관리해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Game Over
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그 출력 (추후 UI 표시로 전환)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/79</guid>
      <comments>https://jh009.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 22 Jun 2026 12:13:38 +0900</pubDate>
    </item>
    <item>
      <title>C++와 Unreal Engine으로 3D 게임 개발 3-4</title>
      <link>https://jh009.tistory.com/78</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 3-4. &lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;캐릭터 체력 및 점수 관리 시스템 구현하기&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;1.&amp;nbsp;캐릭터&amp;nbsp;체력&amp;nbsp;시스템&amp;nbsp;구현하기&lt;/span&gt;&lt;/h4&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 data-token-index=&quot;0&quot;&gt;캐릭터 클래스에 체력 변수 및 함수 선언&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;PlayerState를 쓰지 않는 이유&lt;/span&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;/li&gt;
&lt;li&gt;싱글 플레이 게임에서는 동기화가 필요 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;캐릭터 클래스에 체력 관리 로직 추가&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;싱글&amp;nbsp;플레이&amp;nbsp;환경을&amp;nbsp;가&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;정하여,&amp;nbsp;플레이어&amp;nbsp;캐릭터를&amp;nbsp;담당하는&amp;nbsp;SpartaCharacter&amp;nbsp;클래스에&amp;nbsp;체력&amp;nbsp;관리용&amp;nbsp;변수를&amp;nbsp;선언&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MaxHealth: 캐릭터의 최대 체력&lt;/li&gt;
&lt;li&gt;Health: 캐릭터의 현재 체력&lt;/li&gt;
&lt;li&gt;TakeDamage(): 데미지를 받았을 때 호출되는 함수, 내부에서 체력을 감소시키는 로직을 처리&lt;/li&gt;
&lt;li&gt;AddHealth(): 아이템 등을 통해 체력을 회복할 때 호출하는 함수, 내부에서 체력을 회복&lt;/li&gt;
&lt;li&gt;OnDeath(): 체력이 0 이하가 되었을 때 호출되는 사망 처리 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NvRct/dJMcadWJNMx/0VmXSjDSKK0aUAO8dpOOt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NvRct/dJMcadWJNMx/0VmXSjDSKK0aUAO8dpOOt0/img.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;611&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2026-06-20 195605.png&quot; style=&quot;width: 54.289%; margin-right: 10px;&quot; data-widthpercent=&quot;54.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NvRct/dJMcadWJNMx/0VmXSjDSKK0aUAO8dpOOt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNvRct%2FdJMcadWJNMx%2F0VmXSjDSKK0aUAO8dpOOt0%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;625&quot; height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdJ6NS/dJMcadWJNMB/fkhznyKOWw52nGzkkHI191/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdJ6NS/dJMcadWJNMB/fkhznyKOWw52nGzkkHI191/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;772&quot; data-filename=&quot;스크린샷 2026-06-20 195620.png&quot; style=&quot;width: 44.5482%;&quot; data-widthpercent=&quot;45.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdJ6NS/dJMcadWJNMB/fkhznyKOWw52nGzkkHI191/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdJ6NS%2FdJMcadWJNMB%2FfkhznyKOWw52nGzkkHI191%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;648&quot; height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;SpartaCharacter.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&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 data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;AddHealth(float Amount)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체력을 일정 양만큼 회복&lt;/li&gt;
&lt;li&gt;FMath::Clamp를 통해 최대 체력을 초과하지 않도록 제한&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TakeDamage(...)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언리얼 엔진의 기본 데미지 시스템을 사용하는 대표적인 함수&lt;/li&gt;
&lt;li&gt;DamageAmount: 데미지 값&lt;/li&gt;
&lt;li&gt;ActualDamage: 캐릭터가 입는 데미지 값 (예시: 데미지 30 - 방어력 20 = 10)&lt;/li&gt;
&lt;li&gt;EventInstigator: 데미지를 유발한 주체(Controller)&lt;/li&gt;
&lt;li&gt;DamageCauser: 데미지를 직접 발생시킨 오브젝트(총알, 폭발물 등)&lt;/li&gt;
&lt;li&gt;반환값: 실제 적용된 데미지(기본 로직에서는 DamageAmount와 동일한 경우가 많지만, 게임 상황에 따라 감소 또는 증폭 등을 처리할 수도 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OnDeath()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체력이 0 이하로 떨어졌을 때 사망 로직을 처리하는 함수&lt;/li&gt;
&lt;li&gt;입력 비활성화, Ragdoll 적용, 사망 애니메이션 재생 등을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdF4aS/dJMcaaTgwB2/YJZJSqc7poeXGAkQvSL2wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdF4aS/dJMcaaTgwB2/YJZJSqc7poeXGAkQvSL2wK/img.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;701&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2026-06-20 195927.png&quot; width=&quot;655&quot; data-widthpercent=&quot;53.36&quot; height=&quot;712&quot; style=&quot;width: 52.7419%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdF4aS/dJMcaaTgwB2/YJZJSqc7poeXGAkQvSL2wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdF4aS%2FdJMcaaTgwB2%2FYJZJSqc7poeXGAkQvSL2wK%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;645&quot; height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHzzZ/dJMcaiqdigb/XiLXiwXl9lF1fuR7DKQWR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHzzZ/dJMcaiqdigb/XiLXiwXl9lF1fuR7DKQWR0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;817&quot; data-filename=&quot;스크린샷 2026-06-20 195955.png&quot; data-widthpercent=&quot;46.64&quot; style=&quot;width: 46.0953%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHzzZ/dJMcaiqdigb/XiLXiwXl9lF1fuR7DKQWR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHzzZ%2FdJMcaiqdigb%2FXiLXiwXl9lF1fuR7DKQWR0%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;817&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;SpartaCharacter.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;span data-token-index=&quot;0&quot;&gt;MineItem 이 폭발할 때, 주변 액터에게 데미지를 주려면 UGameplayStatics::ApplyDamage 함수를 호출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;해당 액터의 TakeDamage()가 실행되도록 하면 됨&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&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;ApplyDamage()&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;대상 Actor 가 존재하는지 확인&lt;/li&gt;
&lt;li&gt;대상 액터의 TakeDamage() 함수를 호출&lt;/li&gt;
&lt;li&gt;DamageType 은 여러 가지 파생 클래스를 만들어 물리/화염/독 등 다양한 데미지 유형을 정의할 수 있음 (지금은 기본값 사용)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지뢰는 독립적으로 스폰된 뒤 폭발하므로 EventInstigator를 nullptr로 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티플레이에서 &amp;ldquo;누가 지뢰를 설치했느냐&amp;rdquo; 를 추적하려면, 생성 시점에 Instigator 나 Controller 정보를 넣어줄 수도 있음&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-20 201953.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnBoAR/dJMcahrmn7P/wF1vCfMlSLGKBkc72CJjO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnBoAR/dJMcahrmn7P/wF1vCfMlSLGKBkc72CJjO1/img.png&quot; data-alt=&quot;MineItem.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnBoAR/dJMcahrmn7P/wF1vCfMlSLGKBkc72CJjO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnBoAR%2FdJMcahrmn7P%2FwF1vCfMlSLGKBkc72CJjO1%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;634&quot; height=&quot;515&quot; data-filename=&quot;스크린샷 2026-06-20 201953.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MineItem.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;HealingItem &amp;rarr; 플레이어를 회복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AddHealth() 함수를 직접 호출해 체력을 증가&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;ActorHasTag(&quot;Player&quot;) 로 플레이어인지 판별하는 단순 로직&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터를 구분하는 더 안전한 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(예: Cast&amp;lt;ASpartaCharacter&amp;gt;(Activator)) 을 쓰거나, Collision 채널을 이용하는 식으로도 바꿀 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-20 202516.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF4trn/dJMcacXP75f/45H5GRQTzKOC3mumbYKtAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF4trn/dJMcacXP75f/45H5GRQTzKOC3mumbYKtAk/img.png&quot; data-alt=&quot;HealingItem.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF4trn/dJMcacXP75f/45H5GRQTzKOC3mumbYKtAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF4trn%2FdJMcacXP75f%2F45H5GRQTzKOC3mumbYKtAk%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;639&quot; height=&quot;495&quot; data-filename=&quot;스크린샷 2026-06-20 202516.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HealingItem.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.&amp;nbsp;점수&amp;nbsp;관리&amp;nbsp;시스템&amp;nbsp;구현하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;GameMode와 GameState의 연계 이해&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt; 언리얼 엔진에서의 &lt;span data-token-index=&quot;1&quot;&gt;GameMode,&lt;/span&gt;&amp;nbsp;&lt;span data-token-index=&quot;3&quot;&gt;GameState &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;3&quot;&gt;&amp;rarr; 게임의 전역 정보를 유지, 필요할 경우 멀티플레이어 환경에서 해당 정보를 &lt;span data-token-index=&quot;1&quot;&gt;서버&lt;/span&gt;와 &lt;span data-token-index=&quot;3&quot;&gt;클라이언트&lt;/span&gt; 간에 동기화하는 역할 &lt;/span&gt;&lt;/span&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게임의 규칙을 정의하고 관리&lt;/li&gt;
&lt;li&gt;어떤 캐릭터를 스폰할지, 플레이어가 사망했을 때 어떻게 처리할지를 결정&lt;/li&gt;
&lt;li&gt;멀티플레이에서는 서버 전용으로 동작 (클라이언트에는 존재하지 않음)&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GameState&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;/li&gt;
&lt;li&gt;GameState는 기본적으로 레벨당 1개가 존재&lt;/li&gt;
&lt;li&gt;전역 데이터 관리용으로 적합 (엔진 내부에서 데이터 동기화를 고려해 설계되었음)&lt;/li&gt;
&lt;li&gt;점수, 남은 시간, 현재 게임 단계(Phase), 스폰된 오브젝트의 총 개수 등을 저장&lt;/li&gt;
&lt;li&gt;멀티플레이에서는 서버가 관리하고, 클라이언트는 이를 자동으로 동기화 받아볼 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;싱글 플레이에서의 GameState&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;아이템 스폰 개수, 현재 게임 진행도 등과 같은 데이터를 GameState 에서 일괄 관리할 수 있기 때문임&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt; GameState에 점수 데이터 및 함수 추가&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 점수를 GameState 에 저장 후, 점수를 획득할 때마다 AddScore()를 호출하여 점수가 증가하도록 구현&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GameStateBase - 싱글플레이, 복잡하지 않은 게임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GameState - 멀티플레이&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;C++ Class &amp;rarr; GameStateBase 선택 &amp;rarr; 이름 설정 (SpartaGameStateBase)&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-20 204045.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSlqi/dJMcadvAR9m/1lWtbPUJYn9dA3raqAK7cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSlqi/dJMcadvAR9m/1lWtbPUJYn9dA3raqAK7cK/img.png&quot; data-alt=&quot;SpartaGameState.h&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSlqi/dJMcadvAR9m/1lWtbPUJYn9dA3raqAK7cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSlqi%2FdJMcadvAR9m%2F1lWtbPUJYn9dA3raqAK7cK%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;634&quot; height=&quot;554&quot; data-filename=&quot;스크린샷 2026-06-20 204045.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.h&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Score: 현재 누적된 점수&lt;/li&gt;
&lt;li&gt;AddScore(int32 Amount): 점수를 Amount만큼 증가, 최대 점수 제한, 점수 획득 사운드 재생 등을 추가할 수도 있음&lt;/li&gt;
&lt;li&gt;GetScore(): 현 점수 반환, 블루프린트에서 UI를 만들 때도 이 함수를 이용해 쉽게 점수를 가져올 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-21 174758.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W4uhO/dJMcadWJ9DQ/agyeayKI9OkMTStvXjURu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W4uhO/dJMcadWJ9DQ/agyeayKI9OkMTStvXjURu0/img.png&quot; data-alt=&quot;SpartaGameState.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W4uhO/dJMcadWJ9DQ/agyeayKI9OkMTStvXjURu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW4uhO%2FdJMcadWJ9DQ%2FagyeayKI9OkMTStvXjURu0%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;629&quot; height=&quot;366&quot; data-filename=&quot;스크린샷 2026-06-21 174758.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameState.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;GameMode와 GameState 연동&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 만들었던 GameMode 클래스에서 GameStateClass 멤버를 SpartaGameState로 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-21 181447.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csHgm3/dJMcadoQQ3r/U2kdQ5DyK6xrPt7e5YlOp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csHgm3/dJMcadoQQ3r/U2kdQ5DyK6xrPt7e5YlOp1/img.png&quot; data-alt=&quot;SpartaGameMode.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csHgm3/dJMcadoQQ3r/U2kdQ5DyK6xrPt7e5YlOp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsHgm3%2FdJMcadoQQ3r%2FU2kdQ5DyK6xrPt7e5YlOp1%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;620&quot; height=&quot;227&quot; data-filename=&quot;스크린샷 2026-06-21 181447.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpartaGameMode.cpp&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;SpartaGameStateBase에 대한 C++ 코드가 컴파일 &amp;rarr; 언리얼 에디터에서 해당 클래스를 인식하게 됨&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;SpartaGameStateBase를 더 확장하거나 블루프린트 비주얼 스크립팅을 사용하기 위해,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 클래스를 부모로 하는 블루프린트(BP_SpartaGameStateBase)를 만들어서 사용&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;Project Settings 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit &amp;rarr; Project Settings &amp;rarr; Maps &amp;amp; Modes &amp;rarr; Default GameMode&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpartaGameModeBase 또는 그 블루프린트 클래스로 설정&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;Game State Class &amp;rarr; BP_SpartaGameStateBase(또는 SpartaGameStateBase) 로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 전역적으로 이 설정이 적용&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;World Settings에서 설정 (레벨별로 오버라이드 가능)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMOIYw/dJMcaf1iSrK/MSfSrB9rRcm5diUKryWmyK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMOIYw/dJMcaf1iSrK/MSfSrB9rRcm5diUKryWmyK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMOIYw/dJMcaf1iSrK/MSfSrB9rRcm5diUKryWmyK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMOIYw%2FdJMcaf1iSrK%2FMSfSrB9rRcm5diUKryWmyK%2Fimg.webp&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;438&quot; height=&quot;394&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;코인 아이템 점수 획득 함수 수정&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetWorld()-&amp;gt;GetGameState&amp;lt;ASpartaGameStateBase&amp;gt;() 로 게임 스테이트를 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AddScore(PointValue) 함수를 호출해 점수를 올림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PointValue(int32) &amp;rarr; 코인 아이템이 제공하는 점수량, ACoinItem의 멤버 변수로 관리&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;플레이어가 코인을 획득하면, 전역적으로 관리되는 GameState에서 점수가 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코인은 사라져서 한 번만 획득되도록 처리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-21 200523.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESQp8/dJMcadPVv22/1zXorXIxMDvkeHVhDkvekK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESQp8/dJMcadPVv22/1zXorXIxMDvkeHVhDkvekK/img.png&quot; data-alt=&quot;CoinItem.cpp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESQp8/dJMcadPVv22/1zXorXIxMDvkeHVhDkvekK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESQp8%2FdJMcadPVv22%2F1zXorXIxMDvkeHVhDkvekK%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;634&quot; height=&quot;562&quot; data-filename=&quot;스크린샷 2026-06-21 200523.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CoinItem.cpp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C++와 Unreal Engine으로 3D 게임 개발</category>
      <author>jh009</author>
      <guid isPermaLink="true">https://jh009.tistory.com/78</guid>
      <comments>https://jh009.tistory.com/78#entry78comment</comments>
      <pubDate>Sun, 21 Jun 2026 20:13:36 +0900</pubDate>
    </item>
  </channel>
</rss>