<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>공부</title>
    <link>https://dlemrcnd.tistory.com/</link>
    <description>.</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 14:17:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>최디디</managingEditor>
    <image>
      <title>공부</title>
      <url>https://tistory1.daumcdn.net/tistory/4140178/attach/5bedb1b60c71409ebf38a24951edb10c</url>
      <link>https://dlemrcnd.tistory.com</link>
    </image>
    <item>
      <title>llama.cpp 기반 로컬 AI 만들기 - 1</title>
      <link>https://dlemrcnd.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 연결없이 로컬에서 AI를 돌려서&lt;br /&gt;언리얼이나 유니티 엔진에서도 사용할 수 있는 모듈을 만들어 보자해서 찾아보게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;llama.cpp는 Meta사의 LLaMA 모델을 C++로 포팅한 라이브러리다.&lt;br /&gt;llama.cpp는 LLaMA 계열에서 시작했지만,&lt;br /&gt;현재는&amp;nbsp;GGUF&amp;nbsp;포맷을&amp;nbsp;지원하는&amp;nbsp;다양한&amp;nbsp;LLM을&amp;nbsp;추론하는&amp;nbsp;C/C++&amp;nbsp;기반&amp;nbsp;엔진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 같은 특성때문에 게임 실행파일 안에도 LLM을 포함시키는 구조가 나름 괜찮을 선택이지 않나&lt;br /&gt;생각이 들어서 조금 끄적였던거를 적어 놓아본다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 설치 및 환경 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ggml-org/llama.cpp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ggml-org/llama.cpp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768919867629&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ggml-org/llama.cpp: LLM inference in C/C++&quot; data-og-description=&quot;LLM inference in C/C++. Contribute to ggml-org/llama.cpp development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ggml-org/llama.cpp&quot; data-og-url=&quot;https://github.com/ggml-org/llama.cpp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVOZPX/dJMb84p2G3R/gOUyNLdbqVZSMCGFIeYvj0/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/09hHD/dJMb84XSGSf/YsyYkh8lXo7WuOS4kYrAXK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/ggml-org/llama.cpp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ggml-org/llama.cpp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVOZPX/dJMb84p2G3R/gOUyNLdbqVZSMCGFIeYvj0/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/09hHD/dJMb84XSGSf/YsyYkh8lXo7WuOS4kYrAXK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_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;GitHub - ggml-org/llama.cpp: LLM inference in C/C++&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM inference in C/C++. Contribute to ggml-org/llama.cpp development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 홈페이지에서 코드를 Clone 또는 다운로드 받는다.&lt;br /&gt;예제 파일도 있던데 하나씩 테스트 해보는 것도 좋을듯&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 사용할 모델 준비하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;LLM 모델을 다운로드 해야한다. 허그페이스에서 받으면 된다.&amp;nbsp;&lt;br /&gt;OpenAI GPT-OSS-20B 위 모델로 받았다가..&lt;br /&gt;호환이 안되는걸 알았다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://huggingface.co/openai/gpt-oss-20b&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/openai/gpt-oss-20b&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768923794654&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;openai/gpt-oss-20b &amp;middot; Hugging Face&quot; data-og-description=&quot;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/openai/gpt-oss-20b&quot; data-og-url=&quot;https://huggingface.co/openai/gpt-oss-20b&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8KRy8/dJMb8SXrK2P/WH3xKfBvoJjwjlkwGBALR0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/caDw0f/dJMb8ZvvlnX/f6fyVKFlnJmxm81fxX6NI1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/openai/gpt-oss-20b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/openai/gpt-oss-20b&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8KRy8/dJMb8SXrK2P/WH3xKfBvoJjwjlkwGBALR0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/caDw0f/dJMb8ZvvlnX/f6fyVKFlnJmxm81fxX6NI1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&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;openai/gpt-oss-20b &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 설치한 방법은 허그페이스 허브 CLI로 진행했다.&lt;/p&gt;
&lt;pre id=&quot;code_1768924272338&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. pip install -U &quot;huggingface_hub[cli]&quot;
2. huggingface-cli download openai/gpt-oss-20b --include &quot;original/*&quot; --local-dir gpt-oss-20b/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12GB정도 용량을 가졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드를 받았으면 llama.cpp에서 처리할 수 있는 형식인 gguf 또는 ggml으로 변환해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1768920166354&quot; class=&quot;cpp&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;python convert_hf_to_gguf.py [원본모델폴더] --outtype [quant옵션]

usage: convert_hf_to_gguf.py [-h] [--vocab-only] [--outfile OUTFILE] [--outtype {f32,f16,bf16,q8_0,tq1_0,tq2_0,auto}]
                             [--bigendian] [--use-temp-file] [--no-lazy] [--model-name MODEL_NAME] [--verbose]
                             [--split-max-tensors SPLIT_MAX_TENSORS] [--split-max-size SPLIT_MAX_SIZE] [--dry-run]
                             [--no-tensor-first-split] [--metadata METADATA] [--print-supported-models] [--remote]
                             [--mmproj] [--mistral-format] [--disable-mistral-community-chat-template]
                             [--sentence-transformers-dense-modules]
                             [model]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVwMRH/dJMcai27hZn/aat1l8sFUky2c3fXtNgHLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVwMRH/dJMcai27hZn/aat1l8sFUky2c3fXtNgHLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVwMRH/dJMcai27hZn/aat1l8sFUky2c3fXtNgHLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVwMRH%2FdJMcai27hZn%2Faat1l8sFUky2c3fXtNgHLk%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;574&quot; height=&quot;130&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환이 되지않는다. 찾아보니 지원되지 않는 형식인 이유는 gpt-oss-20b 모델은&lt;br /&gt;배포될떄부터 양자화 기술이 적용된 채로 업르드 되어서 이걸 변환할 수 없는거 같다.&lt;br /&gt;&lt;a href=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768926429457&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;unsloth/gpt-oss-20b-GGUF &amp;middot; Hugging Face&quot; data-og-description=&quot;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&quot; data-og-url=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iqR5Q/dJMb8XRZtHt/oOcdfpJMJ8quPbe3XH1Udk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bVaavU/dJMb8Qef8su/RoJBv8zSPb1YLKpzNtE2aK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/hIPRm/dJMb8Qef8sv/s5g0cQitPKBkLEVBE455Qk/img.png?width=1015&amp;amp;height=379&amp;amp;face=0_0_1015_379&quot;&gt;&lt;a href=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/unsloth/gpt-oss-20b-GGUF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iqR5Q/dJMb8XRZtHt/oOcdfpJMJ8quPbe3XH1Udk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bVaavU/dJMb8Qef8su/RoJBv8zSPb1YLKpzNtE2aK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/hIPRm/dJMb8Qef8sv/s5g0cQitPKBkLEVBE455Qk/img.png?width=1015&amp;amp;height=379&amp;amp;face=0_0_1015_379');&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;unsloth/gpt-oss-20b-GGUF &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 gguf 확장자인 버젼이 있어서 불필요한 변환 과정을 스킵할 수 있었다. &lt;br /&gt;아래는 용량 적은 Qwen으로 재설치했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768926945325&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF at main&quot; data-og-description=&quot;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&quot; data-og-url=&quot;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n33SS/dJMb83ScLta/yirMyX0Q5KPtgH8oo4HOZk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bXcyKk/dJMb83kmTfc/O0nwYTjWkW8FA7HYG9B6Q1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF/tree/main&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n33SS/dJMb83ScLta/yirMyX0Q5KPtgH8oo4HOZk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bXcyKk/dJMb83kmTfc/O0nwYTjWkW8FA7HYG9B6Q1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&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;Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF at main&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 실행 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;llama.cpp 풀소스에서 Example 폴더에 simple-chat이 있다.&amp;nbsp;&lt;br /&gt;거기서 내 다운로드 받은 모델로 갈아끼어서 테스트 진행했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzirQ/dJMcag5mwVs/6h4M0pfyJ2ShYXylcmQA50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzirQ/dJMcag5mwVs/6h4M0pfyJ2ShYXylcmQA50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzirQ/dJMcag5mwVs/6h4M0pfyJ2ShYXylcmQA50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzirQ%2FdJMcag5mwVs%2F6h4M0pfyJ2ShYXylcmQA50%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;296&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pDJBa/dJMcagEi4p3/7w4IrkNpK0W9JuKBtUCUOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pDJBa/dJMcagEi4p3/7w4IrkNpK0W9JuKBtUCUOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pDJBa/dJMcagEi4p3/7w4IrkNpK0W9JuKBtUCUOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpDJBa%2FdJMcagEi4p3%2F7w4IrkNpK0W9JuKBtUCUOk%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;1172&quot; height=&quot;355&quot; data-origin-width=&quot;1172&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;대답은 한 0.5초에서 1.5초 사이로 응답이 오는거 같다.&lt;br /&gt;용량이 작은 만큼 대답이 어느정도까지 나올지는 좀 더 봐야할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 와중에 Qwen이면 알리바바 소속인데 OpenAI라고 소개했다. 그 뒤로 정정함&lt;/p&gt;</description>
      <category>STUDY/C++</category>
      <category>AI</category>
      <category>llama.cpp</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/114</guid>
      <comments>https://dlemrcnd.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:30:33 +0900</pubDate>
    </item>
    <item>
      <title>AABB, OBB 충돌에 대해서</title>
      <link>https://dlemrcnd.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dlemrcnd.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dlemrcnd.tistory.com/91&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768214214462&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;DirectX11 3D - 반직선, 마우스 피킹, AABB 오브젝트 충돌처리 (Ray, Mouse Picking)&quot; data-og-description=&quot;3D 정점은 로컬 -&amp;gt; 월드 -&amp;gt; 뷰 -&amp;gt; 투영 -&amp;gt; 화면 좌표로 최종 변환이 된다. 마우스 피킹에서는 화면 좌표 -&amp;gt; 투영 - &amp;gt; 뷰 -&amp;gt; 월드 역순으로 돌아와야 한다. 화면 좌표계에서 있는 마우스 클릭, 그 위치에&quot; data-og-host=&quot;dlemrcnd.tistory.com&quot; data-og-source-url=&quot;https://dlemrcnd.tistory.com/91&quot; data-og-url=&quot;https://dlemrcnd.tistory.com/91&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNkF1G/hyZRqdzcf0/DmkZks7dtsz62qw4jlyS3k/img.gif?width=500&amp;amp;height=380&amp;amp;face=0_0_500_380,https://scrap.kakaocdn.net/dn/TKvfK/hyZRjS1akS/CUmpDk7nzKqFNGFwexZX90/img.gif?width=500&amp;amp;height=380&amp;amp;face=0_0_500_380,https://scrap.kakaocdn.net/dn/isfcy/hyZQRoeTMV/njkRvyTHEU2dcck9IdKLy1/img.png?width=1988&amp;amp;height=1000&amp;amp;face=0_0_1988_1000&quot;&gt;&lt;a href=&quot;https://dlemrcnd.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dlemrcnd.tistory.com/91&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNkF1G/hyZRqdzcf0/DmkZks7dtsz62qw4jlyS3k/img.gif?width=500&amp;amp;height=380&amp;amp;face=0_0_500_380,https://scrap.kakaocdn.net/dn/TKvfK/hyZRjS1akS/CUmpDk7nzKqFNGFwexZX90/img.gif?width=500&amp;amp;height=380&amp;amp;face=0_0_500_380,https://scrap.kakaocdn.net/dn/isfcy/hyZQRoeTMV/njkRvyTHEU2dcck9IdKLy1/img.png?width=1988&amp;amp;height=1000&amp;amp;face=0_0_1988_1000');&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;DirectX11 3D - 반직선, 마우스 피킹, AABB 오브젝트 충돌처리 (Ray, Mouse Picking)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3D 정점은 로컬 -&amp;gt; 월드 -&amp;gt; 뷰 -&amp;gt; 투영 -&amp;gt; 화면 좌표로 최종 변환이 된다. 마우스 피킹에서는 화면 좌표 -&amp;gt; 투영 - &amp;gt; 뷰 -&amp;gt; 월드 역순으로 돌아와야 한다. 화면 좌표계에서 있는 마우스 클릭, 그 위치에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dlemrcnd.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 DX 프로젝트에서 AABB 충돌 구현을 했었다. 최근에 다시 작업할 일이 있어서 리마인드 겸 정리함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AABB는 (Axis-Aligned Bounding Box)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월드 좌표축 XYZ가 정렬된 박스로 회전이 없고 계산이 빠르다. 브로드 페이즈에 쓰이곤한다고 한다.&lt;br /&gt;Broad Phase -&amp;gt; 충돌했을 가능성이 낮은 pair를 골라내는 과정을 말한다.&lt;/p&gt;
&lt;pre id=&quot;code_1768214388460&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct AABB
{
    DD_Vector3 minPoint; // (x-, y-, z-)
    DD_Vector3 maxPoint; // (x+, y+, z+)
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AABB vs AABB 충돌 판정은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1768214574654&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool IntersectAABB(const AABB&amp;amp; a, const AABB&amp;amp; b)
{
    if (a.maxPoint.x &amp;lt; b.minPoint.x || a.minPoint.x &amp;gt; b.maxPoint.x) return false;
    if (a.maxPoint.y &amp;lt; b.minPoint.y || a.minPoint.y &amp;gt; b.maxPoint.y) return false;
    if (a.maxPoint.z &amp;lt; b.minPoint.z || a.minPoint.z &amp;gt; b.maxPoint.z) return false;
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 min max에 교차할 수 있는지 교차한다면 충돌로 판정한다. 비교적 간단하다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OBB&amp;nbsp;(Oriented&amp;nbsp;Bounding&amp;nbsp;Box)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기 자신의 로컬 축을 가지는 박스로 회전이 있다.&lt;br /&gt;SAT (Separating Axos Theorem) 기반 판정을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVPu7f/dJMcagYvRxq/Ns3vJuQCHe3qfrGUPnSIq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVPu7f/dJMcagYvRxq/Ns3vJuQCHe3qfrGUPnSIq1/img.png&quot; data-alt=&quot;출처 : https://kwonvector.tistory.com/59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVPu7f/dJMcagYvRxq/Ns3vJuQCHe3qfrGUPnSIq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVPu7f%2FdJMcagYvRxq%2FNs3vJuQCHe3qfrGUPnSIq1%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;470&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://kwonvector.tistory.com/59&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;두&amp;nbsp;개의&amp;nbsp;볼록&amp;nbsp;도형(Convex&amp;nbsp;Shape)이&amp;nbsp;충돌하지&amp;nbsp;않는다면&lt;br /&gt;반드시&amp;nbsp;두&amp;nbsp;도형을&amp;nbsp;완전히&amp;nbsp;분리할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;축(Separating&amp;nbsp;Axis)이&amp;nbsp;하나&amp;nbsp;이상&amp;nbsp;존재한다.&lt;br /&gt;&lt;br /&gt;즉, 어떤 축 하나라도 두 도형을 그 축에 투영했을 때 투영된 구간이 겹치지 않으면&lt;br /&gt;&amp;rarr; 두 도형은 충돌하지 않는다&lt;br /&gt;&lt;br /&gt;반대로 말하면, 모든 후보 축에서 투영 결과가 겹친다면 &lt;br /&gt;&amp;rarr; 충돌 상태라고 판단할 수 있다.&lt;br /&gt;&lt;br /&gt;OBB&amp;nbsp;vs&amp;nbsp;OBB&amp;nbsp;충돌에서는&amp;nbsp;다음&amp;nbsp;3가지&amp;nbsp;종류의&amp;nbsp;축을&amp;nbsp;모두&amp;nbsp;검사해야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 첫 번째 OBB의 로컬 축 (3개)&lt;/b&gt;&lt;br /&gt;Right, Up, Forward&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 두 번째 OBB의 로컬 축 (3개)&lt;/b&gt;&lt;br /&gt;Right, Up, Forward&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 두 OBB의 로컬 축 간 외적(Cross Product) 축 (9개)&lt;/b&gt;&lt;br /&gt;이 부분이 SAT에서 가장 중요한 핵심이다.&lt;br /&gt;두 박스가 서로 회전된 상태일 때,&lt;br /&gt;각자의 면(face) 기준 축으로는 겹쳐 보이지만..&amp;nbsp;&lt;br /&gt;실제로는&amp;nbsp;엣지(edge)끼리&amp;nbsp;엇갈려&amp;nbsp;충돌하지&amp;nbsp;않는&amp;nbsp;경우가&amp;nbsp;존재한다.&lt;br /&gt;&lt;br /&gt;이 경우 분리축은&lt;br /&gt;A 박스의 축 &amp;times; B 박스의 축&lt;br /&gt;즉, 엣지와 엣지 사이에 수직인 방향이 된다.&lt;br /&gt;첫&amp;nbsp;번째&amp;nbsp;OBB&amp;nbsp;축이&amp;nbsp;3개,&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;OBB&amp;nbsp;축도&amp;nbsp;3개이므로&lt;br /&gt;외적&amp;nbsp;조합은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;총&amp;nbsp;9개가&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;3&amp;nbsp;&amp;times;&amp;nbsp;3&amp;nbsp;=&amp;nbsp;9&lt;br /&gt;&lt;br /&gt;총합 15의 축이 필요하게 됨&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;15개의&amp;nbsp;축&amp;nbsp;중&lt;br /&gt;단&amp;nbsp;하나라도&amp;nbsp;투영&amp;nbsp;결과가&amp;nbsp;겹치지&amp;nbsp;않으면&amp;nbsp;&amp;rarr;&amp;nbsp;충돌이&amp;nbsp;아니다.&lt;br /&gt;모든&amp;nbsp;축에서&amp;nbsp;겹친다면&amp;nbsp;&amp;rarr;&amp;nbsp;충돌&amp;nbsp;상태로&amp;nbsp;판단한다.&lt;/p&gt;
&lt;pre id=&quot;code_1768216600106&quot; class=&quot;thrift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;struct OBB
{
    DD_Vector3 centerPoint; // 중심점
    DD_Vector3 axis[3];    // 정규화된 로컬 축 (Right, Up, Forward)
    DD_Vector3 halfSize;   // 각 축 방향 반길이
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1768216846929&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ========================================
// OBB vs OBB Collision (SAT - Single Function)
// ========================================
bool IntersectOBB(const OBB&amp;amp; a, const OBB&amp;amp; b)
{
    // 두 OBB 중심점 차이 벡터 - 중심 거리 &amp;gt; (A 투영 길이 + B 투영 길이)
    Vec3 centerDiff = b.center - a.center;

    // SAT에서 검사할 최대 15개의 분리축
    Vec3 axes[15];
    int axisCount = 0;

    // ----------------------------------------
    // 1️. a 로컬 축 (3개)
    // ----------------------------------------
    for (int i = 0; i &amp;lt; 3; ++i)
        axes[axisCount++] = a.axis[i];

    // ----------------------------------------
    // 2. b 로컬 축 (3개)
    // ----------------------------------------
    for (int i = 0; i &amp;lt; 3; ++i)
        axes[axisCount++] = b.axis[i];

    // ----------------------------------------
    // 3️. 두 OBB 로컬 축의 외적 (최대 9개)
    // ----------------------------------------
    for (int i = 0; i &amp;lt; 3; ++i)
    {
        for (int j = 0; j &amp;lt; 3; ++j)
        {
            Vec3 cross = Cross(a.axis[i], b.axis[j]);

            // 축이 거의 0이면 (서로 평행) 의미 없음
            if (cross.LengthSq() &amp;gt; DD_SMALL_NUMBER)
                axes[axisCount++] = Normalize(cross);
        }
    }

    // ----------------------------------------
    // 모든 축에 대해 SAT 검사
    // ----------------------------------------
    for (int i = 0; i &amp;lt; axisCount; ++i)
    {
        const Vec3&amp;amp; axis = axes[i];

        // 중심점 거리 (두 OBB 중심을 축에 투영)
        float distance = fabs(Dot(centerDiff, axis));

        // OBB A를 축에 투영한 반 길이
        float projectionA =
            fabs(Dot(a.axis[0], axis)) * a.halfSize.x +
            fabs(Dot(a.axis[1], axis)) * a.halfSize.y +
            fabs(Dot(a.axis[2], axis)) * a.halfSize.z;

        // OBB B를 축에 투영한 반 길이
        float projectionB =
            fabs(Dot(b.axis[0], axis)) * b.halfSize.x +
            fabs(Dot(b.axis[1], axis)) * b.halfSize.y +
            fabs(Dot(b.axis[2], axis)) * b.halfSize.z;

        if (distance &amp;gt; (projectionA + projectionB))
        {
            // 하나라도 분리되는 축이 있으면 충돌 아님
            return false;
        }
    }

    // 모든 축에서 겹침 &amp;rarr; 충돌
    return true;
}&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;MTV(Minimum&amp;nbsp;Translation&amp;nbsp;Vector)&amp;nbsp;연산&amp;nbsp;및&amp;nbsp;도형&amp;nbsp;이동 &lt;/h3&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;길이만큼&amp;nbsp;도형을&amp;nbsp;이동시켜야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;도형을&amp;nbsp;이동시키기&amp;nbsp;위해&amp;nbsp;MTV를&amp;nbsp;구해서&amp;nbsp;이를&amp;nbsp;도형&amp;nbsp;이동에&amp;nbsp;적용해야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;여기서&amp;nbsp;MTV는&amp;nbsp;겹쳐진&amp;nbsp;도형을&amp;nbsp;겹쳐지지&amp;nbsp;않은&amp;nbsp;상태가&amp;nbsp;되기&amp;nbsp;위한&amp;nbsp;최소한의&amp;nbsp;벡터를&amp;nbsp;말한다.&amp;nbsp; &lt;br /&gt;OBB에서는&amp;nbsp;SAT에서&amp;nbsp;계산된&amp;nbsp;각&amp;nbsp;분리축의&amp;nbsp;투영&amp;nbsp;겹침&amp;nbsp;길이&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;작은&amp;nbsp;값을&amp;nbsp;가지는&amp;nbsp;축이&amp;nbsp;MTV를&amp;nbsp;결정한다. &lt;br /&gt;&lt;br /&gt;MTV의&amp;nbsp;방향&amp;nbsp;결정은&amp;nbsp;노말&amp;nbsp;즉,&amp;nbsp;부딪힌&amp;nbsp;오브젝트의&amp;nbsp;반대방향을&amp;nbsp;반환해서&amp;nbsp;이동시킨다.&lt;/p&gt;</description>
      <category>STUDY/DirectX11</category>
      <category>AABB</category>
      <category>directx</category>
      <category>mtv</category>
      <category>obb</category>
      <category>충돌처리</category>
      <category>투영</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/113</guid>
      <comments>https://dlemrcnd.tistory.com/113#entry113comment</comments>
      <pubDate>Mon, 12 Jan 2026 20:22:53 +0900</pubDate>
    </item>
    <item>
      <title>RAII 패턴, 스마트 포인터 (unique_ptr, shared_ptr) 구현</title>
      <link>https://dlemrcnd.tistory.com/112</link>
      <description>&lt;p data-end=&quot;210&quot; data-start=&quot;132&quot; data-ke-size=&quot;size16&quot;&gt;C++ 공부하다 보면 RAII라는 말을 꼭 한 번은 듣게 된다.&lt;br /&gt;(Resource Acquisition Is Initialization)&lt;/p&gt;
&lt;blockquote data-end=&quot;260&quot; data-start=&quot;232&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;234&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자원은 객체의 생명주기에 묶어서 관리하자&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;301&quot; data-start=&quot;262&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;280&quot; data-start=&quot;262&quot;&gt;객체가 생성될 때 자원을 얻고&lt;/li&gt;
&lt;li data-end=&quot;301&quot; data-start=&quot;281&quot;&gt;객체가 파괴될 때 자원을 해제한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;331&quot; data-start=&quot;303&quot; data-ke-size=&quot;size16&quot;&gt;파일, 메모리, 뮤텍스 같은 것들이 전부 대상이다.&lt;/p&gt;
&lt;hr data-end=&quot;336&quot; data-start=&quot;333&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;361&quot; data-start=&quot;338&quot; data-ke-size=&quot;size26&quot;&gt;delete를 호출하면..&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Foo* foo = &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(); &lt;/span&gt;&lt;span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;/span&gt;&lt;span&gt; foo; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;457&quot; data-start=&quot;416&quot; data-ke-size=&quot;size16&quot;&gt;이 코드 자체는 틀리지 않는다.&lt;br /&gt;문제는 &lt;b&gt;사람이 틀린다&lt;/b&gt;는 점이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;510&quot; data-start=&quot;459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;468&quot; data-start=&quot;459&quot;&gt;예외 터지면?&lt;/li&gt;
&lt;li data-end=&quot;485&quot; data-start=&quot;469&quot;&gt;return 중간에 하면?&lt;/li&gt;
&lt;li data-end=&quot;510&quot; data-start=&quot;486&quot;&gt;누가 delete 해야 하는지 헷갈리면?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;525&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;결국 이런 코드가 된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 했는지 안 했는지 알 수 없는 포인터&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;RAII는 이걸 구조적으로 막을 수 있음&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이걸 가장 단순하게 보여주는 게 unique_ptr이다.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;708&quot; data-start=&quot;705&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;732&quot; data-start=&quot;710&quot; data-ke-size=&quot;size26&quot;&gt;UniquePtr &amp;ndash; 소유자는 하나&lt;/h2&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;734&quot; data-ke-size=&quot;size16&quot;&gt;unique_ptr의 규칙은 명확하다. 소유자는 한명이다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;789&quot; data-start=&quot;759&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;765&quot; data-start=&quot;759&quot;&gt;복사 ❌&lt;/li&gt;
&lt;li data-end=&quot;772&quot; data-start=&quot;766&quot;&gt;이동 ⭕&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;773&quot;&gt;소멸 시 자동 delete&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;809&quot; data-start=&quot;791&quot; data-ke-size=&quot;size16&quot;&gt;그래서 인터페이스도 이렇게 된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1766482714693&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// 복사 생성자 대입연산자 삭제
	DD_UniquePtr(const DD_UniquePtr&amp;amp; rhs) = delete;
	DD_UniquePtr&amp;amp; operator= (const DD_UniquePtr&amp;amp; rhs) = delete;

	DD_UniquePtr(DD_UniquePtr&amp;amp;&amp;amp; rhs) noexcept
	{
		this-&amp;gt;m_pointer = rhs.m_pointer;
		rhs.m_pointer = nullptr;
		std::cout &amp;lt;&amp;lt; &quot;Move Constructor Called&quot; &amp;lt;&amp;lt; std::endl;
	}
	DD_UniquePtr&amp;amp; operator= (DD_UniquePtr&amp;amp;&amp;amp; rhs) noexcept
	{
		if (this != &amp;amp;rhs)
		{
			delete m_pointer;
			m_pointer = rhs.m_pointer;
			rhs.m_pointer = nullptr;
		}

		std::cout &amp;lt;&amp;lt; &quot;Move Assignment Operator Called&quot; &amp;lt;&amp;lt; std::endl;
		return *this;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;941&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;이 한 줄만 봐도 의미가 전달된다.&lt;/p&gt;
&lt;blockquote data-end=&quot;962&quot; data-start=&quot;943&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;945&quot; data-ke-size=&quot;size16&quot;&gt;복사 대입 X 무조건 std::move를 통해 소유권 전달만 가능&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;986&quot; data-start=&quot;964&quot; data-ke-size=&quot;size16&quot;&gt;이동 생성자에서는 그냥 소유권만 넘긴다.&lt;br /&gt;스코프를 넘어가거나 들고있는 객체가 사라지게 되면 알아서 소멸자에서 delete를 해준다. &lt;br /&gt;왠만한건 다 유니크로 하면 될듯&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1766483019351&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once

namespace DD
{
	template &amp;lt;class T&amp;gt;
	class DD_UniquePtr
	{
	public:
		T* m_pointer;
	public:
		void reset(T* _Ptr = nullptr) noexcept
		{
			if (_Ptr != m_pointer)
			{
				delete m_pointer;
			}

			m_pointer = _Ptr;
		}
	public:
		DD_UniquePtr() {}
		DD_UniquePtr(T* ptr) : m_pointer(ptr) {}
		~DD_UniquePtr()
		{
			if (m_pointer != nullptr)
				delete m_pointer;
		}

		// 복사 생성자 대입연산자 삭제
		DD_UniquePtr(const DD_UniquePtr&amp;amp; rhs) = delete;
		DD_UniquePtr&amp;amp; operator= (const DD_UniquePtr&amp;amp; rhs) = delete;

		DD_UniquePtr(DD_UniquePtr&amp;amp;&amp;amp; rhs) noexcept
		{
			this-&amp;gt;m_pointer = rhs.m_pointer;
			rhs.m_pointer = nullptr;
			std::cout &amp;lt;&amp;lt; &quot;Move Constructor Called&quot; &amp;lt;&amp;lt; std::endl;
		}
		DD_UniquePtr&amp;amp; operator= (DD_UniquePtr&amp;amp;&amp;amp; rhs) noexcept
		{
			if (this != &amp;amp;rhs)
			{
				delete m_pointer;
				m_pointer = rhs.m_pointer;
				rhs.m_pointer = nullptr;
			}

			std::cout &amp;lt;&amp;lt; &quot;Move Assignment Operator Called&quot; &amp;lt;&amp;lt; std::endl;
			return *this;
		}
	};

	template &amp;lt;class T, class... Args&amp;gt;
	DD_UniquePtr&amp;lt;T&amp;gt; MakeUnique(Args... args)
	{
		return DD_UniquePtr&amp;lt;T&amp;gt;(new T(args...));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1168&quot; data-start=&quot;1165&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1197&quot; data-start=&quot;1170&quot; data-ke-size=&quot;size26&quot;&gt;SharedPtr &amp;ndash; 여러 곳에서 쓰는 경우&lt;/h2&gt;
&lt;p data-end=&quot;1227&quot; data-start=&quot;1199&quot; data-ke-size=&quot;size16&quot;&gt;unique_ptr처럼 &amp;ldquo;혼자만 쓰는 자원&amp;rdquo;이 아닐때 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1272&quot; data-start=&quot;1229&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1248&quot; data-start=&quot;1229&quot;&gt;여러 시스템이 같은 객체를 참조&lt;/li&gt;
&lt;li data-end=&quot;1272&quot; data-start=&quot;1249&quot;&gt;생존 시점을 명확히 정하기 어려운 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1300&quot; data-start=&quot;1274&quot; data-ke-size=&quot;size16&quot;&gt;이럴 때는 shared_ptr이 필요해진다.&lt;/p&gt;
&lt;hr data-end=&quot;1323&quot; data-start=&quot;1320&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1348&quot; data-start=&quot;1325&quot; data-ke-size=&quot;size26&quot;&gt;참조 카운트 Control Block 하나로 해결&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1405&quot; data-start=&quot;1366&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1377&quot; data-start=&quot;1366&quot;&gt;실제 객체 포인터&lt;/li&gt;
&lt;li data-end=&quot;1405&quot; data-start=&quot;1378&quot;&gt;refCount를 가진 ControlBlock&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1766483138683&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	struct ControlBlock
	{
		int refCount = 1;
	};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1499&quot; data-start=&quot;1466&quot; data-ke-size=&quot;size16&quot;&gt;복사될 때 증가&lt;br /&gt;소멸될 때 감소&lt;br /&gt;0이 되면 자원 해제&lt;/p&gt;
&lt;pre id=&quot;code_1766483165071&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	void Release()
	{
		if (m_control)
		{
			--m_control-&amp;gt;refCount;

			if (m_control-&amp;gt;refCount == 0)
			{
				delete m_pointer;
				delete m_control;
			}
		}

		m_pointer = nullptr;
		m_control = nullptr;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1629&quot; data-start=&quot;1582&quot; data-ke-size=&quot;size16&quot;&gt;참조 카운트로 누가 이 메모리를 참조하고 있는지 카운팅한다.&lt;br /&gt;순환 참조 문제는 있긴한데 weak_ptr 과 함께 나중에 다루도록..하겠다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1766483352003&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#pragma once
#include &amp;lt;iostream&amp;gt;

namespace DD
{
	template &amp;lt;class T&amp;gt;
	class DD_SharedPtr
	{
	private:
		struct ControlBlock
		{
			int refCount = 1;
		};

		T* m_pointer = nullptr;
		ControlBlock* m_control = nullptr;

	public:
		DD_SharedPtr() {}
		explicit DD_SharedPtr(T* ptr)
			: m_pointer(ptr)
		{
			if (ptr)
				m_control = new ControlBlock();
		}
		~DD_SharedPtr()
		{
			Release();
		}

		DD_SharedPtr(const DD_SharedPtr&amp;amp; rhs)
		{
			m_pointer = rhs.m_pointer;
			m_control = rhs.m_control;

			if (m_control)
				++m_control-&amp;gt;refCount;

			std::cout &amp;lt;&amp;lt; &quot;Copy Constructor Called (refCount = &quot;
				&amp;lt;&amp;lt; use_count() &amp;lt;&amp;lt; &quot;)\n&quot;;
		}

		DD_SharedPtr&amp;amp; operator=(const DD_SharedPtr&amp;amp; rhs)
		{
			if (this != &amp;amp;rhs)
			{
				Release();

				m_pointer = rhs.m_pointer;
				m_control = rhs.m_control;

				if (m_control)
					++m_control-&amp;gt;refCount;
			}

			std::cout &amp;lt;&amp;lt; &quot;Copy Assignment Operator Called (refCount = &quot;
				&amp;lt;&amp;lt; use_count() &amp;lt;&amp;lt; &quot;)\n&quot;;
			return *this;
		}

		DD_SharedPtr(DD_SharedPtr&amp;amp;&amp;amp; rhs) noexcept
		{
			m_pointer = rhs.m_pointer;
			m_control = rhs.m_control;

			rhs.m_pointer = nullptr;
			rhs.m_control = nullptr;

			std::cout &amp;lt;&amp;lt; &quot;Move Constructor Called\n&quot;;
		}

		DD_SharedPtr&amp;amp; operator=(DD_SharedPtr&amp;amp;&amp;amp; rhs) noexcept
		{
			if (this != &amp;amp;rhs)
			{
				Release();

				m_pointer = rhs.m_pointer;
				m_control = rhs.m_control;

				rhs.m_pointer = nullptr;
				rhs.m_control = nullptr;
			}

			std::cout &amp;lt;&amp;lt; &quot;Move Assignment Operator Called\n&quot;;
			return *this;
		}

	public:
		void reset(T* ptr = nullptr)
		{
			Release();

			if (ptr)
			{
				m_pointer = ptr;
				m_control = new ControlBlock();
			}
		}

		int use_count() const
		{
			return m_control ? m_control-&amp;gt;refCount : 0;
		}

		T* get() const { return m_pointer; }
		T&amp;amp; operator*() const { return *m_pointer; }
		T* operator-&amp;gt;() const { return m_pointer; }

	private:
		void Release()
		{
			if (m_control)
			{
				--m_control-&amp;gt;refCount;

				if (m_control-&amp;gt;refCount == 0)
				{
					delete m_pointer;
					delete m_control;
				}
			}

			m_pointer = nullptr;
			m_control = nullptr;
		}
	};

	template &amp;lt;class T, class... Args&amp;gt;
	DD_SharedPtr&amp;lt;T&amp;gt; MakeShared(Args... args)
	{
		return DD_SharedPtr&amp;lt;T&amp;gt;(new T(args...));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1634&quot; data-start=&quot;1631&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1652&quot; data-start=&quot;1636&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;1697&quot; data-start=&quot;1654&quot; data-ke-size=&quot;size16&quot;&gt;RAII를 머리로만 이해할 때는 &amp;ldquo;자동으로 정리해준다&amp;rdquo; 정도로 생각했는데,&lt;br /&gt;스마트 포인터를 직접 구현해보니까 되게 단순한 구조로 되어있다는 생각이 든다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1785&quot; data-start=&quot;1740&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1753&quot; data-start=&quot;1740&quot;&gt;생성자 = 자원 획득&lt;/li&gt;
&lt;li data-end=&quot;1767&quot; data-start=&quot;1754&quot;&gt;소멸자 = 자원 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1831&quot; data-start=&quot;1828&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1838&quot; data-start=&quot;1833&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1946&quot; data-start=&quot;1840&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1869&quot; data-start=&quot;1840&quot;&gt;RAII는 &amp;ldquo;자원을 객체 생명주기에 묶자&amp;rdquo;는 원칙&lt;/li&gt;
&lt;li data-end=&quot;1889&quot; data-start=&quot;1870&quot;&gt;UniquePtr &amp;rarr; 단일 소유&lt;/li&gt;
&lt;li data-end=&quot;1918&quot; data-start=&quot;1890&quot;&gt;SharedPtr &amp;rarr; 다중 소유 + 참조 카운트&lt;/li&gt;
&lt;li data-end=&quot;1946&quot; data-start=&quot;1919&quot;&gt;스마트 포인터는 RAII의 가장 대표적인 구현&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>STUDY/C++</category>
      <category>shared_ptr</category>
      <category>unique_ptr</category>
      <category>스마트 포인터</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/112</guid>
      <comments>https://dlemrcnd.tistory.com/112#entry112comment</comments>
      <pubDate>Tue, 23 Dec 2025 18:50:05 +0900</pubDate>
    </item>
    <item>
      <title>C++로 HashMap 직접 구현해보기 (Chaining + Rehash)</title>
      <link>https://dlemrcnd.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C++에서는&amp;nbsp;std::unordered_map이라는&amp;nbsp;해시&amp;nbsp;테이블을&amp;nbsp;제공한다. &lt;br /&gt;하지만&amp;nbsp;실제로&amp;nbsp;해시&amp;nbsp;충돌이&amp;nbsp;어떻게&amp;nbsp;처리되는지,&amp;nbsp;rehash는&amp;nbsp;언제&amp;nbsp;발생하는지, &lt;br /&gt;load&amp;nbsp;factor는&amp;nbsp;어떤&amp;nbsp;의미를&amp;nbsp;가지는지&amp;nbsp;구현하면서&amp;nbsp;이해하는&amp;nbsp;과정. &lt;br /&gt;그래서&amp;nbsp;이번&amp;nbsp;글에서는&amp;nbsp;체이닝&amp;nbsp;방식을&amp;nbsp;사용하는&amp;nbsp;HashMap을&amp;nbsp;직접&amp;nbsp;구현하며&amp;nbsp;내부&amp;nbsp;동작을&amp;nbsp;정리해본다.&lt;/p&gt;
&lt;p data-end=&quot;245&quot; data-start=&quot;141&quot; data-ke-size=&quot;size16&quot;&gt;구현된 HashMap은 &lt;b&gt;Separate Chaining(체이닝)&lt;/b&gt; 방식을 사용한다.&lt;br /&gt;해시 충돌이 발생했을 때, 같은 버킷에 속한 요소들을 &lt;b&gt;연결 리스트로 관리&lt;/b&gt;하는 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;261&quot; data-start=&quot;247&quot; data-ke-size=&quot;size16&quot;&gt;전체 구조는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1766474694924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DD_HashMap
 ├─ vector&amp;lt;DD_HashBucket&amp;gt;
 │    ├─ dummy head node
 │    └─ linked list (DD_HashNode)
 └─ hash&amp;lt;Key&amp;gt; + modulo bucket size&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;424&quot; data-start=&quot;404&quot; data-ke-size=&quot;size16&quot;&gt;구현의 핵심 요소는 아래 세 가지다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;546&quot; data-start=&quot;426&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;468&quot; data-start=&quot;426&quot;&gt;&lt;b&gt;버킷 배열&lt;/b&gt;: std::vector&amp;lt;DD_HashBucket&amp;gt;&lt;/li&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;469&quot;&gt;&lt;b&gt;충돌 처리 방식&lt;/b&gt;: 연결 리스트(Separate Chaining)&lt;/li&gt;
&lt;li data-end=&quot;546&quot; data-start=&quot;512&quot;&gt;&lt;b&gt;Rehash 조건&lt;/b&gt;: Load Factor(적재율)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;579&quot; data-start=&quot;553&quot; data-ke-size=&quot;size26&quot;&gt;1. 버킷 배열 (Bucket Array)&lt;/h2&gt;
&lt;p data-end=&quot;656&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;HashMap은 내부적으로 고정된 크기의 &lt;b&gt;버킷 배열&lt;/b&gt;을 가진다.&lt;br /&gt;각 Key는 해시 함수를 통해 하나의 버킷 인덱스로 매핑된다.&lt;/p&gt;
&lt;pre id=&quot;code_1766474936159&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint64_t GenerateHash(const Key&amp;amp; key, const std::vector&amp;lt;BucketType&amp;gt;&amp;amp; bucket)
{
    std::hash&amp;lt;Key&amp;gt; hasher;
    return hasher(key) % bucket.size();
}&lt;/code&gt;&lt;/pre&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 data-end=&quot;855&quot; data-start=&quot;818&quot;&gt;std::hash&amp;lt;Key&amp;gt;를 사용해 Key를 해시값으로 변환&lt;/li&gt;
&lt;li data-end=&quot;886&quot; data-start=&quot;856&quot;&gt;현재 버킷 개수로 나머지 연산을 하여 인덱스를 결정&lt;/li&gt;
&lt;li data-end=&quot;921&quot; data-start=&quot;887&quot;&gt;Key 타입은 std::hash가 정의되어 있어야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1010&quot; data-start=&quot;976&quot; data-ke-size=&quot;size26&quot;&gt;2. 해시 충돌 처리 &amp;ndash; Separate Chaining&lt;/h2&gt;
&lt;p data-end=&quot;1082&quot; data-start=&quot;1012&quot; data-ke-size=&quot;size16&quot;&gt;서로 다른 Key라도 같은 해시 값을 가질 수 있다.&lt;br /&gt;이 문제를 **해시 충돌(Hash Collision)**이라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;1164&quot; data-start=&quot;1084&quot; data-ke-size=&quot;size16&quot;&gt;이번 구현에서는 &lt;b&gt;Separate Chaining&lt;/b&gt; 방식을 사용했다.&lt;br /&gt;즉, 같은 버킷에 매핑되는 요소들은 &lt;b&gt;연결 리스트로 관리&lt;/b&gt;된다.&lt;/p&gt;
&lt;h3 data-end=&quot;1181&quot; data-start=&quot;1166&quot; data-ke-size=&quot;size23&quot;&gt;DD_HashNode&lt;/h3&gt;
&lt;pre id=&quot;code_1766474971653&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template&amp;lt;typename Key, typename Value&amp;gt;
class DD_HashNode
{
    Key m_key;
    Value m_value;
    DD_HashNode* m_next;
};&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;각 노드는 Key / Value 쌍과 다음 노드를 가리키는 포인터를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버켓에는 dummy head node가 있음, 노드는 항상 이 head 뒤에 추가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1640&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size26&quot;&gt;3. Load Factor와 Rehash&lt;/h2&gt;
&lt;p data-end=&quot;1689&quot; data-start=&quot;1642&quot; data-ke-size=&quot;size16&quot;&gt;HashMap의 성능은 &lt;b&gt;Load Factor(적재율)&lt;/b&gt; 에 크게 영향을 받는다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;load factor = (현재 저장된 요소 수) / (버킷 개수) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1760&quot; data-start=&quot;1741&quot; data-ke-size=&quot;size16&quot;&gt;Load Factor가 높아질수록:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1820&quot; data-start=&quot;1761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1778&quot; data-start=&quot;1761&quot;&gt;한 버킷에 많은 노드가 몰림&lt;/li&gt;
&lt;li data-end=&quot;1796&quot; data-start=&quot;1779&quot;&gt;연결 리스트 탐색 비용 증가&lt;/li&gt;
&lt;li data-end=&quot;1820&quot; data-start=&quot;1797&quot;&gt;평균 시간 복잡도가 O(1)에서 멀어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1835&quot; data-start=&quot;1822&quot; data-ke-size=&quot;size23&quot;&gt;Rehash 조건&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;constexpr&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;float&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CHECK_MAXLOAD = &lt;/span&gt;&lt;span&gt;&lt;span&gt;0.8f&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (loadFactor &amp;gt;= CHECK_MAXLOAD) { &lt;/span&gt;&lt;span&gt;&lt;span&gt;Rehash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(bucketSize * &lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2011&quot; data-start=&quot;1964&quot; data-ke-size=&quot;size16&quot;&gt;Load Factor가 &lt;b&gt;0.8 이상&lt;/b&gt;이 되면 Rehash를 수행하도록 구현했다.&lt;/p&gt;
&lt;hr data-end=&quot;2016&quot; data-start=&quot;2013&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2030&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size26&quot;&gt;Rehash 과정&lt;/h2&gt;
&lt;p data-end=&quot;2052&quot; data-start=&quot;2032&quot; data-ke-size=&quot;size16&quot;&gt;Rehash는 다음 순서로 진행된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2149&quot; data-start=&quot;2054&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2072&quot; data-start=&quot;2054&quot;&gt;기존보다 큰 버킷 배열 생성&lt;/li&gt;
&lt;li data-end=&quot;2088&quot; data-start=&quot;2073&quot;&gt;모든 기존 노드를 순회&lt;/li&gt;
&lt;li data-end=&quot;2117&quot; data-start=&quot;2089&quot;&gt;새로운 버킷 크기에 맞게 해시 값을 다시 계산&lt;/li&gt;
&lt;li data-end=&quot;2134&quot; data-start=&quot;2118&quot;&gt;노드를 새 버킷으로 이동&lt;/li&gt;
&lt;li data-end=&quot;2149&quot; data-start=&quot;2135&quot;&gt;기존 버킷과 swap&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1766475155878&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Rehash(int32_t newSize)
{
    std::vector&amp;lt;BucketType&amp;gt; newBucket(newSize);

    for (int idx = 0; idx &amp;lt; m_bucket.size(); ++idx)
    {
        NodeType* currentNode = m_bucket[idx].GetHead();
        m_bucket[idx].SetHead(nullptr);

        while (currentNode)
        {
            NodeType* nextNode = currentNode-&amp;gt;GetNext();
            currentNode-&amp;gt;SetNext(nullptr);

            uint64_t newIdx = GenerateHash(currentNode-&amp;gt;GetKey(), newBucket);
            newBucket[newIdx].AddNode(currentNode);

            currentNode = nextNode;
        }
    }
    m_bucket.swap(newBucket);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2831&quot; data-start=&quot;2753&quot; data-ke-size=&quot;size16&quot;&gt;Rehash의 시간 복잡도는 &lt;b&gt;O(n)&lt;/b&gt; 이지만,&lt;br /&gt;자주 발생하지 않도록 설계되었기 때문에 전체 평균 성능에는 큰 영향을 주지 않을 것 같다.&lt;/p&gt;
&lt;hr data-end=&quot;2836&quot; data-start=&quot;2833&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2850&quot; data-start=&quot;2838&quot; data-ke-size=&quot;size26&quot;&gt;시간 복잡도 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;연산평균최악
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2983&quot; data-start=&quot;2852&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2983&quot; data-start=&quot;2886&quot;&gt;
&lt;tr data-end=&quot;2910&quot; data-start=&quot;2886&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2895&quot; data-start=&quot;2886&quot;&gt;Insert&lt;/td&gt;
&lt;td data-end=&quot;2902&quot; data-start=&quot;2895&quot; data-col-size=&quot;sm&quot;&gt;O(1)&lt;/td&gt;
&lt;td data-end=&quot;2910&quot; data-start=&quot;2902&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2933&quot; data-start=&quot;2911&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2918&quot; data-start=&quot;2911&quot;&gt;Find&lt;/td&gt;
&lt;td data-end=&quot;2925&quot; data-start=&quot;2918&quot; data-col-size=&quot;sm&quot;&gt;O(1)&lt;/td&gt;
&lt;td data-end=&quot;2933&quot; data-start=&quot;2925&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2958&quot; data-start=&quot;2934&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2943&quot; data-start=&quot;2934&quot;&gt;Delete&lt;/td&gt;
&lt;td data-end=&quot;2950&quot; data-start=&quot;2943&quot; data-col-size=&quot;sm&quot;&gt;O(1)&lt;/td&gt;
&lt;td data-end=&quot;2958&quot; data-start=&quot;2950&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2983&quot; data-start=&quot;2959&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2968&quot; data-start=&quot;2959&quot;&gt;Rehash&lt;/td&gt;
&lt;td data-end=&quot;2975&quot; data-start=&quot;2968&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;td data-end=&quot;2983&quot; data-start=&quot;2975&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2988&quot; data-start=&quot;2985&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2996&quot; data-start=&quot;2990&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;3109&quot; data-start=&quot;2998&quot; data-ke-size=&quot;size16&quot;&gt;이번 구현을 통해 단순히 unordered_map을 사용하는 것을 넘어,&lt;br /&gt;해시 충돌 처리 방식, Load Factor의 의미, Rehash가 필요한 이유를&lt;br /&gt;구현 관점에서 이해할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;3190&quot; data-start=&quot;3111&quot; data-ke-size=&quot;size16&quot;&gt;표준 컨테이너는 대부분 이런 복잡한 과정을 내부에서 처리해주지만,&lt;br /&gt;직접 구현해보면 자료구조의 특성과 한계를 훨씬 명확하게 체감할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3274&quot; data-start=&quot;3192&quot; data-ke-size=&quot;size16&quot;&gt;다음에는 &lt;b&gt;Open Addressing 방식&lt;/b&gt;이나&lt;br /&gt;&lt;b&gt;메모리 관리 개선(unique_ptr, allocator)&lt;/b&gt; 등을 적용해볼 예정이다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-end=&quot;3274&quot; data-start=&quot;3192&quot; data-ke-size=&quot;size16&quot;&gt;전체 코드&lt;/p&gt;
&lt;pre id=&quot;code_1766475200392&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

// --------------------------------------------------------------------------------------------
// DD_HashNode
// --------------------------------------------------------------------------------------------

template&amp;lt;typename Key, typename Value&amp;gt;
class DD_HashNode
{
public:
	void SetNext(DD_HashNode* node) { m_next = node; }
	void SetValue(const Value&amp;amp; value) { m_value = value; }

	DD_HashNode* GetNext() const { return m_next; }
	const Key&amp;amp; GetKey() const { return m_key; }
	Value&amp;amp; GetValue() { return m_value; }

public:
	DD_HashNode(const Key&amp;amp; key, const Value&amp;amp; value) : m_key(key), m_value(value), m_next(nullptr) {}
	DD_HashNode() : m_key(), m_value(), m_next(nullptr) {}

private:
	Key m_key{};
	Value m_value{};
	class DD_HashNode* m_next = nullptr;
};

// --------------------------------------------------------------------------------------------
// DD_HashBucket
// --------------------------------------------------------------------------------------------

template&amp;lt;typename Key, typename Value&amp;gt;
class DD_HashBucket
{
	using NodeType = DD_HashNode&amp;lt;Key, Value&amp;gt;;
public:
	void AddNode(NodeType* addingNode)
	{
		if (nullptr == addingNode)
			return;

		NodeType* movingNode = m_head-&amp;gt;GetNext();
		m_head-&amp;gt;SetNext(addingNode);
		addingNode-&amp;gt;SetNext(movingNode);
		++m_size;
	}

	void DeleteNode(const Key&amp;amp; key)
	{
		NodeType* prev = m_head;
		NodeType* node = m_head-&amp;gt;GetNext();

		while (node != nullptr)
		{
			if (node-&amp;gt;GetKey() == key)
			{
				prev-&amp;gt;SetNext(node-&amp;gt;GetNext());
				delete node;
				--m_size;
				return;
			}
			prev = node;
			node = node-&amp;gt;GetNext();
		}
	}

	NodeType* FindNode(const Key&amp;amp; key) const
	{
		NodeType* node = m_head-&amp;gt;GetNext();
		while (node != nullptr)
		{
			if (node-&amp;gt;GetKey() == key)
				return node;

			node = node-&amp;gt;GetNext();
		}
		return nullptr;
	}

	void GetElements(std::vector&amp;lt;std::pair&amp;lt;Key, Value&amp;gt;&amp;gt;&amp;amp; outElements)
	{
		outElements.clear();
		outElements.reserve(m_size);

		NodeType* node = m_head-&amp;gt;GetNext();
		while (node != nullptr)
		{
			outElements.emplace_back(node-&amp;gt;GetKey(), node-&amp;gt;GetValue());
			node = node-&amp;gt;GetNext();
		}
	}

	void SetHead(NodeType* NewNode) { m_head = NewNode; }
	NodeType* GetHead() const { return m_head; }
	NodeType* GetNext() const { return m_head ? m_head-&amp;gt;GetNext() : nullptr; }
	int32_t Size() const { return m_size; }

	void Print()
	{
		NodeType* node = m_head-&amp;gt;GetNext();
		while (node != nullptr)
		{
			std::cout &amp;lt;&amp;lt; node-&amp;gt;GetValue() &amp;lt;&amp;lt; &quot; &quot;;
			node = node-&amp;gt;GetNext();
		}
	}
public:
	DD_HashBucket() : m_size(0), m_head(nullptr)
	{
		m_head = new NodeType();
	}

	~DD_HashBucket()
	{
		NodeType* node = m_head;
		while (node != nullptr)
		{
			NodeType* next = node-&amp;gt;GetNext();
			delete node;
			node = next;
		}
	}
private:
	int32_t m_size = 0;
	NodeType* m_head = nullptr;
};

// --------------------------------------------------------------------------------------------
// DD_HashMap
// --------------------------------------------------------------------------------------------

constexpr int32_t BUCKET_SIZE = 16;
constexpr float CHECK_MAXLOAD = 0.8f;

template&amp;lt;typename Key, typename Value&amp;gt;
class DD_HashMap
{
	using BucketType = DD_HashBucket&amp;lt;Key, Value&amp;gt;;
	using NodeType = DD_HashNode&amp;lt;Key, Value&amp;gt;;
public:
	void Insert(const Key&amp;amp; key, const Value&amp;amp; val)
	{
		if (CheckLoadFactor())
		{
			size_t bucketSize = m_bucket.size();
			Rehash(bucketSize * 2);
		}
		Insert_Internal(key, val);
	}

	void Delete(const Key&amp;amp; key)
	{
		uint64_t idx = GenerateHash(key, m_bucket);
		m_bucket[idx].DeleteNode(key);
		m_size--;
	}

	Value&amp;amp; Find(const Key&amp;amp; key)
	{
		uint64_t idx = GenerateHash(key, m_bucket);
		NodeType* found = m_bucket[idx].FindNode(key);
		return found-&amp;gt;GetValue();
	}

	Value&amp;amp; operator[](const Key&amp;amp; key)
	{
		Insert(key, Value{}); // try - emplace
		return Find(key);
	}

	void GetAllElements(std::vector&amp;lt;std::pair&amp;lt;Key, Value&amp;gt;&amp;gt;&amp;amp; outElements)
	{
		size_t bucketSize = m_bucket.size();

		outElements.clear();
		outElements.reserve(bucketSize);

		for (int idx = 0; idx &amp;lt; bucketSize; ++idx)
		{
			std::vector&amp;lt;std::pair&amp;lt;Key, Value&amp;gt;&amp;gt; bucketElements;
			m_bucket[idx].GetElements(bucketElements);
			outElements.insert(outElements.end(), bucketElements.begin(), bucketElements.end());
		}
	}

	void Print()
	{
		size_t bucketSize = m_bucket.size();
		for (int idx = 0; idx &amp;lt; bucketSize; ++idx)
		{
			std::cout &amp;lt;&amp;lt; &quot;[&quot; &amp;lt;&amp;lt; idx &amp;lt;&amp;lt; &quot;] &quot;;
			m_bucket[idx].Print();
			std::cout &amp;lt;&amp;lt; &quot;\n&quot;;
		}
	}

	size_t Size() { return m_size; }

private:
	uint64_t GenerateHash(const Key&amp;amp; key, const std::vector&amp;lt;BucketType&amp;gt;&amp;amp; bucket)
	{
		std::hash&amp;lt;Key&amp;gt; hasher;
		uint64_t Hash = hasher(key) % bucket.size();
		return Hash;
	}

	bool CheckLoadFactor()
	{
		int32_t bucketSize = m_bucket.size();
		float loadFactor = (static_cast&amp;lt;float&amp;gt;(m_size) / static_cast&amp;lt;float&amp;gt;(bucketSize));
		//std::cout &amp;lt;&amp;lt; &quot;item size :&quot; &amp;lt;&amp;lt; m_size &amp;lt;&amp;lt; &quot;, bucket size :&quot; &amp;lt;&amp;lt; bucketSize &amp;lt;&amp;lt; &quot;, load factor :&quot; &amp;lt;&amp;lt; loadFactor &amp;lt;&amp;lt; std::endl;
		return loadFactor &amp;gt;= CHECK_MAXLOAD;
	}

	void Rehash(int32_t newSize)
	{
		std::vector&amp;lt;BucketType&amp;gt; newBucket(newSize);
		for (int idx = 0; idx &amp;lt; m_bucket.size(); ++idx)
		{
			NodeType* currentNode = m_bucket[idx].GetHead();
			m_bucket[idx].SetHead(nullptr);
			while (currentNode)
			{
				NodeType* nextNode = currentNode-&amp;gt;GetNext();
				currentNode-&amp;gt;SetNext(nullptr);

				uint64_t newIdx = GenerateHash(currentNode-&amp;gt;GetKey(), newBucket);
				newBucket[newIdx].AddNode(currentNode);

				currentNode = nextNode;
			}
		}
		m_bucket.swap(newBucket);
	}

	void Insert_Internal(const Key&amp;amp; key, const Value&amp;amp; val)
	{
		uint64_t idx = GenerateHash(key, m_bucket);
		if (NodeType* found = m_bucket[idx].FindNode(key))
		{
			return;
		}

		NodeType* newNode = new NodeType(key, val);
		m_bucket[idx].AddNode(newNode);
		m_size++;
	}

public:
	DD_HashMap() : m_bucket(BUCKET_SIZE), m_size(0) {}
	DD_HashMap(int32_t bucketSize) : m_bucket(bucketSize), m_size(0) {}
	~DD_HashMap() {}

private:
	std::vector&amp;lt;BucketType&amp;gt; m_bucket{};
	int32_t m_size = 0;
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>STUDY/C++</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/111</guid>
      <comments>https://dlemrcnd.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 23 Dec 2025 16:33:50 +0900</pubDate>
    </item>
    <item>
      <title>[UE5] Gameplay Ability System(GAS) - 01</title>
      <link>https://dlemrcnd.tistory.com/110</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/jiwonchoidd/UE5_GasTutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/jiwonchoidd/UE5_GasTutorial&lt;/a&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GAS는 게임플레이 어빌리티 시스템(Gameplay Ability System)의 약자로, 주로 언리얼 엔진(Unreal Engine)에서 사용되는 강력한 프레임워크입니다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAS의 핵심 구성 요소 3가지&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;어트리뷰트 (Attributes)
&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;예: 체력(Health), 마나(Mana), 공격력(AttackPower), 이동속도(MoveSpeed) 등.&lt;/li&gt;
&lt;li&gt;이 값들은 다른 요소들에 의해 실시간으로 변경됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;어빌리티 (Abilities)
&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;/li&gt;
&lt;li&gt;게임플레이 이펙트 (Gameplay Effects)
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힘 증가 버프: 30초 동안 공격력 어트리뷰트를 +10 증가시킴.&lt;/li&gt;
&lt;li&gt;독 디버프: 5초 동안 매초 체력 어트리뷰트를 -5 감소시킴.&lt;/li&gt;
&lt;li&gt;힐: 체력 어트리뷰트를 즉시 +100 회복시킴.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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://youtu.be/Fb5y4PWtud8?si=UgFUTJs7BOo2q-OS&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/Fb5y4PWtud8?si=UgFUTJs7BOo2q-OS&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Fb5y4PWtud8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bh1MSj/hyZf7eTiCB/o6zbKcgZZIAPwUJglA4eB1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/r0VW6/hyZga3LwhG/Ifs0lgkE6Y4Haxkt8O0L4k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Intro to GAS - Gameplay Ability System in Unreal Engine 5 C++&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Fb5y4PWtud8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 예제 프로젝트 구성&lt;/h3&gt;
&lt;pre id=&quot;code_1751816776227&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// add build.cs
	PublicDependencyModuleNames.AddRange(new string[] {
			/...
			&quot;GameplayAbilities&quot;,
			&quot;GameplayTags&quot;,
			&quot;GameplayTasks&quot;,
			.../
		});
        
	// add .uproject
			&quot;Plugins&quot;: [
		/...
		{
			&quot;Name&quot;: &quot;GameplayAbilities&quot;,
			&quot;Enabled&quot;: true
		}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ability System을 사용하기 위해 플러그인 추가를 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Game Ability 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UGameAbility를 상속받는 클래스로 Ability 객체 생성&lt;/p&gt;
&lt;pre id=&quot;code_1751816936120&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UGWAbility_Jump::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{
	if (!ActorInfo-&amp;gt;AvatarActor.IsValid())
		return;

	ACharacter* Character = Cast&amp;lt;ACharacter&amp;gt;(ActorInfo-&amp;gt;AvatarActor.Get());
	if (nullptr == Character)
		return;

#if WITH_EDITOR
	GEngine-&amp;gt;AddOnScreenDebugMessage(-1, 1.f, FColor::Red, TEXT(&quot;UGWAbility_Jump::ActivateAbility&quot;));
#endif
	Character-&amp;gt;Jump();

	EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수를 오버라이딩해서 Jump 능력을 사용할 수 있도록 구성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클래스를 상속받는 BP 에셋을 생성하고 + 버튼을 눌러서 Ability 태그를 지정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBySK/btsO53gmjAu/hz7phVPKCaZ1lTY5EmJNu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBySK/btsO53gmjAu/hz7phVPKCaZ1lTY5EmJNu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBySK/btsO53gmjAu/hz7phVPKCaZ1lTY5EmJNu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBySK%2FbtsO53gmjAu%2Fhz7phVPKCaZ1lTY5EmJNu1%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;534&quot; height=&quot;581&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래는 어빌리티 관련된 주요 함수들&lt;/p&gt;
&lt;pre id=&quot;code_1751818796321&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;엔진 코드
	//	The important functions:
	//	
	//		CanActivateAbility()	- const function to see if ability is activatable. Callable by UI etc
	//
	//		TryActivateAbility()	- Attempts to activate the ability. Calls CanActivateAbility(). Input events can call this directly.
	//								- Also handles instancing-per-execution logic and replication/prediction calls.
	//		
	//		CallActivateAbility()	- Protected, non virtual function. Does some boilerplate 'pre activate' stuff, then calls ActivateAbility()
	//
	//		ActivateAbility()		- What the abilities *does*. This is what child classes want to override.
	//	
	//		CommitAbility()			- Commits reources/cooldowns etc. ActivateAbility() must call this!
	//		
	//		CancelAbility()			- Interrupts the ability (from an outside source).
	//
	//		EndAbility()			- The ability has ended. This is intended to be called by the ability to end itself.
	//	
	// ----------------------------------------------------------------------------------------------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 캐릭터 GameAbilitySystem 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 UAbilitySystemComponent를 상속받는 클래스를 하나 생성해주고 해당 캐릭터 컴포넌트를 사용할 캐릭터 생성자에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751817399832&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Create a AbilitySystem
AbilitySystem = CreateDefaultSubobject&amp;lt;UGWAbilitySystemComponent&amp;gt;(TEXT(&quot;AbilitySystem&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터에는 능력 관련된 입력 바인딩 정보, 능력 부여하는 코드 작성하면 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. 입력 바인딩 정보&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm 어빌리티의 타켓팅을 확정하고 최종 실행하라는 신호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cancel 진행중인 어빌리티를 취소하라는 신호.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SetupPlayerInputCompoent 실행 시 관련되어 정의한 Enum Path 등 구조체를 넘겨 입력 바인딩을 등록함&lt;/p&gt;
&lt;pre id=&quot;code_1751817911927&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AGasTutorialCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	// Set up action bindings
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast&amp;lt;UEnhancedInputComponent&amp;gt;(PlayerInputComponent)) {
		...
		if(AbilitySystem)
		{
			// 5.1 Enum 네임 -&amp;gt; Enum 경로로 변경됨
			FGameplayAbilityInputBinds InputBind = FGameplayAbilityInputBinds(
				TEXT(&quot;Confirm&quot;),
				TEXT(&quot;Cancel&quot;),
				FTopLevelAssetPath(StaticEnum&amp;lt;EGasAbilityInputId&amp;gt;()-&amp;gt;GetPathName()),
				static_cast&amp;lt;int32&amp;gt;(EGasAbilityInputId::Confirm),
				static_cast&amp;lt;int32&amp;gt;(EGasAbilityInputId::Cancel));

			AbilitySystem-&amp;gt;BindAbilityActivationToInputComponent(PlayerInputComponent, InputBind);
		}
	}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 캐릭터 능력 등록&lt;/h3&gt;
&lt;pre id=&quot;code_1751818069275&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// BP 에서 지정할 수 있게 능력 TSubClassOf로 구현
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category= &quot;GWAbility&quot;)
TArray&amp;lt;TSubclassOf&amp;lt;class UGameplayAbility&amp;gt;&amp;gt; DefaultAbilities;


void AGasTutorialCharacter::BeginPlay()
{
	Super::BeginPlay();

	if (AbilitySystem)
	{
		for (TSubclassOf&amp;lt;UGameplayAbility&amp;gt;&amp;amp; Ability : DefaultAbilities)
		{
			if (!Ability)
				continue;

			AbilitySystem-&amp;gt;GiveAbility(
				FGameplayAbilitySpec(Ability, 1, static_cast&amp;lt;int32&amp;gt;(EGasAbilityInputId::Confirm), this));
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터 BP 에서 아까 만든 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Jump&lt;span&gt; 어빌리티를 등록해놓고 캐릭터의 BeginPlay 시점에 능력을 부여합니다.&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-origin-width=&quot;505&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhW7l/btsO6a7DWzV/el7KQa7vBPgXECQLwB5240/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhW7l/btsO6a7DWzV/el7KQa7vBPgXECQLwB5240/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhW7l/btsO6a7DWzV/el7KQa7vBPgXECQLwB5240/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhW7l%2FbtsO6a7DWzV%2Fel7KQa7vBPgXECQLwB5240%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;505&quot; height=&quot;120&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;120&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;h3 data-ke-size=&quot;size23&quot;&gt;4. 능력 사용&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 블루프린트로 AnyKey 입력 시 능력 사용하도록 구현합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHXGLk/btsO5Xga4am/UwKWrGAWJ11DnlHJ81sV4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHXGLk/btsO5Xga4am/UwKWrGAWJ11DnlHJ81sV4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHXGLk/btsO5Xga4am/UwKWrGAWJ11DnlHJ81sV4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHXGLk%2FbtsO5Xga4am%2FUwKWrGAWJ11DnlHJ81sV4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;159&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련되어서 3개 함수가 보였네요. 각각 태그, 클래스, 핸들로 능력 사용하는걸로 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvneO6/btsO55yvsrU/Euvzx2QnvhzDAjaDAsqDK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvneO6/btsO55yvsrU/Euvzx2QnvhzDAjaDAsqDK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvneO6/btsO55yvsrU/Euvzx2QnvhzDAjaDAsqDK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvneO6%2FbtsO55yvsrU%2FEuvzx2QnvhzDAjaDAsqDK1%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;1138&quot; height=&quot;355&quot; data-origin-width=&quot;1138&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;태그로 F 버튼 입력 시 호출하도록 구현했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgegcp/btsO7ocvnYd/F6tZ7h95FusSihKMONhMLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgegcp/btsO7ocvnYd/F6tZ7h95FusSihKMONhMLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgegcp/btsO7ocvnYd/F6tZ7h95FusSihKMONhMLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgegcp%2FbtsO7ocvnYd%2FF6tZ7h95FusSihKMONhMLK%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;889&quot; height=&quot;423&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점프하고 있는 모습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPrTBv/btsO5045u02/sVrIak89K0qOjDKTlWQ7xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPrTBv/btsO5045u02/sVrIak89K0qOjDKTlWQ7xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPrTBv/btsO5045u02/sVrIak89K0qOjDKTlWQ7xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPrTBv%2FbtsO5045u02%2FsVrIak89K0qOjDKTlWQ7xk%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;1138&quot; height=&quot;241&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;241&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>gameabilitysystem</category>
      <category>gameplay</category>
      <category>gas</category>
      <category>TAG</category>
      <category>UE4</category>
      <category>UE5</category>
      <category>능력</category>
      <category>어빌리티</category>
      <category>언리얼 엔진</category>
      <category>플러그인</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/110</guid>
      <comments>https://dlemrcnd.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 7 Jul 2025 01:21:49 +0900</pubDate>
    </item>
    <item>
      <title>언리얼 엔진 소스 빌드 + 설치 빌드 생성</title>
      <link>https://dlemrcnd.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼에서 제공하지 않거나 커스터마이징 해야 할 때, 언리얼 풀 소스를 수정할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 같은 경우에는 IOS에서 홈바 처리로 인해 풀소스 빌드를 해보았다.&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;a href=&quot;https://www.unrealengine.com/en-US/ue-on-github&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.unrealengine.com/en-US/ue-on-github&lt;/a&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;받고 나면 Setup.bat, GenerateProjectFile.bat를 실행한다.&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-origin-width=&quot;919&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yFPMd/btsJD7HO9hu/dwtrkSPsGLn99ZAy57kXV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yFPMd/btsJD7HO9hu/dwtrkSPsGLn99ZAy57kXV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yFPMd/btsJD7HO9hu/dwtrkSPsGLn99ZAy57kXV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyFPMd%2FbtsJD7HO9hu%2FdwtrkSPsGLn99ZAy57kXV0%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;762&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 실행 의존성 파일 설치와 프로젝트 파일 생성을 하게 되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드를 하기 위해 필요한 필수 과정들이다.&lt;/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;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;언리얼 프로젝트처럼&lt;/span&gt;GenerateProjectFile 실행파일은 컴파일된 오브젝트 파일 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에셋 레지스트리, 프로젝트 파일 등을 생성해 각 작업자가 실행해 주면 되기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;형상 관리 프로그램에서는 Setup.bat 이후로 다 추가해 주면 된다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfO2BQ/btsJDZpxEb8/Wz5qiySjPYpk6ygOvJ0I21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfO2BQ/btsJDZpxEb8/Wz5qiySjPYpk6ygOvJ0I21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfO2BQ/btsJDZpxEb8/Wz5qiySjPYpk6ygOvJ0I21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfO2BQ%2FbtsJDZpxEb8%2FWz5qiySjPYpk6ygOvJ0I21%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;402&quot; height=&quot;307&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 .sln 파일로 엔진 소스를 켜서 DevelopmentEditor + {OS} + Ue4 로 빌드를 하면 된다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 빌드 결과물을 소스 제어 할 경우에는 Engine/Binaries 디렉터리를 등록하면 됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;과정에서 임시파일이나 Intermediate 폴더 (플러그인 폴더 포함)는 소스 제어 제외 시켜주자.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 소스 엔진 폴더 내 빌드된 결과물로 협업을 하려면 관리가 어렵고 소스 용량이 크기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;엔진 관리 레포지 &amp;lt;-&amp;gt; 엔진 결과물 레포지로 나누는 것이 좋다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;엔진팀에서는 엔진만 관리하고, 프로젝트 팀에서는 배포된 엔진 파일을 통해, 프로젝트 작업을 할 수 있을 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;InstalledBuild, Unreal Build Graph 개념으로 언리얼 허브에서 받는&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-an-installed-build?application_version=4.27&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-an-installed-build?application_version=4.27&lt;/a&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;BuildGraph, 빌드 스크립트를 명령을 통해서 설치 빌드를 뽑아내면 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #153b65;&quot;&gt;Engine&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #153b65;&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #153b65;&quot;&gt;InstalledEngineBuild&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;xml 명령어 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Automation Tool 호출을 통해 빌드 스크립트 실행 -&amp;gt; 빌드 운영체재 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 별도로 지정하지 않은 경우 해당 엔진 디렉터리의 LocalBuilds/Engine/ 폴더에 설치 빌드 생성 완료&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;&lt;b&gt;명령어 예시&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[IOS]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;{EnginePath}/Engine/Build/BatchFiles/RunUAT.sh&quot; BuildGraph -target=&quot;Make Installed Build Mac&quot; -script=&quot;Engine/Build/InstalledEngineBuild.xml&quot; -set:HostPlatformOnly=true -set:WithDDC=false -set:SignExecutables=false -set:WithWin64=false -set:WithAndroid=false -set:WithLinux=false -set:WithMac=true -set:WithIOS=true -clean&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[AOS]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;{EnginePath}/Engine/Build/BatchFiles/RunUAT.bat&quot; BuildGraph -target=&quot;Make Installed Build Win64&quot; -script=&quot;Engine/Build/InstalledEngineBuild.xml&quot; -set:HostPlatformOnly=true -set:WithDDC=false -set:SignExecutables=false -set:WithWin64=true -set:WithAndroid=true -set:WithLinux=false -set:WithMac=false -set:WithIOS=false -clean&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;어떤 환경의 설치 빌드를 만드는지, 사용할 빌드 스크립트 지정, 그밖에 파라미터를 통해&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #153b65;&quot;&gt;InstalledEngineBuild&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;xml 파일을 까서 보면 &quot;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Make Installed Build Win64&quot; 등 각 옵션에 따른 값을 확인&lt;/span&gt;&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 style=&quot;color: #333333; text-align: start;&quot; 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-origin-width=&quot;1162&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZbEFo/btsJE0HYLij/5ROtfIbMmykkON3M9HlET0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZbEFo/btsJE0HYLij/5ROtfIbMmykkON3M9HlET0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZbEFo/btsJE0HYLij/5ROtfIbMmykkON3M9HlET0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZbEFo%2FbtsJE0HYLij%2F5ROtfIbMmykkON3M9HlET0%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;538&quot; height=&quot;229&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약에 특정 os에서 빌드 실패 시 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;InstalledEngineBuild.xml&lt;span&gt;&amp;nbsp; 직접 &lt;/span&gt;&lt;/span&gt;수정을 해야 할 일이 생길 수도 있다.&amp;nbsp;&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;&lt;a href=&quot;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726497003219&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;4.24: installed build ios fails bcz of &amp;uml;Unable to find valid certificate/mobile provision pair&amp;uml;&quot; data-og-description=&quot;my cmd: [TABLE] /Users/xxxx/Desktop/xxxxxx4.24/Engine/Build/BatchFiles/RunUAT.command BuildGraph -target=&amp;ldquo;Make Installed Build Mac&amp;rdquo; -script=Engine/Build/InstalledEngineBuild.xml -set:WithWin64=false -set:WithWin32=false -set:WithMac=false -set:WithAndr&quot; data-og-host=&quot;forums.unrealengine.com&quot; data-og-source-url=&quot;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&quot; data-og-url=&quot;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g7Hbw/hyW2S43Zjj/UZ06gUlvac8mxfBNOkvhk0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/z5hyY/hyW20PylPb/OFcstzFw7vSF0Mb6qZWpy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://forums.unrealengine.com/t/4-24-installed-build-ios-fails-bcz-of-unable-to-find-valid-certificate-mobile-provision-pair/140208&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g7Hbw/hyW2S43Zjj/UZ06gUlvac8mxfBNOkvhk0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/z5hyY/hyW20PylPb/OFcstzFw7vSF0Mb6qZWpy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;4.24: installed build ios fails bcz of &amp;uml;Unable to find valid certificate/mobile provision pair&amp;uml;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;my cmd: [TABLE] /Users/xxxx/Desktop/xxxxxx4.24/Engine/Build/BatchFiles/RunUAT.command BuildGraph -target=&amp;ldquo;Make Installed Build Mac&amp;rdquo; -script=Engine/Build/InstalledEngineBuild.xml -set:WithWin64=false -set:WithWin32=false -set:WithMac=false -set:WithAndr&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;forums.unrealengine.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;나 같은 경우에도 ios 설치 빌드가 뽑히지 않아서 아래와 같이 수정했었다. -createstub 삭제 후 성공적으로 설치빌드가 되었었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제 또는 버전에 따라 나타날 수 있는 여러 가지 변수들이 있기 때문에, 차근히 여유를 가지고 작업하는 게 좋을 것 같다..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUt2wK/btsJFtQHGty/sH2I1GTGk5pRpiPuBB8hI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUt2wK/btsJFtQHGty/sH2I1GTGk5pRpiPuBB8hI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUt2wK/btsJFtQHGty/sH2I1GTGk5pRpiPuBB8hI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUt2wK%2FbtsJFtQHGty%2FsH2I1GTGk5pRpiPuBB8hI0%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;1660&quot; height=&quot;270&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>createstub</category>
      <category>installedbuild</category>
      <category>IOS 빌드</category>
      <category>UE5</category>
      <category>설치빌드</category>
      <category>소스 빌드</category>
      <category>엔진 빌드</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/109</guid>
      <comments>https://dlemrcnd.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 16 Sep 2024 23:44:40 +0900</pubDate>
    </item>
    <item>
      <title>UEFN - 사라지는 바닥</title>
      <link>https://dlemrcnd.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Verse 코드로 선택한 바닥 매쉬를 등록해&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;a href=&quot;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709541659399&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;동기화된 사라지는 플랫폼&quot; data-og-description=&quot;Verse를 사용하여 차례대로 나타나면서 사라지는 징검다리 플랫폼을 하나의 장치로 구현합니다.&quot; data-og-host=&quot;dev.epicgames.com&quot; data-og-source-url=&quot;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&quot; data-og-url=&quot;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eq463U/hyVur1RRja/aSuLPzlGLiB5ULES5JFzUk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/Y8k9h/hyVum7iQRk/i05BqM0lkzkdAgBG1ir9AK/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.epicgames.com/documentation/ko-kr/uefn/synchronized-disappearing-platforms-using-verse-in-unreal-editor-for-fortnite&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eq463U/hyVur1RRja/aSuLPzlGLiB5ULES5JFzUk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/Y8k9h/hyVum7iQRk/i05BqM0lkzkdAgBG1ir9AK/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&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;동기화된 사라지는 플랫폼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Verse를 사용하여 차례대로 나타나면서 사라지는 징검다리 플랫폼을 하나의 장치로 구현합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.epicgames.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;우선 등록할 바닥 매쉬를 생성해주어야 하는데, 위 예제에서는 색상 변경 바닥 디바이스?&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 커스텀할 수 있게 BP나 디바이스를 만드는 게 더 좋아 보여서 BP로 만들려고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkx56c/btsFp8xVgvO/3gpWO6wwmq4ukOu7mCt031/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkx56c/btsFp8xVgvO/3gpWO6wwmq4ukOu7mCt031/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkx56c/btsFp8xVgvO/3gpWO6wwmq4ukOu7mCt031/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkx56c%2FbtsFp8xVgvO%2F3gpWO6wwmq4ukOu7mCt031%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;605&quot; height=&quot;638&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;638&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;건물 사물을 &quot;독립적인&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x7Oj6/btsFyPKkMZj/TRHkvp0zLXx4qqVGmL3IV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x7Oj6/btsFyPKkMZj/TRHkvp0zLXx4qqVGmL3IV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x7Oj6/btsFyPKkMZj/TRHkvp0zLXx4qqVGmL3IV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx7Oj6%2FbtsFyPKkMZj%2FTRHkvp0zLXx4qqVGmL3IV0%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;1246&quot; height=&quot;687&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;687&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;전 글에서 Verse 스크립트 생성을 써서 스킵하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Verse로 디바이스를 선택해 아래와 같이 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709542400785&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using { /Fortnite.com/Devices }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

log_platform_series := class(log_channel){}

Test_Verse01 := class&amp;lt;concrete&amp;gt;(creative_device):
    Logger : log = log{Channel := log_platform_series}

    @editable
    HeadStart : float = 2.45
 
    @editable
    AppearDelay : float = 0.98
 
    @editable
    DisappearDelay : float = 1.11
 
    @editable
    Platforms : []creative_prop = array{}

    OnBegin&amp;lt;override&amp;gt;()&amp;lt;suspends&amp;gt; : void =

        loop:
            sync:
                ShowAllPlatforms() # 이 동시 실행 루틴은 즉시 시작되며 block 표현식과 동시에 실행됩니다.
                block: # block 표현식은 ShowAllPlatforms()와 동시에 바로 시작됩니다. 이 코드 블록 내의 모든 표현식은 순차적으로 실행됩니다.
                    Sleep(HeadStart) # HeadStart초 동안 기다린 후에 HideAllPlatforms()이 실행됩니다.
                    HideAllPlatforms() # HeadStart초 후에 이 동시 실행 루틴이 실행됩니다.

    ShowAllPlatforms()&amp;lt;suspends&amp;gt; : void =
        for (PlatformNumber -&amp;gt; Platform : Platforms):
            Logger.Print(&quot;Platform{PlatformNumber} is now shown.&quot;) 
            Platform.Show()
            Sleep(AppearDelay)

    HideAllPlatforms()&amp;lt;suspends&amp;gt; : void =
        for (PlatformNumber -&amp;gt; Platform : Platforms):
            Logger.Print(&quot;Platform{PlatformNumber} is now hidden.&quot;) 
            Platform.Hide()
            Sleep(DisappearDelay)&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;Sync는 &amp;nbsp;Verse 언어에서 사용되는 키워드 중 하나로, 동시 실행 루틴을 시작하는 데 사용된다.&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;Block 키워드는 아래로 무조건 순차적으로 진행되는 코드를 그룹화하여, 순서 보장을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서, 모든 블랙폼을 보여주면서 동시에 숨김을 하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 사이에 Sleep을 주어 순차적으로 사라지는 바닥이 구현된다.&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;위에서 만든 바닥들이 Creative_prob에 해당된다. @editable으로 디테일 창에 노출시켰으니, 등록해 주자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 여담이지만 UPROPERTY(EditAnywhere)와 같은 매크로와 블루프린트에 노드를 사용 못한다는 게 아쉽다.&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-origin-width=&quot;1301&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSgmRX/btsFs2jCVSN/CdvUoC52cZckCGjKOnhat0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSgmRX/btsFs2jCVSN/CdvUoC52cZckCGjKOnhat0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSgmRX/btsFs2jCVSN/CdvUoC52cZckCGjKOnhat0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSgmRX%2FbtsFs2jCVSN%2FCdvUoC52cZckCGjKOnhat0%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;1301&quot; height=&quot;731&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;731&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Animation.gif&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1xI8D/btsFodmcUFW/lwlk0o6LCkLVFUi2Cz33K1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1xI8D/btsFodmcUFW/lwlk0o6LCkLVFUi2Cz33K1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1xI8D/btsFodmcUFW/lwlk0o6LCkLVFUi2Cz33K1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/1xI8D/btsFodmcUFW/lwlk0o6LCkLVFUi2Cz33K1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;415&quot; data-filename=&quot;Animation.gif&quot; data-origin-width=&quot;701&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;</description>
      <category>STUDY/UEFN</category>
      <category>UEFN</category>
      <category>verse</category>
      <category>바닥</category>
      <category>벌스</category>
      <category>사라지는 바닥</category>
      <category>포크리</category>
      <category>포트나이트</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/108</guid>
      <comments>https://dlemrcnd.tistory.com/108#entry108comment</comments>
      <pubDate>Mon, 4 Mar 2024 18:14:06 +0900</pubDate>
    </item>
    <item>
      <title>UEFN - 프로젝트 생성 및 로그 남기기</title>
      <link>https://dlemrcnd.tistory.com/107</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.epicgames.com/community/fortnite/getting-started/uefn&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.epicgames.com/community/fortnite/getting-started/uefn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709520637486&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;UEFN - Getting Started | Epic Developer Community&quot; data-og-description=&quot;The Epic Developer Community offers UEFN learning materials for new users getting started.&quot; data-og-host=&quot;dev.epicgames.com&quot; data-og-source-url=&quot;https://dev.epicgames.com/community/fortnite/getting-started/uefn&quot; data-og-url=&quot;https://dev.epicgames.com/community/fortnite/getting-started/uefn&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Jcm5z/hyVuiwWNln/LM1WMIgn8iDyM16m58vWN0/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/ccB9tw/hyVufAfxSe/Pgqui9CzeOlkmJsv0KJEok/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://dev.epicgames.com/community/fortnite/getting-started/uefn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.epicgames.com/community/fortnite/getting-started/uefn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Jcm5z/hyVuiwWNln/LM1WMIgn8iDyM16m58vWN0/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/ccB9tw/hyVufAfxSe/Pgqui9CzeOlkmJsv0KJEok/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&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;UEFN - Getting Started | Epic Developer Community&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Epic Developer Community offers UEFN learning materials for new users getting started.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.epicgames.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트나이트에서 모드를 개발하기 위한 UFFN (Unreal Editor for Fortnite)와 포트나이트가 필요하다.&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-origin-width=&quot;1279&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I4DFp/btsFnYCnJMF/E7Q80oMKyXDEatROHOBjuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I4DFp/btsFnYCnJMF/E7Q80oMKyXDEatROHOBjuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I4DFp/btsFnYCnJMF/E7Q80oMKyXDEatROHOBjuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI4DFp%2FbtsFnYCnJMF%2FE7Q80oMKyXDEatROHOBjuK%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;615&quot; height=&quot;866&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;866&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI1C1g/btsFuG76UbI/hxVYVEEvOqdaXk8A27SktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI1C1g/btsFuG76UbI/hxVYVEEvOqdaXk8A27SktK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI1C1g/btsFuG76UbI/hxVYVEEvOqdaXk8A27SktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI1C1g%2FbtsFuG76UbI%2FhxVYVEEvOqdaXk8A27SktK%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;1206&quot; height=&quot;759&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alt + P 혹은 세션 시작 버튼을 누르면 클라이언트 포트나이트가 켜지고, 에디터와 세션을 맺는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 2분~3분 정도 기다려 줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1083&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OlhDk/btsFr9CVW6O/G2sKNqThCHhCpfi5tMwtp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OlhDk/btsFr9CVW6O/G2sKNqThCHhCpfi5tMwtp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OlhDk/btsFr9CVW6O/G2sKNqThCHhCpfi5tMwtp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOlhDk%2FbtsFr9CVW6O%2FG2sKNqThCHhCpfi5tMwtp0%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;1920&quot; height=&quot;1083&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1083&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에디터에서 봤던 맵이 포트나이트 게임에서 실행되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼에서 포트나이트를 위해 이런걸 제공한다니 정말 놀랍다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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/bcgQDw/btsFoJLz1n4/JkYH3zUIdZKp1QT4zBSgJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcgQDw/btsFoJLz1n4/JkYH3zUIdZKp1QT4zBSgJ1/img.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;621&quot; data-is-animation=&quot;false&quot; width=&quot;515&quot; data-widthpercent=&quot;42.37&quot; style=&quot;width: 41.8752%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcgQDw/btsFoJLz1n4/JkYH3zUIdZKp1QT4zBSgJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcgQDw%2FbtsFoJLz1n4%2FJkYH3zUIdZKp1QT4zBSgJ1%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;812&quot; height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKz9s3/btsFs0eIc3f/DhjyLsUefiBpZKnzFEmsyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKz9s3/btsFs0eIc3f/DhjyLsUefiBpZKnzFEmsyk/img.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1012&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.962%;&quot; data-widthpercent=&quot;57.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKz9s3/btsFs0eIc3f/DhjyLsUefiBpZKnzFEmsyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKz9s3%2FbtsFs0eIc3f%2FDhjyLsUefiBpZKnzFEmsyk%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;1800&quot; height=&quot;1012&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;로그를 확인하기 위해서는 섬 설정 -&amp;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;해외 유튜버들은 TAB으로 간단히 눌러서 로그 보던데.. 그 방법은 나중에 찾아봐야겠다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Verse는 언리얼에서 개발한 새로운 언어이다. 사실 내가 이걸 해보는 이유도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트나이트라는 게임을 하나의 새로운 플랫폼으로 만들게 된 것도 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Verse가 얼마나 C++을 대체 가능할 만큼?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 입문자들이 쉽게 구현할 수 있게 잘 되어 있을까라는 의구심으로 진행 중이다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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/uShun/btsFpRW66w3/tRriYqG7IhMGASctdJMh6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uShun/btsFpRW66w3/tRriYqG7IhMGASctdJMh6K/img.png&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;175&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.3074%; margin-right: 10px;&quot; data-widthpercent=&quot;57.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uShun/btsFpRW66w3/tRriYqG7IhMGASctdJMh6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuShun%2FbtsFpRW66w3%2FtRriYqG7IhMGASctdJMh6K%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;342&quot; height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvdxv/btsFoFCETwl/Pf8NAtvUKYOuVyOTpkkoq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvdxv/btsFoFCETwl/Pf8NAtvUKYOuVyOTpkkoq1/img.png&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;197&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.5298%;&quot; data-widthpercent=&quot;42.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvdxv/btsFoFCETwl/Pf8NAtvUKYOuVyOTpkkoq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxvdxv%2FbtsFoFCETwl%2FPf8NAtvUKYOuVyOTpkkoq1%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;279&quot; height=&quot;197&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;상단 Verse 탭에서 Verse 익스플로러를 선택해 주고 프로젝트에서 새 Verse 파일을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 VS Code가 설치가 되거나 켜지게 될 것이다. 아마 익스텐션도 자동으로 설치가 되는 듯&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-origin-width=&quot;997&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baSZ05/btsFoJdPCC8/kMspBBvUJjZUqkDaGTaYS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baSZ05/btsFoJdPCC8/kMspBBvUJjZUqkDaGTaYS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baSZ05/btsFoJdPCC8/kMspBBvUJjZUqkDaGTaYS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaSZ05%2FbtsFoJdPCC8%2FkMspBBvUJjZUqkDaGTaYS1%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;538&quot; height=&quot;770&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&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;pre id=&quot;code_1709525858638&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


Test_Verse01 := class(creative_device):

    OnBegin&amp;lt;override&amp;gt;()&amp;lt;suspends&amp;gt;:void=
        var StringType : string = &quot;dd&quot;
        var intType : int = 1
        var floatType : float = 1.0
        var boolType : logic = true
        
        if(boolType?):
            Print(&quot;str {StringType}, int {intType}, float {floatType}&quot;)
        else:
            Print(&quot;boolType Wrong&quot;)

        set boolType = false;
        Print(&quot;Make bool Type false\n\n&quot;)

        if(boolType?):
            Print(&quot;str {StringType}, int {intType}, float {floatType}&quot;)
        else:
            Print(&quot;boolType Wrong&quot;)&lt;/code&gt;&lt;/pre&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSUpbx/btsFyeJ2PWA/v8KGKXRJujAI7C7lZTXkDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSUpbx/btsFyeJ2PWA/v8KGKXRJujAI7C7lZTXkDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSUpbx/btsFyeJ2PWA/v8KGKXRJujAI7C7lZTXkDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSUpbx%2FbtsFyeJ2PWA%2Fv8KGKXRJujAI7C7lZTXkDK%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;571&quot; height=&quot;337&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 사항 푸시가 있고, Verse 변경 사항 푸시가 있는데, 변경사항 푸시는 한참 걸리니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드만 수정되었을 때는 코드만 푸시하는 걸 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Xb63/btsFyeQOwfx/tKinfcbUt3mLSXP6JRabB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Xb63/btsFyeQOwfx/tKinfcbUt3mLSXP6JRabB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Xb63/btsFyeQOwfx/tKinfcbUt3mLSXP6JRabB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Xb63%2FbtsFyeQOwfx%2FtKinfcbUt3mLSXP6JRabB1%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;318&quot; height=&quot;180&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 로그창에 정상적으로 출력되는 걸 확인할 수 있다.&lt;/p&gt;</description>
      <category>STUDY/UEFN</category>
      <category>UEFN</category>
      <category>verse</category>
      <category>로그</category>
      <category>벌스</category>
      <category>포크리</category>
      <category>포트나이트</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/107</guid>
      <comments>https://dlemrcnd.tistory.com/107#entry107comment</comments>
      <pubDate>Mon, 4 Mar 2024 17:06:57 +0900</pubDate>
    </item>
    <item>
      <title>UnrealPak 명령어, Chunk와 Pak파일</title>
      <link>https://dlemrcnd.tistory.com/106</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Chunk&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Chunk는 독립적으로 배포가 가능하고 다운로드를 가능하게 하는 에셋 묶음이다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqhSOT/btsyHe5fAd8/xsQK9IJjOwEqSxAc7X67KK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqhSOT/btsyHe5fAd8/xsQK9IJjOwEqSxAc7X67KK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqhSOT/btsyHe5fAd8/xsQK9IJjOwEqSxAc7X67KK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqhSOT%2FbtsyHe5fAd8%2FxsQK9IJjOwEqSxAc7X67KK%2Fimg.jpg&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;511&quot; height=&quot;252&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;345&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;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Chunk0은 기본 프로젝트 콘텐츠, 무조건적으로 프로젝트당 하나 있게 되고&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;언리얼 에디터에서 DataAsset 타입으로 PrimaryAssetLabel 파일을 추가해서&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Chunk1..2..3..?? 해당 디렉터리에 있는 파일을 다운로드 가능하게 묶는 것이 청크 세팅이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;PakFile&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Unreal Automation Tool로 패키징 시 청크가 세팅된 대로 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;CDN을 위한 Pak 파일을 생성하는 과정이 이뤄진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.Zip 파일 압축파일처럼 여러 개의 리소스를 압축해 놓은 것이다. 내부 구조는 아래 링크에서 굉장히 잘 설명해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/54531649&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://zhuanlan.zhihu.com/p/54531649&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697561634680&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;UE4 Pak 文件格式&quot; data-og-description=&quot;UE4 打包过程中，会调用 UnrealPak 将 Cook 后的文件资源打包成一整个 Pak 文件，这个 Pak 中的内容可以分为三大块，按写入顺序分别为： 文件内容区 + 文件索引信息区 + Pak文件信息区文件内容区: 依&quot; data-og-host=&quot;zhuanlan.zhihu.com&quot; data-og-source-url=&quot;https://zhuanlan.zhihu.com/p/54531649&quot; data-og-url=&quot;https://zhuanlan.zhihu.com/p/54531649&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boel60/hyUdPKq1Jg/kgR6btVSyyboKSARTXTTA1/img.jpg?width=890&amp;amp;height=338&amp;amp;face=0_0_890_338&quot;&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/54531649&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zhuanlan.zhihu.com/p/54531649&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boel60/hyUdPKq1Jg/kgR6btVSyyboKSARTXTTA1/img.jpg?width=890&amp;amp;height=338&amp;amp;face=0_0_890_338');&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;UE4 Pak 文件格式&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;UE4 打包过程中，会调用 UnrealPak 将 Cook 后的文件资源打包成一整个 Pak 文件，这个 Pak 中的内容可以分为三大块，按写入顺序分别为： 文件内容区 + 文件索引信息区 + Pak文件信息区文件内容区: 依&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zhuanlan.zhihu.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;Pak 내부에는 &lt;b&gt;리소스 내용 구간, 파일 인덱스 내용 구간, pak 파일 정보 내용&lt;/b&gt; 구간 3가지 구간으로 나뉜다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리소스 내용 구간 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #121212; text-align: start;&quot;&gt;Pak 파일의 시작 부분에 위치하고 각 파일의 FPakEntry와 실제 파일 내용을 차례로 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FPakEntry는&amp;nbsp;한&amp;nbsp;pak안에&amp;nbsp;수많은&amp;nbsp;리소스&amp;nbsp;중&amp;nbsp;한&amp;nbsp;개의&amp;nbsp;리소스이다.&amp;nbsp;리소스&amp;nbsp;크기와&amp;nbsp;pak&amp;nbsp;파일&amp;nbsp;안에&amp;nbsp;어디&amp;nbsp;있는지&amp;nbsp;알기&amp;nbsp;위한&amp;nbsp;offset이&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 파일 인덱스 내용 구간&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDN을 받을 때 올바른 경로에 넣어주는 것 (마운트)을 하려면, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Pak 파일 안에 수많은 리소스에 대한 경로..?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 리소스 파일들은 Files에 저장되는데 각자마다 인덱스가 있다. 인덱스는 FPakDirectory 경로와 매핑돼있다. 또 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;각 리소스 파일 이름과 인덱스 번호도 매핑된다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&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-origin-width=&quot;544&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QwjvI/btsyJPwGfu8/A1KkcYkbRASyPnEh33BKok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QwjvI/btsyJPwGfu8/A1KkcYkbRASyPnEh33BKok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QwjvI/btsyJPwGfu8/A1KkcYkbRASyPnEh33BKok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQwjvI%2FbtsyJPwGfu8%2FA1KkcYkbRASyPnEh33BKok%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;414&quot; height=&quot;357&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔진소스에서 UnrealPak.exe의 작동 방식을 확인 가능하다. 다 직렬화해서 저장하는 모습..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;pak 파일 정보 내용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파일 마지막에 해당 내용이 있다. &lt;/span&gt;&lt;b&gt;pak 파일의 마지막 위치( 45&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;바이트 로 고정)에 기록된다고 한다.&lt;span style=&quot;background-color: #ffffff; color: #121212; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;IndexOffset ( &lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;Pak 파일 인덱스 정보 영역의 시작 위치&lt;/span&gt; ),&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #121212; text-align: left;&quot;&gt; &lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;IndexSize ( &lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;8바이트, Pak 파일 인덱스 정보 영역의 크기&lt;/span&gt; ) , &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;&lt;span style=&quot;color: #121212; text-align: left;&quot;&gt; &lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;IndexHash ( &lt;span style=&quot;color: #121212; text-align: left;&quot;&gt;20바이트, 파일 인덱스 정보의 SHA1 값&lt;/span&gt; )&lt;/span&gt;&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;UnrealPak.exe&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1697563830551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;엔진경로\Engine\Binaries\Win64\UnrealPak.exe&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;해당 경로에서 Pak파일을 생성하고 조회하고 압축해제 해주는 실행파일을 찾을 수 있다.&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;pre id=&quot;code_1697564258572&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UnrealPak &amp;lt;PakFilename&amp;gt; -Test
UnrealPak &amp;lt;PakFilename&amp;gt; -List [-ExcludeDeleted]
UnrealPak &amp;lt;PakFilename&amp;gt; &amp;lt;GameUProjectName&amp;gt; &amp;lt;GameFolderName&amp;gt; -ExportDependencies=&amp;lt;OutputFileBase&amp;gt; -NoAssetRegistryCache -ForceDependsGathering
UnrealPak &amp;lt;PakFilename&amp;gt; -Extract &amp;lt;ExtractDir&amp;gt; [-Filter=&amp;lt;filename&amp;gt;]
UnrealPak &amp;lt;PakFilename&amp;gt; -Create=&amp;lt;ResponseFile&amp;gt; [Options]&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;일반적으로 위 명령어 대로 하면 되지만 Pak에 암호화가 걸려있을 때는 -CryptoKeys 명령어를 붙여줘야 한다. 그리고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 암호화 설정 시 자동으로 생성된 Crypto.Json의 파일 경로를 입력해줘야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;배치 파일 조회 예시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1697564411112&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Choi Jiwon 
:: Pak 파일 정보 조회
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off

SET EnginePath=&quot;{엔진경로}&quot;
SET PakPath=&quot;%~dp0{Pak 파일 경로}&quot;
SET CryptoFilePath=&quot;%~dp0Crypto.json&quot;

%EnginePath%\Engine\Binaries\Win64\UnrealPak.exe %PakPath% -Info -CryptoKeys=%CryptoFilePath%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;배치 파일 압축해제 예시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1697564688848&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Choi Jiwon 
:: Pak 파일 압축 해제
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off

SET EnginePath=&quot;{엔진경로}&quot;
SET PakPath=&quot;%~dp0{팩 파일 경로}&quot;
SET CryptoFilePath=&quot;%~dp0Crypto.json&quot;

@echo &quot;Extract Folder Created&quot;

if exist %PakPath%_extracted (
    rmdir /s /q %PakPath%_extract
)

%EnginePath%\Engine\Binaries\Win64\UnrealPak.exe %PakPath% -Extract %PakPath%_extracted -CryptoKeys=%CryptoFilePath%&lt;/code&gt;&lt;/pre&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>CDN</category>
      <category>CryptoKeys</category>
      <category>Extract</category>
      <category>Pak 생성</category>
      <category>PakFileEntry</category>
      <category>PakList</category>
      <category>Pak파일</category>
      <category>Unreal</category>
      <category>압축해제</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/106</guid>
      <comments>https://dlemrcnd.tistory.com/106#entry106comment</comments>
      <pubDate>Wed, 18 Oct 2023 02:49:25 +0900</pubDate>
    </item>
    <item>
      <title>RunUAT(Unreal Automation Tool) BuildCookRun 명령어로 패키징</title>
      <link>https://dlemrcnd.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 에디터에서 패키징하면 로그에서 실행되는 것을 볼 수 있듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UAT는 Unreal Automation Tool으로 빌드/패키징을 실행하는 배치파일이다.&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;BuildCookRun 명령어로 에디터를 켜지 않고도 패키징 과정을 할 수 있는데,&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;엔진경로\Engine\Build\BatchFiles 경로에서 RunUAT 파일을 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac/Linux는. sh, Window는. bat 파일을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697546101932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;RunUAT.bat -list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 리스트를 확인해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhTvAx/btsyDzo3XQR/Zvjqhuae7r5wlUDqTxI3lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhTvAx/btsyDzo3XQR/Zvjqhuae7r5wlUDqTxI3lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhTvAx/btsyDzo3XQR/Zvjqhuae7r5wlUDqTxI3lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhTvAx%2FbtsyDzo3XQR%2FZvjqhuae7r5wlUDqTxI3lK%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;471&quot; height=&quot;476&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 패키징 시 필요한 것은 BuildCookRun 명령어이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1697546923052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Window(64비트) 프로젝트 빌드 예시 (DebugGame)

RunUAT.bat BuildCookRun -project=&quot;&amp;lt;ProjectPath&amp;gt;.uproject&quot; -platform=Win64
-clientconfig=DebugGame -build -cook -stage -archive -archivedirectory=&quot;C:\Output&quot; 

// RAM Window(64비트) 프로젝트 빌드 예시 (Shipping)
RunUAT.bat BuildCookRun -project=&quot;&amp;lt;ProjectPath&amp;gt;.uproject&quot; -platform=Win64 -clientconfig=Shipping 
-build -cook -stage -archive -archivedirectory=&quot;D:\Output&quot; -nodebuginfo&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;위 Shipping 예시에서 -nodebuginfo를 명령어 줄에 추가하는 이유는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.pdb 디버그 파일을 포함하지 않기 위함이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 명령이 필요하면 더 추가하면 된다. RunUAT.bat BuildCookRun -help로 더 자세히 볼 수 있음&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;Parameters:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-project=Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Project&amp;nbsp;path&amp;nbsp;(required),&amp;nbsp;i.e:&amp;nbsp;-project=QAGame,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-project=Samples\BlackJack\BlackJack.uproject,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-project=D:\Projects\MyProject.uproject&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-destsample&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Destination&amp;nbsp;Sample&amp;nbsp;name&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-foreigndest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Foreign&amp;nbsp;Destination&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-targetplatform=PlatformName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target&amp;nbsp;platform&amp;nbsp;for&amp;nbsp;building,&amp;nbsp;cooking&amp;nbsp;and&amp;nbsp;deployment&amp;nbsp;(also&amp;nbsp;-Platform)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-servertargetplatform=PlatformName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target&amp;nbsp;platform&amp;nbsp;for&amp;nbsp;building,&amp;nbsp;cooking&amp;nbsp;and&amp;nbsp;deployment&amp;nbsp;of&amp;nbsp;the&amp;nbsp;dedicated&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server&amp;nbsp;(also&amp;nbsp;-ServerPlatform)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-foreign&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Generate&amp;nbsp;a&amp;nbsp;foreign&amp;nbsp;uproject&amp;nbsp;from&amp;nbsp;blankproject&amp;nbsp;and&amp;nbsp;use&amp;nbsp;that&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-foreigncode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Generate&amp;nbsp;a&amp;nbsp;foreign&amp;nbsp;code&amp;nbsp;uproject&amp;nbsp;from&amp;nbsp;platformergame&amp;nbsp;and&amp;nbsp;use&amp;nbsp;that&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CrashReporter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;true&amp;nbsp;if&amp;nbsp;we&amp;nbsp;should&amp;nbsp;build&amp;nbsp;crash&amp;nbsp;reporter&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-cook,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-cookonthefly&amp;nbsp;Determines&amp;nbsp;if&amp;nbsp;the&amp;nbsp;build&amp;nbsp;is&amp;nbsp;going&amp;nbsp;to&amp;nbsp;use&amp;nbsp;cooked&amp;nbsp;data&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipcook&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;a&amp;nbsp;cooked&amp;nbsp;build,&amp;nbsp;but&amp;nbsp;we&amp;nbsp;assume&amp;nbsp;the&amp;nbsp;cooked&amp;nbsp;data&amp;nbsp;is&amp;nbsp;up&amp;nbsp;to&amp;nbsp;date&amp;nbsp;and&amp;nbsp;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;it&amp;nbsp;belongs,&amp;nbsp;implies&amp;nbsp;-cook&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipcookonthefly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;in&amp;nbsp;a&amp;nbsp;cookonthefly&amp;nbsp;build,&amp;nbsp;used&amp;nbsp;solely&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;information&amp;nbsp;to&amp;nbsp;the&amp;nbsp;package&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-clean&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wipe&amp;nbsp;intermediate&amp;nbsp;folders&amp;nbsp;before&amp;nbsp;building&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-unattended&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assumes&amp;nbsp;no&amp;nbsp;operator&amp;nbsp;is&amp;nbsp;present,&amp;nbsp;always&amp;nbsp;terminates&amp;nbsp;without&amp;nbsp;waiting&amp;nbsp;for&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;something.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-pak&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;a&amp;nbsp;pak&amp;nbsp;file&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-iostore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;I/O&amp;nbsp;store&amp;nbsp;container&amp;nbsp;file(s)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-cook4iostore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;I/O&amp;nbsp;store&amp;nbsp;container&amp;nbsp;file(s)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-zenstore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save&amp;nbsp;cooked&amp;nbsp;output&amp;nbsp;data&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Zen&amp;nbsp;storage&amp;nbsp;server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-nozenautolaunch&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URL&amp;nbsp;to&amp;nbsp;a&amp;nbsp;running&amp;nbsp;Zen&amp;nbsp;server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-makebinaryconfig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;optimized&amp;nbsp;config&amp;nbsp;data&amp;nbsp;during&amp;nbsp;staging&amp;nbsp;to&amp;nbsp;improve&amp;nbsp;loadtimes&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-signpak=keys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;the&amp;nbsp;generated&amp;nbsp;pak&amp;nbsp;file&amp;nbsp;with&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;key,&amp;nbsp;i.e.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-signpak=C:\Encryption.keys.&amp;nbsp;Also&amp;nbsp;implies&amp;nbsp;-signedpak.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-prepak&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attempt&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;cooking&amp;nbsp;and&amp;nbsp;instead&amp;nbsp;pull&amp;nbsp;pak&amp;nbsp;files&amp;nbsp;from&amp;nbsp;the&amp;nbsp;network,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;implies&amp;nbsp;pak&amp;nbsp;and&amp;nbsp;skipcook&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-signed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the&amp;nbsp;game&amp;nbsp;should&amp;nbsp;expect&amp;nbsp;to&amp;nbsp;use&amp;nbsp;a&amp;nbsp;signed&amp;nbsp;pak&amp;nbsp;file.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-PakAlignForMemoryMapping&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;game&amp;nbsp;will&amp;nbsp;be&amp;nbsp;set&amp;nbsp;up&amp;nbsp;for&amp;nbsp;memory&amp;nbsp;mapping&amp;nbsp;bulk&amp;nbsp;data.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-rehydrateassets&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Should&amp;nbsp;virtualized&amp;nbsp;assets&amp;nbsp;be&amp;nbsp;rehydrated?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skippak&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;a&amp;nbsp;pak&amp;nbsp;file,&amp;nbsp;but&amp;nbsp;assume&amp;nbsp;it&amp;nbsp;is&amp;nbsp;already&amp;nbsp;built,&amp;nbsp;implies&amp;nbsp;pak&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipiostore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;the&amp;nbsp;-iostore&amp;nbsp;commandline&amp;nbsp;option&amp;nbsp;to&amp;nbsp;not&amp;nbsp;run&amp;nbsp;it&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-stage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;put&amp;nbsp;this&amp;nbsp;build&amp;nbsp;in&amp;nbsp;a&amp;nbsp;stage&amp;nbsp;directory&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipstage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uses&amp;nbsp;a&amp;nbsp;stage&amp;nbsp;directory,&amp;nbsp;but&amp;nbsp;assumes&amp;nbsp;everything&amp;nbsp;is&amp;nbsp;already&amp;nbsp;there,&amp;nbsp;implies&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-stage&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-manifests&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;streaming&amp;nbsp;install&amp;nbsp;manifests&amp;nbsp;when&amp;nbsp;cooking&amp;nbsp;data&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-createchunkinstall&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate&amp;nbsp;streaming&amp;nbsp;install&amp;nbsp;data&amp;nbsp;from&amp;nbsp;manifest&amp;nbsp;when&amp;nbsp;cooking&amp;nbsp;data,&amp;nbsp;requires&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-stage&amp;nbsp;&amp;amp;&amp;nbsp;-manifests&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipencryption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skips&amp;nbsp;encrypting&amp;nbsp;pak&amp;nbsp;files&amp;nbsp;even&amp;nbsp;if&amp;nbsp;crypto&amp;nbsp;keys&amp;nbsp;are&amp;nbsp;provided&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-archive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;put&amp;nbsp;this&amp;nbsp;build&amp;nbsp;in&amp;nbsp;an&amp;nbsp;archive&amp;nbsp;directory&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-build&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;True&amp;nbsp;if&amp;nbsp;build&amp;nbsp;step&amp;nbsp;should&amp;nbsp;be&amp;nbsp;executed&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-noxge&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;True&amp;nbsp;if&amp;nbsp;XGE&amp;nbsp;should&amp;nbsp;NOT&amp;nbsp;be&amp;nbsp;used&amp;nbsp;for&amp;nbsp;building&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CookPartialgc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;cooking&amp;nbsp;clean&amp;nbsp;up&amp;nbsp;packages&amp;nbsp;as&amp;nbsp;we&amp;nbsp;are&amp;nbsp;done&amp;nbsp;with&amp;nbsp;them&amp;nbsp;rather&amp;nbsp;then&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cleaning&amp;nbsp;everything&amp;nbsp;up&amp;nbsp;when&amp;nbsp;we&amp;nbsp;run&amp;nbsp;out&amp;nbsp;of&amp;nbsp;space&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CookInEditor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Did&amp;nbsp;we&amp;nbsp;cook&amp;nbsp;in&amp;nbsp;the&amp;nbsp;editor&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;in&amp;nbsp;UAT&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-IgnoreCookErrors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ignores&amp;nbsp;cook&amp;nbsp;errors&amp;nbsp;and&amp;nbsp;continues&amp;nbsp;with&amp;nbsp;packaging&amp;nbsp;etc&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-nodebuginfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&amp;nbsp;not&amp;nbsp;copy&amp;nbsp;debug&amp;nbsp;files&amp;nbsp;to&amp;nbsp;the&amp;nbsp;stage&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-separatedebuginfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output&amp;nbsp;debug&amp;nbsp;info&amp;nbsp;to&amp;nbsp;a&amp;nbsp;separate&amp;nbsp;directory&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-MapFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generates&amp;nbsp;a&amp;nbsp;*.map&amp;nbsp;file&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-nocleanstage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skip&amp;nbsp;cleaning&amp;nbsp;the&amp;nbsp;stage&amp;nbsp;directory&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run&amp;nbsp;the&amp;nbsp;game&amp;nbsp;after&amp;nbsp;it&amp;nbsp;is&amp;nbsp;built&amp;nbsp;(including&amp;nbsp;server,&amp;nbsp;if&amp;nbsp;-server)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-cookonthefly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run&amp;nbsp;the&amp;nbsp;client&amp;nbsp;with&amp;nbsp;cooked&amp;nbsp;data&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;cook&amp;nbsp;on&amp;nbsp;the&amp;nbsp;fly&amp;nbsp;server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-Cookontheflystreaming&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run&amp;nbsp;the&amp;nbsp;client&amp;nbsp;in&amp;nbsp;streaming&amp;nbsp;cook&amp;nbsp;on&amp;nbsp;the&amp;nbsp;fly&amp;nbsp;mode&amp;nbsp;(don't&amp;nbsp;cache&amp;nbsp;files&amp;nbsp;locally&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;instead&amp;nbsp;force&amp;nbsp;reget&amp;nbsp;from&amp;nbsp;server&amp;nbsp;each&amp;nbsp;file&amp;nbsp;load)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-fileserver&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run&amp;nbsp;the&amp;nbsp;client&amp;nbsp;with&amp;nbsp;cooked&amp;nbsp;data&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;UnrealFileServer&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-dedicatedserver&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;build,&amp;nbsp;cook&amp;nbsp;and&amp;nbsp;run&amp;nbsp;both&amp;nbsp;a&amp;nbsp;client&amp;nbsp;and&amp;nbsp;a&amp;nbsp;server&amp;nbsp;(also&amp;nbsp;-server)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-client&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;build,&amp;nbsp;cook&amp;nbsp;and&amp;nbsp;run&amp;nbsp;a&amp;nbsp;client&amp;nbsp;and&amp;nbsp;a&amp;nbsp;server,&amp;nbsp;uses&amp;nbsp;client&amp;nbsp;target&amp;nbsp;configuration&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-noclient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&amp;nbsp;not&amp;nbsp;run&amp;nbsp;the&amp;nbsp;client,&amp;nbsp;just&amp;nbsp;run&amp;nbsp;the&amp;nbsp;server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-logwindow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create&amp;nbsp;a&amp;nbsp;log&amp;nbsp;window&amp;nbsp;for&amp;nbsp;the&amp;nbsp;client&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-package&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;package&amp;nbsp;the&amp;nbsp;project&amp;nbsp;for&amp;nbsp;the&amp;nbsp;target&amp;nbsp;platform&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skippackage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Skips&amp;nbsp;packaging&amp;nbsp;the&amp;nbsp;project&amp;nbsp;for&amp;nbsp;the&amp;nbsp;target&amp;nbsp;platform&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-neverpackage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Skips&amp;nbsp;preparing&amp;nbsp;data&amp;nbsp;that&amp;nbsp;would&amp;nbsp;be&amp;nbsp;used&amp;nbsp;during&amp;nbsp;packaging,&amp;nbsp;in&amp;nbsp;earlier&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stages.&amp;nbsp;Different&amp;nbsp;from&amp;nbsp;skippackage&amp;nbsp;which&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;optimize&amp;nbsp;later&amp;nbsp;stages&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;like&amp;nbsp;archive,&amp;nbsp;which&amp;nbsp;still&amp;nbsp;was&amp;nbsp;packaged&amp;nbsp;at&amp;nbsp;some&amp;nbsp;point&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-distribution&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;package&amp;nbsp;for&amp;nbsp;distribution&amp;nbsp;the&amp;nbsp;project&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-PackageEncryptionKeyFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Path&amp;nbsp;to&amp;nbsp;file&amp;nbsp;containing&amp;nbsp;encryption&amp;nbsp;key&amp;nbsp;to&amp;nbsp;use&amp;nbsp;in&amp;nbsp;packaging&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-prereqs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stage&amp;nbsp;prerequisites&amp;nbsp;along&amp;nbsp;with&amp;nbsp;the&amp;nbsp;project&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-applocaldir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;of&amp;nbsp;prerequisites&amp;nbsp;for&amp;nbsp;applocal&amp;nbsp;deployment&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-Prebuilt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&amp;nbsp;is&amp;nbsp;a&amp;nbsp;prebuilt&amp;nbsp;cooked&amp;nbsp;and&amp;nbsp;packaged&amp;nbsp;build&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-AdditionalPackageOptions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra&amp;nbsp;options&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;to&amp;nbsp;the&amp;nbsp;platform's&amp;nbsp;packager&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-deploy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deploy&amp;nbsp;the&amp;nbsp;project&amp;nbsp;for&amp;nbsp;the&amp;nbsp;target&amp;nbsp;platform&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-getfile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;download&amp;nbsp;file&amp;nbsp;from&amp;nbsp;target&amp;nbsp;after&amp;nbsp;successful&amp;nbsp;run&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-IgnoreLightMapErrors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Whether&amp;nbsp;Light&amp;nbsp;Map&amp;nbsp;errors&amp;nbsp;should&amp;nbsp;be&amp;nbsp;treated&amp;nbsp;as&amp;nbsp;critical&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-trace&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;list&amp;nbsp;of&amp;nbsp;trace&amp;nbsp;channels&amp;nbsp;to&amp;nbsp;enable&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-tracehost&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;host&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;trace&amp;nbsp;recorder&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-tracefile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;file&amp;nbsp;where&amp;nbsp;the&amp;nbsp;trace&amp;nbsp;will&amp;nbsp;be&amp;nbsp;recorded&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-sessionlabel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A&amp;nbsp;label&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;to&amp;nbsp;analytics&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-stagingdirectory=Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;to&amp;nbsp;copy&amp;nbsp;the&amp;nbsp;builds&amp;nbsp;to,&amp;nbsp;i.e.&amp;nbsp;-stagingdirectory=C:\Stage&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-optionalfilestagingdirectory=Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;to&amp;nbsp;copy&amp;nbsp;the&amp;nbsp;optional&amp;nbsp;files&amp;nbsp;to,&amp;nbsp;i.e.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-optionalfilestagingdirectory=C:\StageOptional&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-optionalfileinputdirectory=Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;to&amp;nbsp;read&amp;nbsp;the&amp;nbsp;optional&amp;nbsp;files&amp;nbsp;from,&amp;nbsp;i.e.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-optionalfileinputdirectory=C:\StageOptional&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CookerSupportFilesSubdirectory=subdir&amp;nbsp;&amp;nbsp;Subdirectory&amp;nbsp;under&amp;nbsp;staging&amp;nbsp;to&amp;nbsp;copy&amp;nbsp;CookerSupportFiles&amp;nbsp;(as&amp;nbsp;set&amp;nbsp;in&amp;nbsp;Build.cs&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;files).&amp;nbsp;-CookerSupportFilesSubdirectory=SDK&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-unrealexe=ExecutableName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Unreal&amp;nbsp;Editor&amp;nbsp;executable,&amp;nbsp;i.e.&amp;nbsp;-unrealexe=UnrealEditor.exe&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-archivedirectory=Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;to&amp;nbsp;archive&amp;nbsp;the&amp;nbsp;builds&amp;nbsp;to,&amp;nbsp;i.e.&amp;nbsp;-archivedirectory=C:\Archive&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-archivemetadata&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Archive&amp;nbsp;extra&amp;nbsp;metadata&amp;nbsp;files&amp;nbsp;in&amp;nbsp;addition&amp;nbsp;to&amp;nbsp;the&amp;nbsp;build&amp;nbsp;(e.g.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;build.properties)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-createappbundle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;When&amp;nbsp;archiving&amp;nbsp;for&amp;nbsp;Mac,&amp;nbsp;set&amp;nbsp;this&amp;nbsp;to&amp;nbsp;true&amp;nbsp;to&amp;nbsp;package&amp;nbsp;it&amp;nbsp;in&amp;nbsp;a&amp;nbsp;.app&amp;nbsp;bundle&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;normal&amp;nbsp;loose&amp;nbsp;files&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-iterativecooking&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uses&amp;nbsp;the&amp;nbsp;iterative&amp;nbsp;cooking,&amp;nbsp;command&amp;nbsp;line:&amp;nbsp;-iterativecooking&amp;nbsp;or&amp;nbsp;-iterate&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CookMapsOnly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cook&amp;nbsp;only&amp;nbsp;maps&amp;nbsp;this&amp;nbsp;only&amp;nbsp;affects&amp;nbsp;usage&amp;nbsp;of&amp;nbsp;-cookall&amp;nbsp;the&amp;nbsp;flag&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-CookAll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cook&amp;nbsp;all&amp;nbsp;the&amp;nbsp;things&amp;nbsp;in&amp;nbsp;the&amp;nbsp;content&amp;nbsp;directory&amp;nbsp;for&amp;nbsp;this&amp;nbsp;project&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-SkipCookingEditorContent&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Skips&amp;nbsp;content&amp;nbsp;under&amp;nbsp;/Engine/Editor&amp;nbsp;when&amp;nbsp;cooking&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-FastCook&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uses&amp;nbsp;fast&amp;nbsp;cook&amp;nbsp;path&amp;nbsp;if&amp;nbsp;supported&amp;nbsp;by&amp;nbsp;target&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-cmdline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command&amp;nbsp;line&amp;nbsp;to&amp;nbsp;put&amp;nbsp;into&amp;nbsp;the&amp;nbsp;stage&amp;nbsp;in&amp;nbsp;UECommandLine.txt&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-bundlename&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;to&amp;nbsp;use&amp;nbsp;as&amp;nbsp;the&amp;nbsp;bundle&amp;nbsp;name&amp;nbsp;when&amp;nbsp;deploying&amp;nbsp;to&amp;nbsp;mobile&amp;nbsp;device&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-map&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;nbsp;to&amp;nbsp;run&amp;nbsp;the&amp;nbsp;game&amp;nbsp;with&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-AdditionalServerMapParams&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Additional&amp;nbsp;server&amp;nbsp;map&amp;nbsp;params,&amp;nbsp;i.e&amp;nbsp;?param=value&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Devices&amp;nbsp;to&amp;nbsp;run&amp;nbsp;the&amp;nbsp;game&amp;nbsp;on&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-serverdevice&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Device&amp;nbsp;to&amp;nbsp;run&amp;nbsp;the&amp;nbsp;server&amp;nbsp;on&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-skipserver&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Skip&amp;nbsp;starting&amp;nbsp;the&amp;nbsp;server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-numclients=n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Start&amp;nbsp;extra&amp;nbsp;clients,&amp;nbsp;n&amp;nbsp;should&amp;nbsp;be&amp;nbsp;2&amp;nbsp;or&amp;nbsp;more&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-addcmdline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Additional&amp;nbsp;command&amp;nbsp;line&amp;nbsp;arguments&amp;nbsp;for&amp;nbsp;the&amp;nbsp;program&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-servercmdline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Additional&amp;nbsp;command&amp;nbsp;line&amp;nbsp;arguments&amp;nbsp;for&amp;nbsp;the&amp;nbsp;program&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-clientcmdline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Override&amp;nbsp;command&amp;nbsp;line&amp;nbsp;arguments&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;to&amp;nbsp;the&amp;nbsp;client&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-nullrhi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;-nullrhi&amp;nbsp;to&amp;nbsp;the&amp;nbsp;client&amp;nbsp;commandlines&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-fakeclient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adds&amp;nbsp;?fake&amp;nbsp;to&amp;nbsp;the&amp;nbsp;server&amp;nbsp;URL&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-editortest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rather&amp;nbsp;than&amp;nbsp;running&amp;nbsp;a&amp;nbsp;client,&amp;nbsp;run&amp;nbsp;the&amp;nbsp;editor&amp;nbsp;instead&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-RunAutomationTests&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;when&amp;nbsp;running&amp;nbsp;-editortest&amp;nbsp;or&amp;nbsp;a&amp;nbsp;client,&amp;nbsp;run&amp;nbsp;all&amp;nbsp;automation&amp;nbsp;tests,&amp;nbsp;not&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compatible&amp;nbsp;with&amp;nbsp;-server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-Crash=index&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;when&amp;nbsp;running&amp;nbsp;-editortest&amp;nbsp;or&amp;nbsp;a&amp;nbsp;client,&amp;nbsp;adds&amp;nbsp;commands&amp;nbsp;like&amp;nbsp;debug&amp;nbsp;crash,&amp;nbsp;debug&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rendercrash,&amp;nbsp;etc&amp;nbsp;based&amp;nbsp;on&amp;nbsp;index&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-deviceuser&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Linux&amp;nbsp;username&amp;nbsp;for&amp;nbsp;unattended&amp;nbsp;key&amp;nbsp;genereation&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-devicepass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Linux&amp;nbsp;password&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-RunTimeoutSeconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeout&amp;nbsp;to&amp;nbsp;wait&amp;nbsp;after&amp;nbsp;we&amp;nbsp;lunch&amp;nbsp;the&amp;nbsp;game&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-SpecifiedArchitecture&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determine&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;Minimum&amp;nbsp;OS&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-UbtArgs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra&amp;nbsp;options&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;to&amp;nbsp;ubt&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-MapsToRebuildLightMaps&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;of&amp;nbsp;maps&amp;nbsp;that&amp;nbsp;need&amp;nbsp;light&amp;nbsp;maps&amp;nbsp;rebuilding&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-MapsToRebuildHLODMaps&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;of&amp;nbsp;maps&amp;nbsp;that&amp;nbsp;need&amp;nbsp;HLOD&amp;nbsp;rebuilding&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-ForceMonolithic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toggle&amp;nbsp;to&amp;nbsp;combined&amp;nbsp;the&amp;nbsp;result&amp;nbsp;into&amp;nbsp;one&amp;nbsp;executable&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-ForceDebugInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Forces&amp;nbsp;debug&amp;nbsp;info&amp;nbsp;even&amp;nbsp;in&amp;nbsp;development&amp;nbsp;builds&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-ForceNonUnity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toggle&amp;nbsp;to&amp;nbsp;disable&amp;nbsp;the&amp;nbsp;unity&amp;nbsp;build&amp;nbsp;system&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-ForceUnity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toggle&amp;nbsp;to&amp;nbsp;force&amp;nbsp;enable&amp;nbsp;the&amp;nbsp;unity&amp;nbsp;build&amp;nbsp;system&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-Licensee&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;set,&amp;nbsp;this&amp;nbsp;build&amp;nbsp;is&amp;nbsp;being&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;a&amp;nbsp;licensee&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-NoSign&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Skips&amp;nbsp;signing&amp;nbsp;of&amp;nbsp;code/content&amp;nbsp;files.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 패키징 시에 Pak 파일을 포함시키려면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697547414033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;RunUAT.bat BuildCookRun -project=&quot;&amp;lt;ProjectPath&amp;gt;.uproject&quot; -platform=Win64 -clientconfig=Shipping 
-build -cook -stage -pak -archive -archivedirectory=&quot;D:\Output&quot; -nodebuginfo&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;또한 아래처럼 배치파일로 원하는 패키징을 얻을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1697547586160&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off

REM The location of the UAT batch file.
set UAT=&quot;&amp;lt;EngineDirectory&amp;gt;\Engine\Build\BatchFiles\RunUAT.bat&quot;
REM The location of your Unreal project.
set PROJECT=&quot;&amp;lt;ProjectPath&amp;gt;.uproject&quot;
REM The location where the builds are going to be stored.
set OUTPUT=&quot;D:\Output&quot;

REM Build both Shipping and DebugGame
call %UAT% BuildCookRun -project=%PROJECT% -platform=Win64 -clientconfig=Shipping -build -cook -stage -archive -archivedirectory=&quot;%OUTPUT%\Shipping&quot; -nodebuginfo
call %UAT% BuildCookRun -project=%PROJECT% -platform=Win64 -clientconfig=DebugGame -build -cook -stage -archive -archivedirectory=&quot;%OUTPUT%\DebugGame&quot;&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;&lt;a href=&quot;https://greenforestgames.eu/article/Building-Unreal-projects-with-UAT-1605886728&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://greenforestgames.eu/article/Building-Unreal-projects-with-UAT-1605886728&lt;/a&gt;&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>AutomationTool</category>
      <category>BuildCookRun</category>
      <category>RunUAT</category>
      <category>빌드</category>
      <category>언리얼 패키징</category>
      <category>젠킨스</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/105</guid>
      <comments>https://dlemrcnd.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 17 Oct 2023 21:58:19 +0900</pubDate>
    </item>
    <item>
      <title>블랜더 에드온 Send2UE (Blender &amp;lt;-&amp;gt; UnrealEngine 연동 에드온) 사용법</title>
      <link>https://dlemrcnd.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672650377371&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;Download our new Blender addons&quot; data-og-description=&quot;We&amp;rsquo;ve released two new, free addons that greatly streamline the workflow between Blender and Unreal Engine.&amp;nbsp;&quot; data-og-host=&quot;www.unrealengine.com&quot; data-og-source-url=&quot;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&quot; data-og-url=&quot;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/um014/hyQ60O43gR/pJYQTXBSHOhrIOd1UkwN4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/daJ6sy/hyQ83DnmgQ/kmzJQ9KqFmDbqykqRxJrI0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.unrealengine.com/en-US/blog/download-our-new-blender-addons&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/um014/hyQ60O43gR/pJYQTXBSHOhrIOd1UkwN4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/daJ6sy/hyQ83DnmgQ/kmzJQ9KqFmDbqykqRxJrI0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Download our new Blender addons&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;ve released two new, free addons that greatly streamline the workflow between Blender and Unreal Engine.&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.unrealengine.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;2020년 7월 30일 Blender Addon이 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 이용하면 리깅과 익스포트가 용이해진다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다운로드하기 위해서는 언리얼 엔진 홈페이지에서 깃허브 계정을 연동해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBwYJ/btrVfka2pFH/mE5CgGxpGqIs9nxDkbB6aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBwYJ/btrVfka2pFH/mE5CgGxpGqIs9nxDkbB6aK/img.png&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;891&quot; data-is-animation=&quot;false&quot; width=&quot;557&quot; style=&quot;width: 41.0826%; margin-right: 10px;&quot; data-widthpercent=&quot;41.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBwYJ/btrVfka2pFH/mE5CgGxpGqIs9nxDkbB6aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBwYJ%2FbtrVfka2pFH%2FmE5CgGxpGqIs9nxDkbB6aK%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;1257&quot; height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scaYA/btrVfsfN0Zm/exutTjIfQI8x98wiSA8B2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scaYA/btrVfsfN0Zm/exutTjIfQI8x98wiSA8B2k/img.png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;419&quot; data-is-animation=&quot;false&quot; width=&quot;490&quot; style=&quot;width: 57.7546%;&quot; data-widthpercent=&quot;58.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scaYA/btrVfsfN0Zm/exutTjIfQI8x98wiSA8B2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FscaYA%2FbtrVfsfN0Zm%2FexutTjIfQI8x98wiSA8B2k%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;831&quot; height=&quot;419&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;아래 링크도 접속이 안된다면 위와 같은 절차를 밟아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/EpicGames/BlenderTools/releases?q=Send+to+Unreal&amp;amp;expanded=true&quot;&gt;https://github.com/EpicGames/BlenderTools/releases?q=Send+to+Unreal&amp;amp;expanded=true&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크가 Send2ue 블렌더 에드온이다.&amp;nbsp;&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bssobj/btrU55GHsMf/TOpW0KfUmqVUa1IA04lEwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bssobj/btrU55GHsMf/TOpW0KfUmqVUa1IA04lEwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bssobj/btrU55GHsMf/TOpW0KfUmqVUa1IA04lEwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbssobj%2FbtrU55GHsMf%2FTOpW0KfUmqVUa1IA04lEwk%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;1073&quot; height=&quot;551&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;551&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;다운로드하였다면 Blender Add-ons에서 해당 에드온을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blender 2.8부터 지원하는 것으로 알고 있다. 파이썬 지원하는 버전이면 가능하다&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개를 활성화해주어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQQCYn/btrVeV3D336/OkuO9HnH77SSLlrsu82RUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQQCYn/btrVeV3D336/OkuO9HnH77SSLlrsu82RUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQQCYn/btrVeV3D336/OkuO9HnH77SSLlrsu82RUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQQCYn%2FbtrVeV3D336%2FOkuO9HnH77SSLlrsu82RUk%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;747&quot; height=&quot;411&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;617&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;그리고 프로젝트 세팅에서 파이썬 원격 실행 Enable Remote Excution를 켜준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RgfCw/btrU9dK1DOX/oJ0eXyKJUMikzpNtX6WYX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RgfCw/btrU9dK1DOX/oJ0eXyKJUMikzpNtX6WYX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RgfCw/btrU9dK1DOX/oJ0eXyKJUMikzpNtX6WYX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRgfCw%2FbtrU9dK1DOX%2FoJ0eXyKJUMikzpNtX6WYX0%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;1170&quot; height=&quot;654&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;블렌더에서 수정해서 보내면 엔진으로 명령하도록 하게 한다.&amp;nbsp;&lt;/span&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKe53h/btrU433fzu1/TmIlK3DKC6DDBcwmkkYI30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKe53h/btrU433fzu1/TmIlK3DKC6DDBcwmkkYI30/img.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;721&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.729%; margin-right: 10px;&quot; data-widthpercent=&quot;46.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKe53h/btrU433fzu1/TmIlK3DKC6DDBcwmkkYI30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKe53h%2FbtrU433fzu1%2FTmIlK3DKC6DDBcwmkkYI30%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;901&quot; height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKfDt/btrU9epBWvx/fHKXq14KR7nqA79IwnB5C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKfDt/btrU9epBWvx/fHKXq14KR7nqA79IwnB5C0/img.png&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;421&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.1082%;&quot; data-widthpercent=&quot;53.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKfDt/btrU9epBWvx/fHKXq14KR7nqA79IwnB5C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKfDt%2FbtrU9epBWvx%2FfHKXq14KR7nqA79IwnB5C0%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;421&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 생긴 Pipeline 탭에서 세팅(Export &amp;gt; Setting Dialog) 적용할 프로젝트의 경로를 설정해 준다.&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;블렌더 수정 후 Ctrl + U를 누르거나 Pipeline 탭에서 Export send to UE를 선택하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 블렌더가 즉각적으로 Uasset으로 변환되고 프로젝트에 적용이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;애드온.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAlrqh/btrVe3ACaYq/4OFgkptQkg4X7NKD0rrUA1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAlrqh/btrVe3ACaYq/4OFgkptQkg4X7NKD0rrUA1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAlrqh/btrVe3ACaYq/4OFgkptQkg4X7NKD0rrUA1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cAlrqh/btrVe3ACaYq/4OFgkptQkg4X7NKD0rrUA1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;411&quot; data-filename=&quot;애드온.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;411&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결과 영상&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/YBnwVDvqjNo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/YBnwVDvqjNo&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=YBnwVDvqjNo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/nldiu/hyQ8V8bWmc/bgglTadJSkvoRFwuFk5TKK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/YBnwVDvqjNo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>Addon</category>
      <category>Blender</category>
      <category>Send to Unreal 2.2.0</category>
      <category>SendtoUe</category>
      <category>블렌더</category>
      <category>언리얼 연동</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/104</guid>
      <comments>https://dlemrcnd.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 2 Jan 2023 19:22:30 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 언리얼 자동 완성 기능 플러그인 : Visual Assist X</title>
      <link>https://dlemrcnd.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;vs19로 언리얼 자동완성 기능을 위해서 Visual Assist 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;Visual Studio 2022가 64버젼으로 나오면서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Assist X도 21년도에 새로 나왔다.&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;요즘엔 Rider로 개발을 해서 Visual studio와 멀어졌지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 VS의 투박한 매력을 잊지 못하고 산다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 해보겠다. (주말에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.wholetomato.com/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.wholetomato.com/downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XQ6Wj/btrO5fhdJtl/Lr5TpkQK16RQY9LHThl51K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XQ6Wj/btrO5fhdJtl/Lr5TpkQK16RQY9LHThl51K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XQ6Wj/btrO5fhdJtl/Lr5TpkQK16RQY9LHThl51K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXQ6Wj%2FbtrO5fhdJtl%2FLr5TpkQK16RQY9LHThl51K%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;454&quot; height=&quot;525&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;525&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;</description>
      <category>ETC</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/103</guid>
      <comments>https://dlemrcnd.tistory.com/103#entry103comment</comments>
      <pubDate>Fri, 21 Oct 2022 01:11:48 +0900</pubDate>
    </item>
    <item>
      <title>OpenGL - 초기 환경 설정 및 화면 띄우기</title>
      <link>https://dlemrcnd.tistory.com/102</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://github.com/jiwonchoidd/Jiwon_opengl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/jiwonchoidd/Jiwon_opengl&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다이렉트X는 윈도우 플랫폼에 종속적이고 COM기반으로 제작되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 윈도우에는 해당 SDK가 내장되어 쉽게 환경 구성을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenGL 자체는 실제 구현된 라이브러리가 아니라 API 스펙 그 자체여서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래픽카드와 상호작용하는 기능만 있고, 그&lt;b&gt;게 어떤 플랫폼의 그래픽 카드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인지는 모르는 API이다.&lt;/b&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;GLFW, SDL, Freeglut 등 있지만 나는 많이 사용하는 GLFW를 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 설치한 라이브러리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GLFW 3.3.8 version installed&amp;nbsp; // &lt;a href=&quot;https://www.glfw.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.glfw.org/&lt;/a&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;GLEW 2.1.0 version installed // &lt;a href=&quot;https://glew.sourceforge.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://glew.sourceforge.net/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ윈도우가 구버전 opengl 지원해서 높은 버전을 위해 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GLM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ이건 수학 라이브러리, 필요하면 받자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 환경 설정 및 화면 띄우기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔용 메인함수 int main을 쓰든 윈도우용 winmain을 쓰든&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;프로젝트 include lib 폴더에 각각 파일을 넣어주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G41wq/btrNAM1gr4m/jEijs8HsKQKIbG7widb0Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G41wq/btrNAM1gr4m/jEijs8HsKQKIbG7widb0Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G41wq/btrNAM1gr4m/jEijs8HsKQKIbG7widb0Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG41wq%2FbtrNAM1gr4m%2FjEijs8HsKQKIbG7widb0Kk%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;537&quot; height=&quot;275&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비주얼 스튜디오를 켜고 넣은 include와 lib 연결을 해준다.&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-origin-width=&quot;819&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iw00b/btrNzFIayRU/h5WIXH4uKnJBwv7cVnrR21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iw00b/btrNzFIayRU/h5WIXH4uKnJBwv7cVnrR21/img.png&quot; data-alt=&quot;추가 포함 디렉터리에 헤더 폴더 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iw00b/btrNzFIayRU/h5WIXH4uKnJBwv7cVnrR21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIw00b%2FbtrNzFIayRU%2Fh5WIXH4uKnJBwv7cVnrR21%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;598&quot; height=&quot;578&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추가 포함 디렉터리에 헤더 폴더 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SEQK5/btrNwF9YQ5Q/7PTxJutoRImYaj4hQEEZl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SEQK5/btrNwF9YQ5Q/7PTxJutoRImYaj4hQEEZl1/img.png&quot; data-alt=&quot;라이브러리 폴더 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SEQK5/btrNwF9YQ5Q/7PTxJutoRImYaj4hQEEZl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSEQK5%2FbtrNwF9YQ5Q%2F7PTxJutoRImYaj4hQEEZl1%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;250&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라이브러리 폴더 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성에 라이브러리 이름을 기입해서 연결할 수 있지만,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 라이브러리와 인크루드를 관리하는 헤더 하나를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664779489791&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//DD_Std.h

#pragma once
#pragma comment	(lib, &quot;glew32.lib&quot;)
#pragma comment	(lib, &quot;glfw3.lib&quot;)
#pragma comment	(lib, &quot;opengl32.lib&quot;)
#include &quot;glew.h&quot;
#include &quot;glfw3.h&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 헤더를 메인 함수에 연결시켜서 잘 연결되었는지 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 메인함수이다. 위 std 헤더를 연결해주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664779557388&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;DD_MainCore.h&quot;
#include &quot;DD_Std.h&quot;
int main()
{
    GLFWwindow* window; 

    if (false == glfwInit())
        return -1;

    window = glfwCreateWindow(640, 480, &quot;Hello World&quot;, NULL, NULL);
    if (nullptr == window)
    {
        glfwTerminate(); 
        return -1;
    }


    glfwMakeContextCurrent(window); 
    glewInit(); 
    glClearColor(0.5, 0.75, 1, 1);


    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT); 
        glfwSwapBuffers(window); 
        glfwPollEvents(); 
    }

    glfwTerminate();
    return 0;
}&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;빌드를 해서 본다면 아래와 같은 화면이 나올 것이다.&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-origin-width=&quot;1920&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Lja4/btrNwDqIt1E/KiVBu8DlLL4fAj3eEVQ2Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Lja4/btrNwDqIt1E/KiVBu8DlLL4fAj3eEVQ2Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Lja4/btrNwDqIt1E/KiVBu8DlLL4fAj3eEVQ2Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Lja4%2FbtrNwDqIt1E%2FKiVBu8DlLL4fAj3eEVQ2Ck%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;1920&quot; height=&quot;994&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;994&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;동적 라이브러리 dll 파일이 없다고 나온다면 아까 glew에서 받은 dll 파일을&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlXsav/btrNzJX1v5O/BOlO6QamrZ5TNfiRh9QGRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlXsav/btrNzJX1v5O/BOlO6QamrZ5TNfiRh9QGRk/img.png&quot; data-alt=&quot;이 위치에 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlXsav/btrNzJX1v5O/BOlO6QamrZ5TNfiRh9QGRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlXsav%2FbtrNzJX1v5O%2FBOlO6QamrZ5TNfiRh9QGRk%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;583&quot; height=&quot;412&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 위치에 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU6oEq/btrNJBK0yGh/xNaKBALdKhzk291Jg2zd4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU6oEq/btrNJBK0yGh/xNaKBALdKhzk291Jg2zd4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU6oEq/btrNJBK0yGh/xNaKBALdKhzk291Jg2zd4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU6oEq%2FbtrNJBK0yGh%2FxNaKBALdKhzk291Jg2zd4k%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;922&quot; height=&quot;690&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;690&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;이렇게 해서 opengl 환경설정을 마치고 창까지 띄워보았다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;엔진 및 사용 프로젝트 구분&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 프로젝트를 출력을 Lib로 하고 새로운 프로젝트에서&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;pre id=&quot;code_1664785815199&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;DD_MainCore.h&quot;

void Framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);

void DD_MainCore::Start()
{
    // glfw: 초기화 및 설정
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    // glfw 윈도우 생성
    // --------------------
    pWindow = glfwCreateWindow(800, 600, &quot;LearnOpenGL&quot;, NULL, NULL);
    if (pWindow == NULL)
    {
        glfwTerminate();
        return;
    }
    glfwMakeContextCurrent(pWindow);
    glfwSetFramebufferSizeCallback(pWindow, Framebuffer_size_callback);

    // glew 초기화
    glewInit();
}
void DD_MainCore::Frame()
{
    // render loop
    // -----------
    while (!glfwWindowShouldClose(pWindow))
    {
        // input
        // -----
        processInput(pWindow);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        glfwSwapBuffers(pWindow);
        glfwPollEvents();
    }
}

void DD_MainCore::Release()
{
    glfwTerminate();
    glfwDestroyWindow(pWindow);
    pWindow = nullptr;
}
void Framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window)
{
    if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}&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;Sample에서는 이런식으로 우리가 만든 라이브러리를 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1664785853001&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once
#pragma comment	(lib, &quot;ddEngine.lib&quot;)
#include &quot;DD_MainCore.h&quot;
int main()
{
	DD_MainCore* gEngine = new DD_MainCore();

	gEngine-&amp;gt;Start();

	gEngine-&amp;gt;Frame();

	gEngine-&amp;gt;Release();

	delete gEngine;
	gEngine = nullptr;

	return -1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cExJMU/btrNyFBI1pu/ndWqqnJImLVLKK19yqhVRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cExJMU/btrNyFBI1pu/ndWqqnJImLVLKK19yqhVRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cExJMU/btrNyFBI1pu/ndWqqnJImLVLKK19yqhVRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcExJMU%2FbtrNyFBI1pu%2FndWqqnJImLVLKK19yqhVRK%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;329&quot; height=&quot;391&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;391&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>STUDY/OpenGL</category>
      <category>glew</category>
      <category>glfw</category>
      <category>opengl</category>
      <category>오픈지엘</category>
      <category>자체엔진</category>
      <category>창띄우기</category>
      <category>초기설정</category>
      <category>환경설정</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/102</guid>
      <comments>https://dlemrcnd.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 3 Oct 2022 15:53:20 +0900</pubDate>
    </item>
    <item>
      <title>C++ - 자동으로 컴파일러가 만들어주는 복사생성자, 복사 대입 연산자 사용 방지법</title>
      <link>https://dlemrcnd.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;Effective C++ 책을 보고 정리한 글입니다.&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;클래스가 비어있다고 해도 클래스 안에 직접 선언을 안 해도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 컴파일러가 생성하는 함수는 &lt;b&gt;생성자, 복사 생성자, 복사 대입 연산자, 소멸자&lt;/b&gt; 등 이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모두 public의 접근제어자를 가지며 inline함수이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자동으로 만들어지는 클래스의 함수들&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1658985831942&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test{}; // 이렇게 빈 클래스를 만들면
// 아래 함수가 자동으로 생성됨
class Test{
public:
	Test(){}; //기본 생성자
    Test(const Test&amp;amp; rhs){}; //복사 생성자
    ~Test(){};//소멸자
    
    Test&amp;amp; operator=(const Test&amp;amp; rhs){};//복사 대입 연산자
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러가 자동으로 만들어주는 함수가 필요가 없다면&lt;/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;하지만 위에서 말했듯이 public 접근제어를 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private으로 선언한다해도 friend 함수가 호출할 수 있다는 문제점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;friend : private 멤버 변수를 접근 가능하게 하는 키워드&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버 함수를 private으로 선언하고 정의하지 않는 방법을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++ iostream 라이브러리에서도 복사 방지책으로 사용한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658986739342&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class UncopyUtil{
protected: //상속된 것만 접근 가능
	UncopyUtil(){};
	~UncopyUtil(){};

private:
	UncopyUtil(const UncopyUtil&amp;amp; rhs); //복사생성, 복사대입 방지
	UncopyUtil&amp;amp; operator=(const UncopyUtil&amp;amp; rhs);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658986800012&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test : private UncopyUtil {
...
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사를 외부에서 시도할때 컴파일러는 자동으로 생성하려 하는데 접근이 불가능하므로&lt;/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;/p&gt;</description>
      <category>STUDY/C++</category>
      <category>c++</category>
      <category>복사대입연산자</category>
      <category>복사생성자</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/101</guid>
      <comments>https://dlemrcnd.tistory.com/101#entry101comment</comments>
      <pubDate>Thu, 28 Jul 2022 14:44:34 +0900</pubDate>
    </item>
    <item>
      <title>Unreal Engine - 플러그인 제작, 플러그인 CDO 객체(클래스) 적재 실패 해결 (Failed to load c++ class (plugin))</title>
      <link>https://dlemrcnd.tistory.com/100</link>
      <description>&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;작업을 진행했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 플러그인 제작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적 라이브러리인 dll과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 제작을 위해서는 모듈 폴더와 빌드 설정 파일(Build.cs) 파일이 있어야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈의 정의를 해주는 파일은 모듈이름으로 된 .cpp파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;언리얼은 개발은 c++로 하고 프로젝트 빌드 관리는 c#으로 하는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r1TKh/btrEjhCmM8h/QawiqJxeL8BY8zlKsxpfi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r1TKh/btrEjhCmM8h/QawiqJxeL8BY8zlKsxpfi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r1TKh/btrEjhCmM8h/QawiqJxeL8BY8zlKsxpfi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr1TKh%2FbtrEjhCmM8h%2FQawiqJxeL8BY8zlKsxpfi0%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;759&quot; height=&quot;703&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 프로젝트에 c++ CDO 객체 적재 실패&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 프로젝트에서 저장을 해주는 클래스를 게임 인스턴스에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 생성해두고 사용하려니까 계속해서 CDO 참조가 안되는 문제가 있었다.&amp;nbsp;&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-origin-width=&quot;483&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJy6bl/btrEiNn0k4P/YyIrXEkbnGxIZFVFcBh2w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJy6bl/btrEiNn0k4P/YyIrXEkbnGxIZFVFcBh2w0/img.png&quot; data-alt=&quot;연결하고 껐다키면 이렇게 해당 플러그인 클래스가 싹 다 빠져있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJy6bl/btrEiNn0k4P/YyIrXEkbnGxIZFVFcBh2w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJy6bl%2FbtrEiNn0k4P%2FYyIrXEkbnGxIZFVFcBh2w0%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;483&quot; height=&quot;201&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연결하고 껐다키면 이렇게 해당 플러그인 클래스가 싹 다 빠져있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플러그인 안에 있는 C++에서 제작한 클래스를 미리 적재를 못한다는 느낌이 들어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 포럼에서 찾아보니까 다른 모듈보다 먼저 로딩하도록 하는 플래그를 기입하니 해결 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoadingPhase를 &quot;Default&quot;에서 &quot;PreDefault&quot;로 바꿔주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2dX8a/btrEeK6WwPw/oEE8sgm8BFCZkwr9yt3Xl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2dX8a/btrEeK6WwPw/oEE8sgm8BFCZkwr9yt3Xl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2dX8a/btrEeK6WwPw/oEE8sgm8BFCZkwr9yt3Xl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2dX8a%2FbtrEeK6WwPw%2FoEE8sgm8BFCZkwr9yt3Xl0%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;262&quot; height=&quot;330&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;330&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;a href=&quot;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654705394862&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Failed to load c++ class (plugin) after editor restart&quot; data-og-description=&quot;Hey guys, I implemented a plugin that contains an abstract c++ parent class (InventorySlotUI) and a BP widget that inherits from it (SimpleInventorySlotUI) in the content folder. Another BP widget (InventoryUI) is using this and the first time I put everyt&quot; data-og-host=&quot;forums.unrealengine.com&quot; data-og-source-url=&quot;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&quot; data-og-url=&quot;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eNCq5/hyOIktIGLV/rZLZeq2RzV8aeymAZv47Z1/img.png?width=1024&amp;amp;height=410&amp;amp;face=0_0_1024_410,https://scrap.kakaocdn.net/dn/bcA8Ga/hyOGQA0YfS/JMsfEyIFyXcVrWpJhStjo0/img.png?width=1024&amp;amp;height=410&amp;amp;face=0_0_1024_410,https://scrap.kakaocdn.net/dn/diZXGc/hyOIfspGHn/Zws1sI7DIJ0A2XpKDdbVe1/img.png?width=1266&amp;amp;height=508&amp;amp;face=0_0_1266_508&quot;&gt;&lt;a href=&quot;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://forums.unrealengine.com/t/failed-to-load-c-class-plugin-after-editor-restart/484156&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eNCq5/hyOIktIGLV/rZLZeq2RzV8aeymAZv47Z1/img.png?width=1024&amp;amp;height=410&amp;amp;face=0_0_1024_410,https://scrap.kakaocdn.net/dn/bcA8Ga/hyOGQA0YfS/JMsfEyIFyXcVrWpJhStjo0/img.png?width=1024&amp;amp;height=410&amp;amp;face=0_0_1024_410,https://scrap.kakaocdn.net/dn/diZXGc/hyOIfspGHn/Zws1sI7DIJ0A2XpKDdbVe1/img.png?width=1266&amp;amp;height=508&amp;amp;face=0_0_1266_508');&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;Failed to load c++ class (plugin) after editor restart&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hey guys, I implemented a plugin that contains an abstract c++ parent class (InventorySlotUI) and a BP widget that inherits from it (SimpleInventorySlotUI) in the content folder. Another BP widget (InventoryUI) is using this and the first time I put everyt&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;forums.unrealengine.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;</description>
      <category>STUDY/Unreal Engine</category>
      <category>C++ 클래스</category>
      <category>Failed to load c++ class (plugin)</category>
      <category>모듈</category>
      <category>플러그인</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/100</guid>
      <comments>https://dlemrcnd.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 9 Jun 2022 01:24:51 +0900</pubDate>
    </item>
    <item>
      <title>UE5 - 언리얼 UClass, CDO, UHT, New Object, Constructor, C++ 개념 및 정리</title>
      <link>https://dlemrcnd.tistory.com/99</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ti4qM/btrC0OOgdPe/mDQkKkh6vvbcM9Xgr4Sx21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ti4qM/btrC0OOgdPe/mDQkKkh6vvbcM9Xgr4Sx21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ti4qM/btrC0OOgdPe/mDQkKkh6vvbcM9Xgr4Sx21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTi4qM%2FbtrC0OOgdPe%2FmDQkKkh6vvbcM9Xgr4Sx21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;608&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언리얼은 무조건 UObject에서 파생된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 언리얼엔진에서 관리되는 가비지 컬렉션 쓸라면 UObject를 상속 받아야함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. CDO&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UClass() 매크로를 구성하면 언리얼 클래스가 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 단계에서 언리얼 오브젝트마다 UClass가 생성된다면,&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;lt;- 이 인스턴스는 언리얼 기본 세팅을 지정하는데 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 기본 객체 (Class Default Object) CDO라고 함.&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;CDO로 복사해서 실제로 런타임에서는 복사본으로 작동한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDO를 만듬으로서 오브젝트를 생성할때마다 매번 초기화 안하고 기본 인스턴스를 미리&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;언리얼 오브젝트의 로딩은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모듈 로딩-&amp;gt;모듈에 속한 모든 UObject의 클래스 정보 등록 -&amp;gt; 각 클래스 정보의 CDO 객체 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt; 언리얼 오브젝트의 생성자를 호출해 CDO 완성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. UHT? GENERATE_BODY?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 헤더 툴(UHT)에서 Generated.h 생성함, 헤더 맨 마지막에 와야만 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GENERATED_BODY() 매크로는 복사생성자,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 UE 타입 시스템에 자동으로 생성된 기능을 포함하도록 확장된 매크로 GENERATED_BODY&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PRIVATE로 생성자를 외부에서 사용 못하게, 언리얼 메카니즘에서 벗어나지 않게끔한다.&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;a href=&quot;https://dlemrcnd.tistory.com/96?category=517587&quot;&gt;https://dlemrcnd.tistory.com/96?category=517587&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1653322498222&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;UE5 - C++와 블루프린트 연동 UPROPERTY(), UFUNCTION()&quot; data-og-description=&quot;UPROPERTY() UPROPERTY()는 변수에 붙는 리플렉션 매크로다. 매크로에 인자값을 넣어서 용도에 맞게 사용이 가능, 인자 값 순서는 상관이 없지만, 규칙이 존재함 1. 변수 공개 &amp;amp; 수정 권한 VisibleDefaultsOnly&quot; data-og-host=&quot;dlemrcnd.tistory.com&quot; data-og-source-url=&quot;https://dlemrcnd.tistory.com/96?category=517587&quot; data-og-url=&quot;https://dlemrcnd.tistory.com/96&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMnZ4O/hyOvRF3ykO/3IAtHoR9k15ijfKbvuK3a0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/AYm1Y/hyOvQmQ2cI/oYUFkuj2aEs7zAgDGwrDjk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://dlemrcnd.tistory.com/96?category=517587&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dlemrcnd.tistory.com/96?category=517587&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMnZ4O/hyOvRF3ykO/3IAtHoR9k15ijfKbvuK3a0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/AYm1Y/hyOvQmQ2cI/oYUFkuj2aEs7zAgDGwrDjk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;UE5 - C++와 블루프린트 연동 UPROPERTY(), UFUNCTION()&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;UPROPERTY() UPROPERTY()는 변수에 붙는 리플렉션 매크로다. 매크로에 인자값을 넣어서 용도에 맞게 사용이 가능, 인자 값 순서는 상관이 없지만, 규칙이 존재함 1. 변수 공개 &amp;amp; 수정 권한 VisibleDefaultsOnly&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dlemrcnd.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;이전 포스팅에서 UCLASS, UFUNCTION, UPROPERTY의 매크로에 대해서 다뤘는데,&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;블루프린트 가능하게 되어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액터는 거의 모든 UCLASS 매크로 가 붙어져있어서&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. New가 아닌 언리얼 생성, 팩토리 함수&lt;/b&gt;&lt;/h3&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;new 대신 특별한 팩토리 함수를 호출하도록 요구함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AActor는 SpawnActor&amp;lt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UObject 인스턴스화는 &lt;s&gt;ConstructObject&amp;lt;&amp;gt;&lt;/s&gt; 또는 NewObject&amp;lt;&amp;gt;를 사용한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언리얼 5로 넘어가면서 ConstructObject를 배제했다 블루프린트에는 아직 사용가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;불편하게 NewObject에는 호출마다 GetRransientPackage()를 전달해야하는 첫번째 매개변수가 있음&lt;/p&gt;
&lt;pre id=&quot;code_1653323216081&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ObjectType* object = NewObject&amp;lt;ObjectType&amp;gt;(ObjectType*)GetTransientPackage(), ObjectType::StaticClass());

ObjectType* obejct = ConstructObject&amp;lt;ObjectType&amp;gt;(UClassReference) 오브젝트 인스턴스화가능&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;StaticClass()를 사용하면 CDO, 오브젝트 베이스 UClass* 를 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetTranientPackage() 단순 휘발성 패키지 얻어옴,&amp;nbsp; ConstructObejct와 다르게 좀 더 많은 파라미터 제공&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 언리얼 스마트 포인터&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;native c++ 가 아닌 언리얼 스마트 포인터는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 언리얼 가비지 컬렉션에 속하지 않아도 메모리 프로그래밍할때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSharedPtr, TWeakPtr, TAutoPtr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 버젼으로 포팅한것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. FClassFinder, FObjectFinder 구분해서 사용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘다 Constructor Helper로 생성자에서만 사용가능하다. CDO 제작에서만 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FObjectFinder는 CDO 객체를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 FClassFinder는 UClass객체를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 초기화할때 프로젝트에 포함된 다른 클래스나 오브젝트 리소스 가져와야 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++ 코드에서 CDO가 아닌 실제 클래스 가져올때 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653323600463&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static ConstructorHelpers::FClassFinder&amp;lt;APawn&amp;gt; BPClass(TEXT(&quot;/Game/Blueprints/Bp_Class&quot;));
if (BPClass.Succeeded() &amp;amp;&amp;amp; BPClass.Class != NULL)
{
    // 가져온 BPClass.Class를 통한 작업
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. FSoftClassReference, &lt;b&gt;TSubClassOf&amp;lt;c++classname&amp;gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FStringClassReference 이름에서 해당이름으로 바뀜&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스트링으로 참조하겠다는 뜻.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블루프린트에서 MetaClass 태그로 만든것을 해당 c++클래서에서 파생된 블루프린트로만 제한함,&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;TSubClassOf&amp;lt;c++classname&amp;gt; // 클래스 레퍼런스를 받는것, CDO 객체를 받아올 수 있음&amp;lt;/c++classname&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UClass 이름을 지정해서 객체 받아옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. ETC&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GEngine 엔진 포인터 외부변수&lt;/p&gt;
&lt;pre id=&quot;code_1653323881365&quot; class=&quot;less&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GEngine-&amp;gt;AddOnScreenDebugMessage(-1, 10, FColor::Red, TEXT(&quot;&quot;))

//블루프린트 Print string과 같은 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653323881365&quot; class=&quot;reasonml&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FTimerHandle Timer;

GetWorldTimerManager().SetTimer(Timer, this, ..., 10);

//시간 타이머&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653323881366&quot; class=&quot;dts&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//매쉬 컴포넌트 생성, 생성자에서만 호출가능

Mesh = CreateDefaultSubobject&amp;lt;UStaticMeshComponent&amp;gt;(&quot;이름&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성자에서만 할당가능함&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653323881366&quot; class=&quot;stylus&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;auto MeshAsset = ConstructorHelpers::FObjectFinder&amp;lt;UStaticMesh&amp;gt;(TEXT(&quot;에셋경로&quot;));

if(MeshAsset.Object!=nullptr)//유효 검사

//ConstructHelper로 에셋으로 매쉬를 가져옴&lt;/code&gt;&lt;/pre&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;부모자식 하이라키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//오브젝트 계층설정&lt;/p&gt;
&lt;pre id=&quot;code_1653323881366&quot; class=&quot;lisp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BoxOne-&amp;gt;AttachTo(Root);

BoxTwo-&amp;gt;AttachTo(ChildSceneComponent);

ChildSceneComponent-&amp;gt;SetRelativeTransform(FTransform(FRotator(0,0,0), FVector(0,0,0), FVector(0.1f)));&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;Tick, TickComponent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액터 틱과 컴포넌트 틱의 차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PrimaryComponentTick.bCanEverTick = true; 매 틱마다 발생&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;BlueprintSpwanableComponent 추가하면 클래스 추가가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UCLASS(ClassGroup =(custom), meta =(BlueprintSpawnableComponent))&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;열거형 변수 UENUM() 매크로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <category>c++</category>
      <category>C++ 개념 및 정리</category>
      <category>CDO C++ 개념 및 정리</category>
      <category>Constructor</category>
      <category>New Object</category>
      <category>UCLASS</category>
      <category>UE5 - 언리얼 UClass</category>
      <category>UHT</category>
      <category>UPROPERTY</category>
      <category>언리얼</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/99</guid>
      <comments>https://dlemrcnd.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 24 May 2022 01:40:01 +0900</pubDate>
    </item>
    <item>
      <title>Unreal Engine 5 - Control Rig, Full body IK 플러그인을 사용한 캐릭터 커스터마이징</title>
      <link>https://dlemrcnd.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 5가 정식 출시되면서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Control rig와 Fullbody IK가 정식 탑재 되었다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 개인 프로젝트에서 Control rig와 Fullbody IK를 활용해&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;팀프로젝트를 진행하면서 캐릭터 커스터마이징을 구현할 기회가 생겨서&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 컨트롤 릭 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1nStA/btrCLzljzDW/fGkfVXX2l05FtICGUrkUsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1nStA/btrCLzljzDW/fGkfVXX2l05FtICGUrkUsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1nStA/btrCLzljzDW/fGkfVXX2l05FtICGUrkUsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1nStA%2FbtrCLzljzDW%2FfGkfVXX2l05FtICGUrkUsK%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;781&quot; height=&quot;498&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;498&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-origin-width=&quot;649&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYGCyX/btrCMcwEafQ/giqbBEkhjrd6caEdbx2fQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYGCyX/btrCMcwEafQ/giqbBEkhjrd6caEdbx2fQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYGCyX/btrCMcwEafQ/giqbBEkhjrd6caEdbx2fQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYGCyX%2FbtrCMcwEafQ%2FgiqbBEkhjrd6caEdbx2fQk%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;649&quot; height=&quot;440&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;440&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 컨트롤 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L6XrV/btrCNOPyVGD/tbYbnaPW2RF9IwaiEOYjqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L6XrV/btrCNOPyVGD/tbYbnaPW2RF9IwaiEOYjqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L6XrV/btrCNOPyVGD/tbYbnaPW2RF9IwaiEOYjqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL6XrV%2FbtrCNOPyVGD%2FtbYbnaPW2RF9IwaiEOYjqk%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;926&quot; height=&quot;650&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;650&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQv7jg/btrCPInPoLH/fe0DvrcoADSV64yZwiT5K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQv7jg/btrCPInPoLH/fe0DvrcoADSV64yZwiT5K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQv7jg/btrCPInPoLH/fe0DvrcoADSV64yZwiT5K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQv7jg%2FbtrCPInPoLH%2Ffe0DvrcoADSV64yZwiT5K1%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;693&quot; height=&quot;733&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;733&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;가장 가까운 본에서 Offset 트랜스폼 설정하면 알아서 근처 뼈 위치에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;놓아진다. 컨트롤 쉐이프는 디테일에서 수정 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Fullbody IK 설정, 및 SetTransform Bone&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VtrZb/btrCRQeAs9z/zJm9PJFNHCkDnonz1CLUNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VtrZb/btrCRQeAs9z/zJm9PJFNHCkDnonz1CLUNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VtrZb/btrCRQeAs9z/zJm9PJFNHCkDnonz1CLUNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVtrZb%2FbtrCRQeAs9z%2FzJm9PJFNHCkDnonz1CLUNk%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;609&quot; height=&quot;533&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;533&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;풀바디 IK를 생성해, 원하는 본에다가 컨트롤 트랜스폼을 넣어주면,&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;이 외, 원하는 뼈 설정이나, 제외할 뼈, 등등 많은 설정을 쉽게 할 수 있는게 Fullbody IK이다.&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;그냥 뼈에 Set Transform를 하는게 더 적절해 보여서 Fullbody IK의 사용을 배제했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGLQXn/btrCPInSijn/uKiJGgBBxjbLZBlBUbfKkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGLQXn/btrCPInSijn/uKiJGgBBxjbLZBlBUbfKkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGLQXn/btrCPInSijn/uKiJGgBBxjbLZBlBUbfKkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGLQXn%2FbtrCPInSijn%2FuKiJGgBBxjbLZBlBUbfKkK%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;1428&quot; height=&quot;616&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 결과&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캐릭터 커스터마이징.gif&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/43ioS/btrCS0BpVOw/fzv3e9xubkuNVPkGDrz0UK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/43ioS/btrCS0BpVOw/fzv3e9xubkuNVPkGDrz0UK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/43ioS/btrCS0BpVOw/fzv3e9xubkuNVPkGDrz0UK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/43ioS/btrCS0BpVOw/fzv3e9xubkuNVPkGDrz0UK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;539&quot; data-filename=&quot;캐릭터 커스터마이징.gif&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/98</guid>
      <comments>https://dlemrcnd.tistory.com/98#entry98comment</comments>
      <pubDate>Sun, 22 May 2022 20:56:21 +0900</pubDate>
    </item>
    <item>
      <title>Algorithm - 에라토스테네스의 체 (효율성 좋게 소수 찾기)</title>
      <link>https://dlemrcnd.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소수는 자기자신만으로만 나눌 수 있는 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 2부터 자기자신 숫자 전까지만 반복문으로 돌아서&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n까지의 소수를 알고 싶을때, n*1/2이하의 수의배수만 지우면 됨.&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부터 시작해서 특정 수의 배수에 해당하는 수를 모두 지운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 2를 제외한 2의 배수 지우고 ...3를 제외한 3의배수 지우고..반복..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1652367018180&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;bool&amp;gt; arr(n+1);
arr[1] = true;
for(int i = 2; i &amp;lt;= sqrt(n); i++){
    if(arr[i]) continue;
    for(int j = i + i; j &amp;lt;= n; j += i)
        arr[j] = true;
}

// 소수 출력
for(int i = 2; i &amp;lt;= n; i++)
	if(!arr[i]) cout&amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제곱근까지만 약수의 여부를 검증하면 O(N^1/2)로 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>STUDY/Algorithm</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/97</guid>
      <comments>https://dlemrcnd.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 12 May 2022 23:51:30 +0900</pubDate>
    </item>
    <item>
      <title>UE5 - C++와 블루프린트 연동 UPROPERTY(), UFUNCTION()</title>
      <link>https://dlemrcnd.tistory.com/96</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;UPROPERTY()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPROPERTY()는 변수에 붙는 리플렉션 매크로다.&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;1. 변수 공개 &amp;amp; 수정 권한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VisibleDefaultsOnly // 인스펙터 창에서 보이기만 하고 수정 불가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VisibleInstanceOnly//월드 배치에서만&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VisibleAnywhere//둘다&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;EditDefautOnly // 인스펙터 창에서 보이고 수정도 가능 에디터에서만&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EditInstanceOnly// 월드 배치에서만&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EditAnywhere// 둘다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 블루 프린트 공개 &amp;amp; 수정 권한&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BlueprintReadOnly&lt;/td&gt;
&lt;td&gt;블루프린트에서 해당 변수를 읽기가 가능합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlueprintReadWrite&lt;/td&gt;
&lt;td&gt;블루프린트에서 해당 변수를 읽기 &amp;amp; 쓰기가 가능합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlueprintGetter&lt;/td&gt;
&lt;td&gt;해당 변수에 접근 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 접근합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlueprintSetter&lt;/td&gt;
&lt;td&gt;해당 변수에 수정 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 수정합니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Category&lt;/b&gt;&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Meta&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta 키워드는 Metadata 지정자라고 하며 에디터 관련 다양한 기능을 구현가능 &amp;nbsp;&lt;br /&gt;private으로 되어 있어도 &quot;meta = (AllowPrivateAccess = &quot;true&quot;)&quot;명령어를 사용하여 에디터에서 보이게 할 수 있음&lt;br /&gt;이외에도 다양한 Metadata 명령어가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unrealengine.com/ko/Programming/UnrealArchitecture/Reference/Metadata/index.html&quot;&gt;https://docs.unrealengine.com/ko/Programming/UnrealArchitecture/Reference/Metadata/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;UFUNCTION()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 변수용 매크로이며, UFUNCTION 함수용 매크로이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Blueprintcallable&lt;/b&gt;&lt;/h3&gt;
&lt;p 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. BlueprintPure&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 하나 반환하는 함수에 사용하는 BlueprintPure 키워드, 아마도 매개변수 전용인듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPARAM 매크로는 레퍼런스를 인자로 받아 올 수잇는 키워드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. BlueprintImplementableEvent&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++이 블루프린트 함수를 사용하고 싶을때 쓰는 매크로&lt;/p&gt;
&lt;p 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. BlueprintNativeEvent&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++에서 가상함수를 만드는 매크로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++에서 함수원형을 작성해야함&lt;/p&gt;</description>
      <category>STUDY/Unreal Engine</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/96</guid>
      <comments>https://dlemrcnd.tistory.com/96#entry96comment</comments>
      <pubDate>Wed, 11 May 2022 22:46:09 +0900</pubDate>
    </item>
    <item>
      <title>Azure Dev Ops 사용</title>
      <link>https://dlemrcnd.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Github는 100mb 이상 파일과 최대 2G 파일을 지원하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;LFS를 사용,&lt;/b&gt; 분할 업로드를 통해 해결하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 프로젝트를 진행하니까 Github의 불편함을 느끼고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트 사의 Azure Dev Ops를 사용하게 되었다.&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;a href=&quot;https://app.vssps.visualstudio.com/_signedin?realm=dev.azure.com&amp;amp;protocol=wsfederation&amp;amp;reply_to=https%3A%2F%2Fdev.azure.com%2F&quot;&gt;https://app.vssps.visualstudio.com/_signedin?realm=dev.azure.com&amp;amp;protocol=wsfederation&amp;amp;reply_to=https%3A%2F%2Fdev.azure.com%2F&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1651550054457&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Azure DevOps Services | 로그인&quot; data-og-description=&quot;현재 사용자 환경에서 Microsoft Internet Explorer의 보안 강화 구성이 사용하도록 설정되어 있습니다. 이 보안 강화 수준으로 인해 웹 통합 환경이 정상적으로 표시되거나 작동할 수 없습니다. 작업을&quot; data-og-host=&quot;app.vssps.visualstudio.com&quot; data-og-source-url=&quot;https://app.vssps.visualstudio.com/_signedin?realm=dev.azure.com&amp;amp;protocol=wsfederation&amp;amp;reply_to=https%3A%2F%2Fdev.azure.com%2F&quot; data-og-url=&quot;https://app.vssps.visualstudio.com/_signin?realm=app.vssps.visualstudio.com&amp;amp;reply_to=https%3A%2F%2Fapp.vssps.visualstudio.com%2F_signedin%3Frealm%3Ddev.azure.com%26protocol%3Dwsfederation%26reply_to%3Dhttps%253A%252F%252Fdev.azure.com%252F&amp;amp;redirect=1&amp;amp;mkt=ko-KR&amp;amp;context=eyJodCI6MywiaGlkIjoiYTVjYTM1ZWItMTQ4ZS00Y2NkLWJiYjMtZDMxNTc2ZDc1OTU4IiwicXMiOnt9LCJyciI6IiIsInZoIjoiIiwiY3YiOiIiLCJjcyI6IiJ90#ctx=eyJTaWduSW5Db29raWVEb21haW5zIjpbImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIsImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSJdfQ2&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://app.vssps.visualstudio.com/_signedin?realm=dev.azure.com&amp;amp;protocol=wsfederation&amp;amp;reply_to=https%3A%2F%2Fdev.azure.com%2F&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://app.vssps.visualstudio.com/_signedin?realm=dev.azure.com&amp;amp;protocol=wsfederation&amp;amp;reply_to=https%3A%2F%2Fdev.azure.com%2F&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Azure DevOps Services | 로그인&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;현재 사용자 환경에서 Microsoft Internet Explorer의 보안 강화 구성이 사용하도록 설정되어 있습니다. 이 보안 강화 수준으로 인해 웹 통합 환경이 정상적으로 표시되거나 작동할 수 없습니다. 작업을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;app.vssps.visualstudio.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;b&gt;우선 Azure Dev Ops를 켜서 새 레포지를 만든다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PRm9P/btrA59N5Maq/L6dczPJGRokErjyXRKlMXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PRm9P/btrA59N5Maq/L6dczPJGRokErjyXRKlMXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PRm9P/btrA59N5Maq/L6dczPJGRokErjyXRKlMXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPRm9P%2FbtrA59N5Maq%2FL6dczPJGRokErjyXRKlMXk%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;541&quot; height=&quot;379&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;567&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;프로젝트 세팅에서 Github Connections으로&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;s&gt;연동이 되는 것이 아닌데, 왜 연결하는지는 아직 모르겠음,&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;아마도 소스코드같은 것 연동하는데 쓰이는 것 같다.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8Vr7i/btrA9iDDBSr/o81uySjcvf9z2rZIEiqiO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8Vr7i/btrA9iDDBSr/o81uySjcvf9z2rZIEiqiO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8Vr7i/btrA9iDDBSr/o81uySjcvf9z2rZIEiqiO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8Vr7i%2FbtrA9iDDBSr%2Fo81uySjcvf9z2rZIEiqiO0%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;1083&quot; height=&quot;613&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;613&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Azure DevOps Clone&lt;/b&gt;&lt;/h2&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; Azure DevOps 같은 온라인 리포지토리를 복사할 수 있게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 오른쪽 사진 Azure DevOps의 레포 지를 복사해온 모습이다.&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/xUFib/btrA7aM6lxg/MYmldzt6sk4SKbj9Z6qBI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUFib/btrA7aM6lxg/MYmldzt6sk4SKbj9Z6qBI0/img.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;293&quot; data-is-animation=&quot;false&quot; style=&quot;width: 73.2337%; margin-right: 10px;&quot; data-widthpercent=&quot;74.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUFib/btrA7aM6lxg/MYmldzt6sk4SKbj9Z6qBI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUFib%2FbtrA7aM6lxg%2FMYmldzt6sk4SKbj9Z6qBI0%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;410&quot; height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btsn9Y/btrA5ram8Ob/1TocKxKaJR5wLjkh4FiohK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btsn9Y/btrA5ram8Ob/1TocKxKaJR5wLjkh4FiohK/img.png&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;603&quot; data-is-animation=&quot;false&quot; style=&quot;width: 25.6035%;&quot; data-widthpercent=&quot;25.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btsn9Y/btrA5ram8Ob/1TocKxKaJR5wLjkh4FiohK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtsn9Y%2FbtrA5ram8Ob%2F1TocKxKaJR5wLjkh4FiohK%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;295&quot; height=&quot;603&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwzREz/btrA3235fIA/czI1PscXNZUqzFgyNfLCXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwzREz/btrA3235fIA/czI1PscXNZUqzFgyNfLCXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwzREz/btrA3235fIA/czI1PscXNZUqzFgyNfLCXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwzREz%2FbtrA3235fIA%2FczI1PscXNZUqzFgyNfLCXK%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;554&quot; height=&quot;418&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;418&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;100mb가 넘어가는 언리얼의 리소스를 용량 제한 없이 올릴 수 있는 모습이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트의 초기 세팅에 Azure로 변경하여, 앞으로 푸시하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용량에 한에서 아무 걱정없이 할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;깃&lt;/b&gt;참고로 언리얼에 필수적으로 필요한 파일들은&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Config, Content, Script, exe 만 필요하고 나머지는 Generate VS project file을 통해 생성하면 된다.&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;.gitignore&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1652064239795&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Visual Studio 2015 user specific files
.vs/

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
*.ipa

# These project files can be generated by the engine
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Precompiled Assets
SourceArt/**/*.png
SourceArt/**/*.tga

# Binary Files
Binaries/*
Plugins/*/Binaries/*

# Builds
Build/*

# Whitelist PakBlacklist-&amp;lt;BuildConfiguration&amp;gt;.txt files
!Build/*/
Build/*/**
!Build/*/PakBlacklist*.txt

# Don't ignore icon files in Build
!Build/**/*.ico

# Built data for maps
*_BuiltData.uasset

# Configuration files generated by the Editor
Saved/*

# Compiled source files for the engine to use
Intermediate/*
Plugins/*/Intermediate/*

# Cache files for the editor to use
DerivedDataCache/*&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Github</category>
      <category>Azure</category>
      <category>DevOps</category>
      <author>최디디</author>
      <guid isPermaLink="true">https://dlemrcnd.tistory.com/95</guid>
      <comments>https://dlemrcnd.tistory.com/95#entry95comment</comments>
      <pubDate>Tue, 3 May 2022 11:41:49 +0900</pubDate>
    </item>
  </channel>
</rss>