<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Brain Backup</title>
    <link>https://igh01ti.tistory.com/</link>
    <description>공부한 내용을 기록하기 위한 블로그(게임프로그래밍이 주 분야)</description>
    <language>ko</language>
    <pubDate>Thu, 30 Jul 2026 18:47:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>게임 개발자(진)</managingEditor>
    <image>
      <title>Brain Backup</title>
      <url>https://tistory1.daumcdn.net/tistory/5201878/attach/4dede28822b545e792debbbeaa10cd98</url>
      <link>https://igh01ti.tistory.com</link>
    </image>
    <item>
      <title>[Unity] UnityWebRequest.Post을 사용한 json전송의 문제</title>
      <link>https://igh01ti.tistory.com/138</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;어떤 문제?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 사용하고 있는 유니티 에디터 버전: 2020.3.42f1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677914503358&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//ex_WWW는 UnityWebRequest객체

ex_WWW = UnityWebRequest.Post(ex_URL, data); //data는 json을 string으로 변환한 것
ex_WWW.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
ex_WWW.SetRequestHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼, UnityWebRequest.Post를 사용해서 string형식의 json을 바로 보내려고 시도하면 이론상 정상적으로 보내져야 하지만, 현재 제대로 보내지지 않습니다&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;423&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv8gH7/btr1Mkqo3fo/ipUKU1p8HXZhbtPuJgllU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv8gH7/btr1Mkqo3fo/ipUKU1p8HXZhbtPuJgllU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv8gH7/btr1Mkqo3fo/ipUKU1p8HXZhbtPuJgllU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv8gH7%2Fbtr1Mkqo3fo%2FipUKU1p8HXZhbtPuJgllU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;67&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷을 확인해보아도 JSON이 아닌, Line-based text data로 인식되고 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;유니티 포럼&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc58Fu/btr1POd6Y2I/LjzdwNWHcaLtmjgcTvPxq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc58Fu/btr1POd6Y2I/LjzdwNWHcaLtmjgcTvPxq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc58Fu/btr1POd6Y2I/LjzdwNWHcaLtmjgcTvPxq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc58Fu%2Fbtr1POd6Y2I%2FLjzdwNWHcaLtmjgcTvPxq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;341&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://forum.unity.com/threads/unitywebrequest-post-url-jsondata-sending-broken-json.414708/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677915335999&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;UnityWebRequest.Post(url, jsonData) sending broken Json&quot; data-og-description=&quot;I'm doing the following: (Don't worry it will be over HTTPS) UnityWebRequest.Post(url,jsonData) The json data is as follows: {&amp;quot;username&amp;quot;:&amp;quot;some...&quot; data-og-host=&quot;forum.unity.com&quot; data-og-source-url=&quot;https://forum.unity.com/threads/unitywebrequest-post-url-jsondata-sending-broken-json.414708/&quot; data-og-url=&quot;https://forum.unity.com/threads/unitywebrequest-post-url-jsondata-sending-broken-json.414708/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eAObNA/hyRQo7FBy9/s3H37npx6K9S0nqW6SSNu0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/clivzf/hyRQsvs0WN/CfJ8yjKRt62svfsnkGv8sK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://forum.unity.com/threads/unitywebrequest-post-url-jsondata-sending-broken-json.414708/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://forum.unity.com/threads/unitywebrequest-post-url-jsondata-sending-broken-json.414708/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eAObNA/hyRQo7FBy9/s3H37npx6K9S0nqW6SSNu0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/clivzf/hyRQsvs0WN/CfJ8yjKRt62svfsnkGv8sK/img.jpg?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;UnityWebRequest.Post(url, jsonData) sending broken Json&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I'm doing the following: (Don't worry it will be over HTTPS) UnityWebRequest.Post(url,jsonData) The json data is as follows: {&quot;username&quot;:&quot;some...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;forum.unity.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;UnityWebRequest.Post(string,string)에서 2번째 인자로 넘겨주는 내가 보내고자하는 string데이터는 application/x-www-form-urlencoded라고 가정하고 처리가 되는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 UnityWebRequest.Post를 이용한 json 전송은 지양해야할 것 같습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;그럼 json을 어떻게 Post?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 의도대로 string 형태의 json을 보내고 싶다면&lt;/p&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;0. UnityWebRequest를 생성해주면서 method를 Post로 설정해줍니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;ex_WWW = new UnityWebRequest(ex_URL, &quot;POST&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. string 형식의 json을 (여기선 data) utf8로 인코딩한 후 byte배열로 얻습니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;byte[] jsonToSend = System.Text.UTF8Encoding().GetBytes(data);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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. UploadHandlerRaw를 통해서 앞서 얻은 byte배열을 uploadHandler에 집어넣어 줍니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;ex_WWW.uploadHandler = new UploadHandlerRaw(jsonToSend);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 서버로부터 응답정보를 얻기 위해서 downloadHandler를 설정해줍니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #262626; color: #d0d0d0;&quot;&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;ex_WWW.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. RequestHeader를 json으로 설정해줍니다.(서버에서 json이라고 인식할수있게)&lt;/p&gt;
&lt;div style=&quot;background-color: #262626; color: #d0d0d0;&quot;&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;ex_WWW.SetRequestHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>유니티</category>
      <category>json post오류</category>
      <category>UnityWebRequest.Post json문제</category>
      <category>UnityWebRequest.Post문제</category>
      <category>유니티 Json</category>
      <category>유니티 json post문제</category>
      <category>유니티 json 전송 문제</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/138</guid>
      <comments>https://igh01ti.tistory.com/138#entry138comment</comments>
      <pubDate>Sat, 4 Mar 2023 16:42:18 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] PlayerPrefs을 활용한 데이터 저장</title>
      <link>https://igh01ti.tistory.com/137</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;PlayerPrefs란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 데이터 관리를 위해 제공해주는 클래스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int, float, string, bool 타입의 변수를 저장/불러오기 기능을 제공해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;멤버 함수&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;* DeleteAll&lt;/b&gt; =&amp;gt; 모든 키 값을 삭제&lt;br /&gt;&lt;b&gt;* DeleteKey&lt;/b&gt; =&amp;gt; 특정 키 값을 삭제&lt;br /&gt;&lt;b&gt;* GetFloat&lt;/b&gt; =&amp;gt; 지정한 float 타입의 키 값을 로드&lt;br /&gt;&lt;b&gt;* GetInt&lt;/b&gt; =&amp;gt; 지정한 int 타입의 키 값을 로드&lt;br /&gt;&lt;b&gt;* GetString&lt;/b&gt; =&amp;gt; 지정한 String 타입의 키 값을 로드&lt;br /&gt;&lt;b&gt;* HasKey&lt;/b&gt; =&amp;gt; 해당 키가 존재하는 여부를 반환&lt;br /&gt;&lt;b&gt;* Save&lt;/b&gt; =&amp;gt; 변경된 모든 키 값을 물리적인 저장 공간에 저장&lt;br /&gt;&lt;b&gt;* SetFloat&lt;/b&gt; =&amp;gt; 지정한 키로 float 타입의 값을 저장&lt;br /&gt;&lt;b&gt;* SetInt&lt;/b&gt; =&amp;gt; 지정한 키로 int 타입의 값을 저장&lt;br /&gt;&lt;b&gt;* SetString&lt;/b&gt; =&amp;gt; 지정한 키로 string 타입의 값을 저장&lt;/blockquote&gt;
&lt;pre id=&quot;code_1677903665776&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PlayerPrefs.SetString(&quot;Name&quot;, 스트링값);
//위와같은 방식으로 사용합니다.
//첫번째 인자는 Key로 사용되고, 두번째 인자는 Value로 들어가게 됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;값 저장 위치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 설정한 ComPany Name과 Product Name을 기준으로 저장위치가 정해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 레지스트리 편집기를 실행한후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. HKEY_CURRENT_USER =&amp;gt; SOFTWARE =&amp;gt; Unity =&amp;gt; UnityEditor =&amp;gt; [Company Name] =&amp;gt; [Product Name]&lt;/p&gt;</description>
      <category>유니티</category>
      <category>playerprefs</category>
      <category>데이터 불러오기</category>
      <category>유니티 PlayerPrefs</category>
      <category>유니티 값 저장</category>
      <category>유니티 게임 로드</category>
      <category>유니티 게임 저장</category>
      <category>유니티 데이터 불러오기</category>
      <category>유니티 데이터 저장</category>
      <category>유니티 저장</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/137</guid>
      <comments>https://igh01ti.tistory.com/137#entry137comment</comments>
      <pubDate>Sat, 4 Mar 2023 14:44:27 +0900</pubDate>
    </item>
    <item>
      <title>[C++ 서버] 여러개의 lock을 잡을때</title>
      <link>https://igh01ti.tistory.com/136</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;std::lock(), std::adopt_lock&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677349604452&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mutex m1;
mutex m2;


std::lock(m1,m2);
//내부적으로 정한 방식에 의해서 항상 동일한 순서로 m1,m2의 lock을 걸어줍니다.
//먼저 lock걸리는것이 무엇인지는 모르지만 매번 그 순서는 동일합니다.


lock_guard&amp;lt;mutex&amp;gt; g1(m1,std::adopt_lock);
lock_guard&amp;lt;mutex&amp;gt; g2(m2,std::adopt_lock);
//std::adopt_lock : 이미 lock된 상태니까, 나중에 소멸될 때 unlock 해줘!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;std::lock()을 통해서 일정한 순서를 유지한채 lock을 걸 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개 이상의 mutex가 들어 갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇이 먼저 lock걸릴지는 모르지만 항상 그 순서는 일정합니다.&lt;/p&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;lock_guard&amp;lt;&amp;gt;()에 std::adopt_locck을 옵션으로 주어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소멸될때 unlock시키는 방법도 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;그 외 아이디어&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mutex를 다루는 별도의 클래스를 만들어주고, 일종의 ID를 부여해서, 무조건 ID가 큰 애가 먼저 실행이 되어야 하는등 규칙을 설정하기.&lt;/li&gt;
&lt;li&gt;아래 그림처럼 Lock을 그래프를 통해서 추적해서, 순환이 일어나는지 확인하기(순환이 일어나면 비정상 상황으로 간주)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;969&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds5Atj/btr0DhvaHbJ/wKQjsc0UqugwhGKygLJj01/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds5Atj/btr0DhvaHbJ/wKQjsc0UqugwhGKygLJj01/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds5Atj/btr0DhvaHbJ/wKQjsc0UqugwhGKygLJj01/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds5Atj%2Fbtr0DhvaHbJ%2FwKQjsc0UqugwhGKygLJj01%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;1389&quot; height=&quot;969&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;969&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>BackEnd/IOCP게임서버</category>
      <category>adopt lock</category>
      <category>adopt_lock</category>
      <category>c++ std::lock()</category>
      <category>lock 그래프</category>
      <category>std::adopt_lock</category>
      <category>std::lock</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/136</guid>
      <comments>https://igh01ti.tistory.com/136#entry136comment</comments>
      <pubDate>Sun, 26 Feb 2023 05:35:14 +0900</pubDate>
    </item>
    <item>
      <title>[C++ 서버] Lock 기초(mutex)</title>
      <link>https://igh01ti.tistory.com/135</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;mutex를 활용한 lock&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677332994828&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;mutex&amp;gt;

vector&amp;lt;int32&amp;gt; v;
mutex m;

void Push()
{
	for (int32 i = 0; i &amp;lt; 10000; i++)
	{
		//자물쇠 잠그기
		m.lock();

		v.push_back(i);

		//자물쇠 풀기
		m.unlock();
	}
}

int main()
{  
	std::thread t1(Push);
	std::thread t2(Push);
	t1.join();
	t2.join();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lock(), unlock()을 통해서 상호배제(Mutual Exclusion)을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(뮤텍스와 세마포어의 차이가 궁금하다면? &lt;a href=&quot;https://worthpreading.tistory.com/90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;std::lock_guard&amp;lt;&amp;gt;의 원리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 lock(), unlock()을 사용자가 직접 적어주게 된다면, 코드가 길어질수록 실수의 여지가 생기게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 나타난 것이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://hwan-shell.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RAII&lt;/a&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Resource Acquisition Is Initialization)패턴&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;을 사용한 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++에서는 RAII패턴을 사용한 lock방식인 &lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;std::lock_guard&amp;lt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;를 제공해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;u&gt;&lt;b&gt;std::lock_guard&amp;lt;&amp;gt;를 사용하지않고 직접 구현&lt;/b&gt;&lt;/u&gt;해서 사용해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1677335459228&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;mutex&amp;gt;

vector&amp;lt;int32&amp;gt; v;
mutex m;

template&amp;lt;typename T&amp;gt;
class LockGuard
{
public:
	LockGuard(T&amp;amp; m)
	{
		_mutex = &amp;amp;m;
		_mutex-&amp;gt;lock();
	}
	~LockGuard()
	{
		_mutex-&amp;gt;unlock();
	}

private:
	T* _mutex;
};

void Push()
{
	for (int32 i = 0; i &amp;lt; 10000; i++)
	{
		LockGuard&amp;lt;std::mutex&amp;gt; lockGuard(m);
		v.push_back(i);
	}
}

int main()
{  
	std::thread t1(Push);
	std::thread t2(Push);
	t1.join();
	t2.join();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LockGuard 클래스를 보시면 작동 원리를 알 수 있습니다.&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;즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;LockGuard가 존재하는 { }범위를 벗어나면 자동으로 lock이 해제되는 방식&lt;/b&gt;&lt;/span&gt;입니다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실수를 많이 줄일수 있겠죠??&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;std::lock_guard&amp;lt;&amp;gt; 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677335657482&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;mutex&amp;gt;

vector&amp;lt;int32&amp;gt; v;
mutex m;

void Push()
{
	for (int32 i = 0; i &amp;lt; 10000; i++)
	{
		std::lock_guard&amp;lt;std::mutex&amp;gt; lockGuard(m);
		v.push_back(i);
	}
}

int main()
{  
	std::thread t1(Push);
	std::thread t2(Push);
	t1.join();
	t2.join();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++에서는 직접 구현할필요없이 std::lock_guard&amp;lt;&amp;gt;를 제공하기 때문에 위처럼 간편히 사용 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;std::unique_lock&amp;lt;&amp;gt; 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;std::unique_lock&amp;lt;&amp;gt;이란 std::lock_guard&amp;lt;&amp;gt;와 비슷하지만 기능이 추가된 녀석입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677335787184&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mutex m;
std::unique_lock&amp;lt;std::mutex&amp;gt; uniqueLock(m);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 사용하면 std::lock_guard&amp;lt;&amp;gt;와 동일한 기능을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677335839601&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mutex m;
std::unique_lock&amp;lt;std::mutex&amp;gt; uniqueLock(m,std::defer_lock);

~~~~//여러 코드들 

uniqueLock.lock() //이때 잠기게 됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 옵션으로 std::defer_lock을 인자로 전달하면 lock이 생성하는 즉시 잠기는 것이 아닌, 그 시점을 프로그래머가 정할수있습니다. (defer: 미루다, 연기하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lock()멤버 함수를 사용해서 그 시점을 정하게 됩니다.&lt;/p&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>BackEnd/IOCP게임서버</category>
      <category>c++ lock</category>
      <category>c++ lockguard사용</category>
      <category>c++ mutex</category>
      <category>c++ RAII</category>
      <category>c++ 뮤텍스</category>
      <category>lockguard사용법</category>
      <category>lock_guard란</category>
      <category>RAII란</category>
      <category>unique_lock c++</category>
      <category>unique_lock사용</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/135</guid>
      <comments>https://igh01ti.tistory.com/135#entry135comment</comments>
      <pubDate>Sat, 25 Feb 2023 23:40:08 +0900</pubDate>
    </item>
    <item>
      <title>[C++서버] Atomic</title>
      <link>https://igh01ti.tistory.com/134</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Atomic의 필요성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677259589382&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;

int sum = 0;

void Add()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		sum++;
	}
}

void Sub()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		sum--;
	}
}
int main()
{  
	std::thread t1(Add);
	std::thread t2(Sub);
	t1.join();
	t2.join();
	cout &amp;lt;&amp;lt; sum;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰레드 2개를 이용해서 동시에 전역변수(data영역) sum에 접근하는 코드를 예시로 들겠습니다.&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;그냥 생각했을때는 더하는 횟수와 빼는 횟수가 같기 때문에 0이 출력될것이라고 생각됩니다.&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;910&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qEpPh/btr0DimU14D/KGhYwEkPFCpCUASeRjk82k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qEpPh/btr0DimU14D/KGhYwEkPFCpCUASeRjk82k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qEpPh/btr0DimU14D/KGhYwEkPFCpCUASeRjk82k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqEpPh%2Fbtr0DimU14D%2FKGhYwEkPFCpCUASeRjk82k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;110&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 실제로는 매번 값이 바뀌지만 0이 아닌 값이 나오게 됩니다.&lt;/p&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;&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;sum++을 어셈블리단에서 파해쳐보겠습니다.&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;630&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9OJMN/btr0HyJuFKI/DE870SnYuckhF5krBDZ5fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9OJMN/btr0HyJuFKI/DE870SnYuckhF5krBDZ5fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9OJMN/btr0HyJuFKI/DE870SnYuckhF5krBDZ5fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9OJMN%2Fbtr0HyJuFKI%2FDE870SnYuckhF5krBDZ5fK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;122&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 설명하자면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 메모리 주소에 있는 값을 eax레지스트리로 가져온다.&lt;br /&gt;2. eax레지스트리의 값을 1증가시킨다.&lt;br /&gt;3. eax레지스트리의 값을 다시 원래 메모리주소에다가 붙여넣어준다&lt;/blockquote&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 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;즉, Add()를 실행하는 쓰레드와 Sub()를 실행하는 쓰레드가 서로 비동기적으로 실행되기때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 sum=0일때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add()함수, Sub()함수 모두 2번의 과정까지 진행됐다고 가정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add()가 먼저 3번과정을 통해서 메모리에다가 1을 집어넣으면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sub()가 3번과정을 통해서 자신이 계산한 -1값을 같은 메모리주소에다가 넣어주게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 실제로는 더하기,빼기가 한번씩 일어났지만 -1이 최종값이 들어가게 되는 상황이 되는겁니다.&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt; 1~3번 과정을 한번에 실행시킨다는 보장&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 사용하는것이&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; Atomic&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Atomic 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677276281316&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;atomic&amp;gt; //atomic헤더 파일 필요!!

atomic&amp;lt;int32&amp;gt; sum = 0; //atomic 사용법

void Add()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		sum++;
	}
}

void Sub()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		sum--;
	}
}
int main()
{  
	std::thread t1(Add);
	std::thread t2(Sub);
	t1.join();
	t2.join();
	cout &amp;lt;&amp;lt; sum;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;-헤더: #include &amp;lt;atomic&amp;gt;&lt;br /&gt;-사용법: atomic&amp;lt;자료형&amp;gt; 변수명&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 atomic을 사용하게되면 정상적으로 0이 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 sum++대신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum.fetch_add(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum--대신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum.fetch_add(-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 사용해도 똑같습니다.&lt;/p&gt;</description>
      <category>BackEnd/IOCP게임서버</category>
      <category>atomic개념</category>
      <category>atomic사용법</category>
      <category>atomic설명</category>
      <category>atomic원리</category>
      <category>c++ atomic</category>
      <category>c++ include</category>
      <category>c++ 아토믹</category>
      <category>c++ 원자성</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/134</guid>
      <comments>https://igh01ti.tistory.com/134#entry134comment</comments>
      <pubDate>Sat, 25 Feb 2023 07:06:33 +0900</pubDate>
    </item>
    <item>
      <title>[C++서버] 쓰레드 기초</title>
      <link>https://igh01ti.tistory.com/133</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;쓰레드 생성(std::thread)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677246539218&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt; //헤더파일

void HelloThread()
{
	cout&amp;lt;&amp;lt;&quot;Hello Thread&quot;&amp;lt;&amp;lt;endl;
}

void HelloParam(int32 num)
{
	cout&amp;lt;&amp;lt;num&amp;lt;&amp;lt;endl;
}

int main()
{
	std::thread t0(HelloThread); //쓰레드 생성 및 실행
    
    std::thread t1; //쓰레드 생성만 한 상태.
    t1=std::thread(HelloThread); //이런식으로 실행가능
    
    std::thread t2(HelloParam,17); //이런식으로 인자 넘기기 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;join()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677246664423&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt; //c++ 11부터 표준
void HelloThread()
{
	cout &amp;lt;&amp;lt; &quot;Hello Thread&quot; &amp;lt;&amp;lt; endl;
}

int main()
{
	std::thread t(HelloThread);
	cout &amp;lt;&amp;lt; &quot;Hello Main&quot; &amp;lt;&amp;lt; endl;
    
	t.join(); //메인쓰레드에서 t가 끝날때까지 기다린다. 안쓰면 오류
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 상황일때, 자식 쓰레드(t)가 아직 실행중인데, 부모 쓰레드(main)가 종료된다면 문제가 생길 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상황을 막기 위해서 C++에서 join() 멤버함수를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 상황에서는 main함수는 t.join()을 만난 순간, t쓰레드의 실행이 다 끝날때까지 기다렸다가 끝난다면 이어서 실행하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 스레드가 종료되고도 자식 스레드가 계속 실행중이라면 비정상적인 상황으로 간주하는데, 이것이 의도한 것이라면 detach()함수를 사용해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;joinable()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677249447342&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;thread&amp;gt; //c++ 11부터 표준

void HelloThread()
{
	cout &amp;lt;&amp;lt; &quot;Hello Thread&quot; &amp;lt;&amp;lt; endl;
}

int main()
{
	std::thread t(HelloThread);

	cout &amp;lt;&amp;lt; &quot;Hello Main&quot; &amp;lt;&amp;lt; endl;

	if(t.joinable())
		t.join();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;joinable()은 해당 쓰레드의 id가 0인지 아닌지를 체크하는 기능을 합니다.&lt;/p&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_1677249578862&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::thread t;

if(t.joinable())
	cout&amp;lt;&amp;lt;&quot;통과&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드라면, 쓰레드 t가 살아있지 않기때문에 &quot;통과&quot;가 출력되지 않습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;hardware_concurrency()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677249284745&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::thread t(HelloThread);

int32 count=t.hardware_concurrency(); //cpu의 쓰레드 갯수&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시적으로 동작할수있는 CPU의 쓰레드 갯수를 알려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 정보가 사용가능하지 않다면 0을 리턴해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;get_id()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1677249382077&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::thread t(HelloThread);

auto id=t.get_id(); //쓰레드마다 id. 1234이런건아닌데 다 다름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰레드에 부여된 id를 확인할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;detach()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.cppreference.com/w/cpp/thread/thread/detach&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;detach()를 호출한 이후에 *this는 더 이상 어떤 쓰레드도 소유하지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIoWvg/btr0AOzKMm8/0eKN0W3yQ9lGqCP5XeGSIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIoWvg/btr0AOzKMm8/0eKN0W3yQ9lGqCP5XeGSIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIoWvg/btr0AOzKMm8/0eKN0W3yQ9lGqCP5XeGSIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIoWvg%2Fbtr0AOzKMm8%2F0eKN0W3yQ9lGqCP5XeGSIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;605&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>BackEnd/IOCP게임서버</category>
      <category>c++ detach란</category>
      <category>c++ join</category>
      <category>c++ joinable이란</category>
      <category>c++ thread</category>
      <category>c++ 멀티쓰레드</category>
      <category>c++ 쓰레드기초</category>
      <category>c++쓰레드</category>
      <category>c++쓰레드란</category>
      <category>쓰레드 기초</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/133</guid>
      <comments>https://igh01ti.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 25 Feb 2023 00:16:09 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] UI에서 블로커 구현하기</title>
      <link>https://igh01ti.tistory.com/132</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;블로커란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfhJvW/btrZUBsHiAE/OiY3uqJ53YS7cCaWYbg0B0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfhJvW/btrZUBsHiAE/OiY3uqJ53YS7cCaWYbg0B0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfhJvW/btrZUBsHiAE/OiY3uqJ53YS7cCaWYbg0B0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfhJvW%2FbtrZUBsHiAE%2FOiY3uqJ53YS7cCaWYbg0B0%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;600&quot; height=&quot;384&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 게임 옵션ui를 켰을때, ui를 제외한 다른 부분은 클릭을 눌러도 반응하지 않게 구현하고 싶을때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때 블로커를 구현하여서 개발자의 의도대로 옵션ui만 클릭이 되도록 할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;블로커 구현&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkP5Tf/btrZKZnXg72/1KzbfZVP5rd1nZU05Lc500/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkP5Tf/btrZKZnXg72/1KzbfZVP5rd1nZU05Lc500/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkP5Tf/btrZKZnXg72/1KzbfZVP5rd1nZU05Lc500/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkP5Tf%2FbtrZKZnXg72%2F1KzbfZVP5rd1nZU05Lc500%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;454&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 블로커를 구현하고자 하는 UI 프리팹을 선택합니다.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;121&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDVOUR/btrZJchfN0B/axI7BbH6T1fG7G62n6JdDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDVOUR/btrZJchfN0B/axI7BbH6T1fG7G62n6JdDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDVOUR/btrZJchfN0B/axI7BbH6T1fG7G62n6JdDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDVOUR%2FbtrZJchfN0B%2FaxI7BbH6T1fG7G62n6JdDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;121&quot; height=&quot;86&quot; data-origin-width=&quot;121&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2. image 오브젝트를 추가해줍니다. 전 이름을 Blocker로 바꾸겠습니다.(자유)&lt;br /&gt;그리고 크기를 카메라를 다 덮을 크기로 설정해줍니다.&lt;/blockquote&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;&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;576&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t7e75/btrZV84WH2l/FqIkBzKcdsQky8LPKKURCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t7e75/btrZV84WH2l/FqIkBzKcdsQky8LPKKURCK/img.png&quot; data-alt=&quot;Alpha값 0으로 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t7e75/btrZV84WH2l/FqIkBzKcdsQky8LPKKURCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft7e75%2FbtrZV84WH2l%2FFqIkBzKcdsQky8LPKKURCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;545&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Alpha값 0으로 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;3. 방금 생성한 image의 Color속성에서 A(투명도 값)을 0으로 설정해줍니다. 그럼 투명한 Blocker가 됩니다.&lt;br /&gt;그리고 반드시 Raycast Target이 체크되어 있어야합니다.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgg2Eu/btrZSSOSb0C/6fk8UhzxrDH2NIJqvOzomK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgg2Eu/btrZSSOSb0C/6fk8UhzxrDH2NIJqvOzomK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgg2Eu/btrZSSOSb0C/6fk8UhzxrDH2NIJqvOzomK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgg2Eu%2FbtrZSSOSb0C%2F6fk8UhzxrDH2NIJqvOzomK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;133&quot; height=&quot;89&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;4. 반드시 Blocker는 가장 위로 올려줘야 합니다. 아래서부터 위로 인식하기 때문에, 가장 아래에 둔다면 정작 의도한 ui의 클릭도 먹통이 되어 버립니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 blocker</category>
      <category>유니티 ui blocker</category>
      <category>유니티 ui 일부분만</category>
      <category>유니티 ui 클릭 막기</category>
      <category>유니티 블로커</category>
      <category>유니티 특정 ui만</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/132</guid>
      <comments>https://igh01ti.tistory.com/132#entry132comment</comments>
      <pubDate>Sun, 19 Feb 2023 22:04:08 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 현재 애니메이터의 상태(state), 파라미터 값 아는 방법</title>
      <link>https://igh01ti.tistory.com/131</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;상태 아는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;상황: 현재 Hit애니메이션이 실행중인지를 알고 싶을때&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCSlpv/btrZ0JqfgAC/iCNIx2eFHnwQMHyhGpw3u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCSlpv/btrZ0JqfgAC/iCNIx2eFHnwQMHyhGpw3u0/img.png&quot; data-alt=&quot;애니메이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCSlpv/btrZ0JqfgAC/iCNIx2eFHnwQMHyhGpw3u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCSlpv%2FbtrZ0JqfgAC%2FiCNIx2eFHnwQMHyhGpw3u0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;505&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애니메이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1676809018060&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;anim = GetComponent&amp;lt;Animator&amp;gt;();

anim.GetCurrentAnimatorStateInfo(0).IsName(&quot;Hit&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;애니메이터.GetCurrentAnimatorStateInfo(해당 레이어의 인덱스).IsName(스테이트의 이름)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 통해서 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true/false를 반환해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;파라미터 값 아는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1676809368129&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;anim.GetCurrentAnimatorStateInfo(0).speed;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이터.GetCurrentAnimatorStateInfo(해당 레이어의 인덱스).파라미터이름&lt;/p&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;리턴값은 AnimatorStateInfo입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/2021.3/Documentation/ScriptReference/Animator.GetCurrentAnimatorStateInfo.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 문서 링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 상태 확인</category>
      <category>유니티 애니메이션 상태</category>
      <category>유니티 애니메이션 파라미터</category>
      <category>유니티 애니메이터 state</category>
      <category>유니티 애니메이터 값</category>
      <category>유니티 애니메이터 상태</category>
      <category>유니티 애니메이터 파라미터</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/131</guid>
      <comments>https://igh01ti.tistory.com/131#entry131comment</comments>
      <pubDate>Sat, 18 Feb 2023 20:12:44 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 헤더추가로 인스펙터 깔끔하게 정리하기!</title>
      <link>https://igh01ti.tistory.com/129</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;헤더추가 전&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;361&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBx2IY/btrZPUGhweQ/BhVZt3unWykVbALr5KE3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBx2IY/btrZPUGhweQ/BhVZt3unWykVbALr5KE3D1/img.png&quot; data-alt=&quot;스크립트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBx2IY/btrZPUGhweQ/BhVZt3unWykVbALr5KE3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBx2IY%2FbtrZPUGhweQ%2FBhVZt3unWykVbALr5KE3D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;146&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스크립트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2FUNq/btrZKoOZbb2/lDn1d9FaSxkoMLK1BDvvXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2FUNq/btrZKoOZbb2/lDn1d9FaSxkoMLK1BDvvXk/img.png&quot; data-alt=&quot;인스펙터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2FUNq/btrZKoOZbb2/lDn1d9FaSxkoMLK1BDvvXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2FUNq%2FbtrZKoOZbb2%2FlDn1d9FaSxkoMLK1BDvvXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;278&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인스펙터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;헤더추가 후&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;[Header(&quot;~~~&quot;)]&lt;/span&gt; &lt;/b&gt;사용&lt;/blockquote&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;357&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRi5BN/btrZKyKZoWQ/u9xml5t4ZnuGMgXjArC64K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRi5BN/btrZKyKZoWQ/u9xml5t4ZnuGMgXjArC64K/img.png&quot; data-alt=&quot;스크립트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRi5BN/btrZKyKZoWQ/u9xml5t4ZnuGMgXjArC64K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRi5BN%2FbtrZKyKZoWQ%2Fu9xml5t4ZnuGMgXjArC64K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;182&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스크립트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGCsM/btrZUCkNdSd/uhFmTMTKOnPbHItxW5Ugak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGCsM/btrZUCkNdSd/uhFmTMTKOnPbHItxW5Ugak/img.png&quot; data-alt=&quot;인스펙터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGCsM/btrZUCkNdSd/uhFmTMTKOnPbHItxW5Ugak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGCsM%2FbtrZUCkNdSd%2FuhFmTMTKOnPbHItxW5Ugak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;306&quot; height=&quot;326&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인스펙터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 인스펙터 정리</category>
      <category>유니티 카테고리</category>
      <category>유니티 헤더</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/129</guid>
      <comments>https://igh01ti.tistory.com/129#entry129comment</comments>
      <pubDate>Sat, 18 Feb 2023 20:11:31 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 애니메이션 이벤트</title>
      <link>https://igh01ti.tistory.com/128</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;애니메이션 이벤트는 왜 사용하는가?&lt;/b&gt;&lt;/span&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;예를 들면, 달리는 애니메이션을 적용하는데, 발이 땅에 닿는 순간에만 발자국 소리를 내고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 애니메이션창을 통해서 확인했을때, 발이 땅에 닿는 순간에 이벤트를 추가하여 자신이 미리 설정해둔 함수를 실행시키게 설정해둔다면(이 경우엔 발자국 소리를 내는 함수가 되겠습니다.) 깔끔하게 구현이 가능해집니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;사용 방법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkgApA/btrZLR3UD5g/41FkLNg8EBkdeE5jOWAEW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkgApA/btrZLR3UD5g/41FkLNg8EBkdeE5jOWAEW1/img.png&quot; data-alt=&quot;Ctrl+6 또는 위 과정을 통해 애니메이션창 키기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkgApA/btrZLR3UD5g/41FkLNg8EBkdeE5jOWAEW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkgApA%2FbtrZLR3UD5g%2F41FkLNg8EBkdeE5jOWAEW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;616&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ctrl+6 또는 위 과정을 통해 애니메이션창 키기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 먼저 애니메이션 창을 Ctrl+6 또는 위 과정을 통해서 켜줍니다.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJXIV2/btrZK1ySSXI/bCztCK0Y8mrrC6O7KUvtiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJXIV2/btrZK1ySSXI/bCztCK0Y8mrrC6O7KUvtiK/img.png&quot; data-alt=&quot;애니메이션창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJXIV2/btrZK1ySSXI/bCztCK0Y8mrrC6O7KUvtiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJXIV2%2FbtrZK1ySSXI%2FbCztCK0Y8mrrC6O7KUvtiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;564&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애니메이션창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2. 그럼 위와같은 애니메이션 창이 나타납니다.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dImJTX/btrZItJ8SRz/G2EXzivC0OdtFTvDjc0Wz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dImJTX/btrZItJ8SRz/G2EXzivC0OdtFTvDjc0Wz1/img.png&quot; data-alt=&quot;애니메이션이 적용돼있는 프리팹&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dImJTX/btrZItJ8SRz/G2EXzivC0OdtFTvDjc0Wz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdImJTX%2FbtrZItJ8SRz%2FG2EXzivC0OdtFTvDjc0Wz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;114&quot; height=&quot;129&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애니메이션이 적용돼있는 프리팹&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;3. 애니메이션이 적용돼있는 프리팹을 더블 클릭해줍니다. 이때, 해당 프리팹은 당연히 Animator 컴포넌트가 있어야 하고, 이벤트를 발생시킬때 사용할 함수가 정의돼있는 스크립트가 있어야 합니다!!&amp;nbsp;&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dE0C7x/btrZJWSl9E8/55DFWI40a02FRKVW5iofwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dE0C7x/btrZJWSl9E8/55DFWI40a02FRKVW5iofwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dE0C7x/btrZJWSl9E8/55DFWI40a02FRKVW5iofwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdE0C7x%2FbtrZJWSl9E8%2F55DFWI40a02FRKVW5iofwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;197&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;4. 그럼 애니메이션창에서 해당 프리팹의 Animator에 들어있는 애니메이션들의 목록이 나타나게 됩니다.&lt;br /&gt;애니메이션 이벤트를 추가하고 싶은 애니메이션을 선택해 줍니다.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baJhOd/btrZK2kiZS8/h7XuLTebHXfQikHr8Lbmw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baJhOd/btrZK2kiZS8/h7XuLTebHXfQikHr8Lbmw1/img.png&quot; data-alt=&quot;애니메이션 이벤트 적절한 위치에 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baJhOd/btrZK2kiZS8/h7XuLTebHXfQikHr8Lbmw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaJhOd%2FbtrZK2kiZS8%2Fh7XuLTebHXfQikHr8Lbmw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;285&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애니메이션 이벤트 적절한 위치에 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;5. 자기가 원하는 애니메이션의 타이밍에 맞춰서 Add Animation Event를 해줍니다. (우클릭)&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zDEtp/btrZJXjpVNt/vBtzbIdxmfqBs0jgP2Iol1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zDEtp/btrZJXjpVNt/vBtzbIdxmfqBs0jgP2Iol1/img.png&quot; data-alt=&quot;이벤트 함수 설정해주기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zDEtp/btrZJXjpVNt/vBtzbIdxmfqBs0jgP2Iol1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzDEtp%2FbtrZJXjpVNt%2FvBtzbIdxmfqBs0jgP2Iol1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;585&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이벤트 함수 설정해주기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;6. 추가한 애니메이션 이벤트를 누르면 인스펙터창에 어떤 함수를 연동해줄건지 고르는 창이 뜹니다.&lt;br /&gt;여기에 뜨는 함수의 목록은 당연히 해당 프리팹의 스크립트 상에 있는 함수들만 뜨게 됩니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 애니메이션 이벤트</category>
      <category>유니티 이벤트</category>
      <category>유니티 키프레임 이벤트</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/128</guid>
      <comments>https://igh01ti.tistory.com/128#entry128comment</comments>
      <pubDate>Sat, 18 Feb 2023 20:10:39 +0900</pubDate>
    </item>
    <item>
      <title>뱀서라이크 게임(유티니 엔진)</title>
      <link>https://igh01ti.tistory.com/127</link>
      <description></description>
      <category>프로젝트</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/127</guid>
      <comments>https://igh01ti.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 6 Feb 2023 16:51:32 +0900</pubDate>
    </item>
    <item>
      <title>VR Story(언리얼 엔진을 활용한 vr교육용 게임)</title>
      <link>https://igh01ti.tistory.com/126</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HiMbN/btrX6hQnJx9/RQZcyqs2kWjDnP73Zmd6RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HiMbN/btrX6hQnJx9/RQZcyqs2kWjDnP73Zmd6RK/img.png&quot; data-alt=&quot;프로젝트 소개 목차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HiMbN/btrX6hQnJx9/RQZcyqs2kWjDnP73Zmd6RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHiMbN%2FbtrX6hQnJx9%2FRQZcyqs2kWjDnP73Zmd6RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 소개 목차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;언리얼 엔진&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YozoM/btrX2nEsnwE/2Hx4nkn2Rz8xF21UfEeaJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YozoM/btrX2nEsnwE/2Hx4nkn2Rz8xF21UfEeaJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YozoM/btrX2nEsnwE/2Hx4nkn2Rz8xF21UfEeaJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYozoM%2FbtrX2nEsnwE%2F2Hx4nkn2Rz8xF21UfEeaJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문장을 만들어서 vr기기로 해당 문장을 구현해주는 게임을 목표로 하였기 때문에 사실적인 그래픽이 중요했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 언리얼 엔진을 사용하기로 결정하였습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;맵&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZpNwa/btrX4YDw62a/kLZCqk7ggxpTT4hdrq68VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZpNwa/btrX4YDw62a/kLZCqk7ggxpTT4hdrq68VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZpNwa/btrX4YDw62a/kLZCqk7ggxpTT4hdrq68VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZpNwa%2FbtrX4YDw62a%2FkLZCqk7ggxpTT4hdrq68VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV9qT4/btrX3tjZ14I/r8CmHMyRm1qTC9ICKBtCuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV9qT4/btrX3tjZ14I/r8CmHMyRm1qTC9ICKBtCuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV9qT4/btrX3tjZ14I/r8CmHMyRm1qTC9ICKBtCuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV9qT4%2FbtrX3tjZ14I%2Fr8CmHMyRm1qTC9ICKBtCuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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;이렇게 총 5개를 구현하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmk2IQ/btrX2Zi8CIh/OJ9kk7lks1MKglWBlATuB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmk2IQ/btrX2Zi8CIh/OJ9kk7lks1MKglWBlATuB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmk2IQ/btrX2Zi8CIh/OJ9kk7lks1MKglWBlATuB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmk2IQ%2FbtrX2Zi8CIh%2FOJ9kk7lks1MKglWBlATuB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산 지형을 구현하는 곳에서는 Landmass를 이용하여서 지형을 만들었습니다.&lt;/p&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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKycS7/btrX3ub8hxO/HBs7RGN5PnTtUZkzZhGQk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKycS7/btrX3ub8hxO/HBs7RGN5PnTtUZkzZhGQk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKycS7/btrX3ub8hxO/HBs7RGN5PnTtUZkzZhGQk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKycS7%2FbtrX3ub8hxO%2FHBs7RGN5PnTtUZkzZhGQk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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 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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiWQtl/btrX4ZJdcI5/6iO76N4KVYuTZwPjblbIM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiWQtl/btrX4ZJdcI5/6iO76N4KVYuTZwPjblbIM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiWQtl/btrX4ZJdcI5/6iO76N4KVYuTZwPjblbIM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiWQtl%2FbtrX4ZJdcI5%2F6iO76N4KVYuTZwPjblbIM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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 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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbS3jz/btrX9E5nAsv/UDMDk4RaHKha2BKXi0ZB20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbS3jz/btrX9E5nAsv/UDMDk4RaHKha2BKXi0ZB20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbS3jz/btrX9E5nAsv/UDMDk4RaHKha2BKXi0ZB20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbS3jz%2FbtrX9E5nAsv%2FUDMDk4RaHKha2BKXi0ZB20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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 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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSkWzf/btrX16psGCv/zCM83576bEzt6K40t7SRkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSkWzf/btrX16psGCv/zCM83576bEzt6K40t7SRkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSkWzf/btrX16psGCv/zCM83576bEzt6K40t7SRkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSkWzf%2FbtrX16psGCv%2FzCM83576bEzt6K40t7SRkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VR에서 텔레포트 기능 구현 및 AI이동을 위한 정보를 얻기 위해서 NavMeshBoundsVolume을 배치했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;애니메이션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/En8oI/btrX6iofoFK/iKbSUKIKDskOU2aKPzTWCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/En8oI/btrX6iofoFK/iKbSUKIKDskOU2aKPzTWCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/En8oI/btrX6iofoFK/iKbSUKIKDskOU2aKPzTWCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEn8oI%2FbtrX6iofoFK%2FiKbSUKIKDskOU2aKPzTWCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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 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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsFDPc/btrX4171Aye/peLnnkREI0VK6eH4AaZZK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsFDPc/btrX4171Aye/peLnnkREI0VK6eH4AaZZK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsFDPc/btrX4171Aye/peLnnkREI0VK6eH4AaZZK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsFDPc%2FbtrX4171Aye%2FpeLnnkREI0VK6eH4AaZZK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간마다의 각 스켈레톤의 위치를 지정하여서 애니메이션을 만들었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;블루프린트/C++&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHxmj7/btrX3qnaYlF/BjCSwVNxRX82SS46vKg2uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHxmj7/btrX3qnaYlF/BjCSwVNxRX82SS46vKg2uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHxmj7/btrX3qnaYlF/BjCSwVNxRX82SS46vKg2uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHxmj7%2FbtrX3qnaYlF%2FBjCSwVNxRX82SS46vKg2uK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&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;문장 구조 저장 및 구현등의 메인 로직은 c++은 사용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQFMIt/btrX4YDxr8k/08K5rsezWrGRD3C616QFIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQFMIt/btrX4YDxr8k/08K5rsezWrGRD3C616QFIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQFMIt/btrX4YDxr8k/08K5rsezWrGRD3C616QFIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQFMIt%2FbtrX4YDxr8k%2F08K5rsezWrGRD3C616QFIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NUaGe/btrX2qBkU7c/kKxyT3d3AgJKJwLcqAE0sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NUaGe/btrX2qBkU7c/kKxyT3d3AgJKJwLcqAE0sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NUaGe/btrX2qBkU7c/kKxyT3d3AgJKJwLcqAE0sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNUaGe%2FbtrX2qBkU7c%2FkKxyT3d3AgJKJwLcqAE0sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;vr 기능 추가&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blhBq4/btrX4mEERek/LnGO9MJ28kszzX35ZQa4h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blhBq4/btrX4mEERek/LnGO9MJ28kszzX35ZQa4h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blhBq4/btrX4mEERek/LnGO9MJ28kszzX35ZQa4h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblhBq4%2FbtrX4mEERek%2FLnGO9MJ28kszzX35ZQa4h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넓은 맵을 이동하게 하기 위해서 VR컨트롤러의 버튼을 통해서 표시된 위치로 순간이동 하는 기능을 만들었습니다.&lt;/p&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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JrqLv/btrX4mdC2uL/RCYKWLHYrv7g5Wo8tVcKPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JrqLv/btrX4mdC2uL/RCYKWLHYrv7g5Wo8tVcKPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JrqLv/btrX4mdC2uL/RCYKWLHYrv7g5Wo8tVcKPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJrqLv%2FbtrX4mdC2uL%2FRCYKWLHYrv7g5Wo8tVcKPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 UI를 직접 클릭하려면 VR 특성상 직접 다가가려면 힘들기 때문에 컨트롤러에서 레이저를 발사하여 충돌여부를 판단하게해서 원거리 상호작용을 구현하였습니다.&lt;/p&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;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2hF7r/btrX9GhPDE3/boMaJU0IgkpnBUOBUjldy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2hF7r/btrX9GhPDE3/boMaJU0IgkpnBUOBUjldy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2hF7r/btrX9GhPDE3/boMaJU0IgkpnBUOBUjldy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2hF7r%2FbtrX9GhPDE3%2FboMaJU0IgkpnBUOBUjldy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러 좌 메뉴버튼을 누르면 메인메뉴로 돌아가는 버튼, 새 문장을 만드는버튼, 서버에 현재 세상을 업로드하는 버튼을 만들어놨습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;HUD&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1NCrZ/btrX3rT0hzx/ST6Kp3tAiITiWjhRbt7E70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1NCrZ/btrX3rT0hzx/ST6Kp3tAiITiWjhRbt7E70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1NCrZ/btrX3rT0hzx/ST6Kp3tAiITiWjhRbt7E70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1NCrZ%2FbtrX3rT0hzx%2FST6Kp3tAiITiWjhRbt7E70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VR에서는 일반적으로 스크린에 표시하는 위젯이 구현되지않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무조건 3D 위젯만 가능하기 때문에 카메라에 3D위젯을 붙이는 대신, depth계산을 안해서 카메라와 이 위젯사이에 다른 물체가 와도 가려지지 않게 했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;서버&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZFumc/btrX2pPXGOV/ulKP1RaZi9XVLPlsPU3kt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZFumc/btrX2pPXGOV/ulKP1RaZi9XVLPlsPU3kt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZFumc/btrX2pPXGOV/ulKP1RaZi9XVLPlsPU3kt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZFumc%2FbtrX2pPXGOV%2FulKP1RaZi9XVLPlsPU3kt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;●API 서버에는 Django + Django rest framework 모듈을 사용합니다&lt;br /&gt;&lt;br /&gt;●Django에서는 기본적인 백엔드 서버 라이브러리를 제공하며, DB 데이터를 python에서 타입으로 다룰 수 있게 제공합니다.&lt;br /&gt;&lt;br /&gt;●Django restful framewor에서는 데이터 CRUD 연산에 대해 브라우저 API와 JSON API 형태를 둘 다 제공하는데,&lt;br /&gt;&lt;br /&gt;●이를 통해 적은 개발 비용으로 사용자와 어플리케이션에 대해 지원하며,&lt;br /&gt;&lt;br /&gt;●관리자는 웹브라우저로 접근해서 데이터를 편하게 관리할 수 있고 어플리케이션에서는 rest api로 접근해서 데이터를 바로 사용할 수 있게 합니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;인게임 영상&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/uBLQJ81vsuo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/uBLQJ81vsuo&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=uBLQJ81vsuo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cefKUi/hyRwEXeeAW/I442QLJfNQPqhQvy3sHNY1/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/uBLQJ81vsuo&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>프로젝트</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/126</guid>
      <comments>https://igh01ti.tistory.com/126#entry126comment</comments>
      <pubDate>Sat, 4 Feb 2023 22:50:34 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Json을 이용한 데이터 관리</title>
      <link>https://igh01ti.tistory.com/125</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;기본 사용법(유니티 기능)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1675355974010&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;stats&quot;: [
    {
      &quot;level&quot;: &quot;1&quot;,
      &quot;hp&quot;: &quot;100&quot;,
      &quot;attack&quot;: &quot;10&quot;
    },
    {
      &quot;level&quot;: &quot;2&quot;,
      &quot;hp&quot;: &quot;150&quot;,
      &quot;attack&quot;: &quot;15&quot;
    },
    {
      &quot;level&quot;: &quot;3&quot;,
      &quot;hp&quot;: &quot;200&quot;,
      &quot;attack&quot;: &quot;20&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 내용을 지닌 Json을 가지고 예시를 들겠습니다. (파일 경로: &lt;u&gt;&lt;b&gt;Data/StatData&lt;/b&gt;&lt;/u&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;pre id=&quot;code_1675356052540&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Serializable]
public class Stat
{
	public int level;
	public int hp;
	public int attack;
}

[Serializable]
public class StatData
{
	public List&amp;lt;Stat&amp;gt; stats = new List&amp;lt;Stat&amp;gt;();
}

public void Init()
{
	TextAsset textAsset = Resources.Load&amp;lt;TextAsset&amp;gt;(&quot;Data/StatData&quot;);
    StatData data = JsonUtility.FromJson&amp;lt;StatData&amp;gt;(textAsset.text);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;b&gt;[Serializable] 붙여줘야 함&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;JsonUtility.FromJson&amp;lt;&amp;gt;(); 사용 ==&amp;gt; List형태로 저장됨&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 Json의 내용을 클래스로 쪼개서 최종적으로는 List형태로 저장이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위 코드에선 stats 리스트에 모든 내용이 저장됨.)&lt;/p&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: #ee2323;&quot;&gt;&lt;b&gt;level,hp,attack,stats의 이름이 반드시 Json에 있는 단어와 같아야 합니다&lt;/b&gt;&lt;/span&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;그리고 접근지정자는 public또는 [SerializeField]를 붙여줘야 합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나, List보다는 딕셔너리를 사용해서 Key를 통해 접근하는 것이 아무래도 좋겠죠?&lt;/p&gt;
&lt;pre id=&quot;code_1675356639829&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Serializable]
public class Stat
{
	public int level;
	public int hp;
	public int attack;
}

[Serializable]
public class StatData
{
	public List&amp;lt;Stat&amp;gt; stats = new List&amp;lt;Stat&amp;gt;();
}

public void Init()
{
	public Dictionary&amp;lt;int, Stat&amp;gt; StatDict {get; private set;} = new Dictionary&amp;lt;int,Stat&amp;gt;();

	TextAsset textAsset = Resources.Load&amp;lt;TextAsset&amp;gt;(&quot;Data/StatData&quot;);
    StatData data = JsonUtility.FromJson&amp;lt;StatData&amp;gt;(textAsset.text);
    
    foreach(Stat stat in data.stats) //딕셔너리로 변환해주는 과정
    	StatDict.Add(stat.level,stat);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 2줄을 통해서 리스트를 딕셔너리로 변환해 줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(data.stats.ToDictionary();를 사용해도 되는 것으로 알지만 과거 ios쪽 버그가 있어서 꺼린다고 합니다..?)&lt;/i&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;데이터 매니저 및 데이터구조 따로 관리(참고)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1675356833122&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*데이터 매니저*/ //DataManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public interface ILoader&amp;lt;Key, Value&amp;gt;
{
    Dictionary&amp;lt;Key, Value&amp;gt; MakeDict();
}

public class DataManager
{
    public Dictionary&amp;lt;int, Stat&amp;gt; StatDict { get; private set; } = new Dictionary&amp;lt;int, Stat&amp;gt;(); //외부에서 얘를 뽑아서 사용하게 될 것임.

    public void Init()
    {
        StatDict = LoadJson&amp;lt;StatData, int, Stat&amp;gt;(&quot;StatData&quot;).MakeDict();
    }

    Loader LoadJson&amp;lt;Loader, Key, Value&amp;gt;(string path) where Loader : ILoader&amp;lt;Key, Value&amp;gt;
    {
		TextAsset textAsset = Managers.Resource.Load&amp;lt;TextAsset&amp;gt;($&quot;Data/{path}&quot;);
        return JsonUtility.FromJson&amp;lt;Loader&amp;gt;(textAsset.text);
	}

}&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_1675356848662&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*받아올 Json데이터 구조를 따로 관리*/ //Data.Contents.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region Stat

[Serializable]
public class Stat
{
	public int level;
	public int hp;
	public int attack;
}

[Serializable]
public class StatData : ILoader&amp;lt;int, Stat&amp;gt;
{
	public List&amp;lt;Stat&amp;gt; stats = new List&amp;lt;Stat&amp;gt;();

	public Dictionary&amp;lt;int, Stat&amp;gt; MakeDict()
	{
		Dictionary&amp;lt;int, Stat&amp;gt; dict = new Dictionary&amp;lt;int, Stat&amp;gt;();
		foreach (Stat stat in stats)
			dict.Add(stat.level, stat);
		return dict;
	}
}

#endregion&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;저는 위 방식을 사용해서 Json을 읽고 있습니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 Json</category>
      <category>유니티 JsonUtility</category>
      <category>유니티 Serializable</category>
      <category>유니티 데이터</category>
      <category>유니티 데이터매니저</category>
      <category>유니티FromJson</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/125</guid>
      <comments>https://igh01ti.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 3 Feb 2023 01:58:05 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 코루틴(Coroutine)</title>
      <link>https://igh01ti.tistory.com/124</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;코루틴이란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be5dCb/btrXPsLYGXh/rKuPVygKLqcONBwe4jSz81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be5dCb/btrXPsLYGXh/rKuPVygKLqcONBwe4jSz81/img.png&quot; data-alt=&quot;(좌)일반 함수 / (우) 코루틴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be5dCb/btrXPsLYGXh/rKuPVygKLqcONBwe4jSz81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe5dCb%2FbtrXPsLYGXh%2FrKuPVygKLqcONBwe4jSz81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;664&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;664&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;코루틴은 함수 실행중, 중간에 빠져나가고 다른 작업을하다가 다시 중단된 시점부터 이어서 실행하고를 가능하게 해주는 함수를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 코루틴의 실행은 어느 스레드에서든 가능합니다.(thread-safe를 의미하지는 않음.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(A쓰레드에서 코루틴을 생성하고 실행하다가 중단하고, B스레드에서 다시 실행하더라도 코루틴은 중단 지점으로부터 정상적으로 재개된다는 것입니다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;C#의 코루틴&lt;/b&gt;&lt;/span&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;C#자체가 코루틴을 지원하고 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675309084163&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    class CoroutineTest : IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
            yield return 1;
            yield return 2;
            yield return 3;
        }
    }
    
    void Init()
    {
    	CoroutineTest test = new CoroutineTest();
        foreach(int t in test)
        {
        	Debug.Log(t);
        }
    }
    
    //Init()실행시 출력 결과:
    //1
    //2
    //3&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675309288988&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Program
{
    public IEnumerator Coroutine()
    {
        int i = 0;
        Console.WriteLine($&quot;Coroutine {++i}&quot;);
        yield return null;

        Console.WriteLine($&quot;Coroutine {++i}&quot;);
        yield return null;

        Console.WriteLine($&quot;Coroutine {++i}&quot;);
        yield return null;
    }
    
    static void Main(string[] args)
    {
        Program program = new Program();
        IEnumerator coroutine = program.Coroutine();

        Console.WriteLine(&quot;Main 1&quot;);
        coroutine.MoveNext();
        Console.WriteLine(&quot;Main 2&quot;);
        coroutine.MoveNext();
        Console.WriteLine(&quot;Main 3&quot;);
        coroutine.MoveNext();
    }
}

// OUTPUT :
// Main 1
// Coroutine 1
// Main 2
// Coroutine 2
// Main 3
// Coroutine 3&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;p data-ke-size=&quot;size16&quot;&gt;IEnumerator와 yield를 이용하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IEnumerator 객체에 MoveNext()를 사용해서 다음 yield return을 실행 가능해집니다.&lt;/p&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;pre id=&quot;code_1675309754651&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    void Start()
    {
        IEnumerator enumerator = SomeNumbers();
 
        Debug.Log(&quot;=====================================&quot;);
 
        // MoveNext()에서 실제로 SomeNumbers()가 실행됩니다. 
        // 처음에는 &quot;yield return 3;&quot; 까지만 실행됩니다.
        while (enumerator.MoveNext()) 
        {
            object result = enumerator.Current;
            Debug.Log(&quot;Number: &quot; + result);
        }
    }
  
    IEnumerator SomeNumbers()
    {
        Debug.Log(&quot;yield return 1&quot;);
        yield return 3;
        Debug.Log(&quot;yield return 2&quot;);
        yield return 5;
        Debug.Log(&quot;yield return 3&quot;);
        yield return 8;
        // 이후에는 함수의 끝을 만나게 되므로 더이상 yield(양보)가 일어나지 않습니다.
    }&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675310097475&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yeid break;
//코루틴을 임의로 종료시키고 싶을때 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고할만한 링크: &lt;a href=&quot;https://kukuta.tistory.com/222&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;, &lt;a href=&quot;https://daebalstudio.tistory.com/entry/Coroutine-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%95%8C%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;유니티에서 코루틴&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675310436744&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	private Coroutine co; //전역변수로 코루틴 변수 선언

	void Init()
    {
        co = StartCoroutine(&quot;CoExploadAfterSeconds&quot;, 4.0f);
        StartCoroutine(&quot;CoStopExplode&quot;, 2.0f);
    }

    IEnumerator CoStopExplode(float seconds)
    {
        Debug.Log(&quot;Stop Enter&quot;);
        yield return new WaitForSeconds(seconds);
        Debug.Log(&quot;Stop Execute!!!!&quot;);
        if (co != null)
        {
            StopCoroutine(co);
            co = null;
        }
    }

    IEnumerator CoExploadAfterSeconds(float seconds)
    {
        Debug.Log(&quot;Explode Enter&quot;);
        yield return new WaitForSeconds(seconds);
        Debug.Log(&quot;Explode Execute!!!!&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biut9M/btrXPtjZ1HM/BYKCurm2P60P5DR8wi7lHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biut9M/btrXPtjZ1HM/BYKCurm2P60P5DR8wi7lHk/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biut9M/btrXPtjZ1HM/BYKCurm2P60P5DR8wi7lHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiut9M%2FbtrXPtjZ1HM%2FBYKCurm2P60P5DR8wi7lHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;299&quot; height=&quot;181&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;181&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;유니티에선 WaitForSeconds()를 활용하여 일정시간동안 코루틴함수를 중지시킬 수 있습니다.&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;StartCoroutine(&quot;코루틴함수명&quot;,인자) 를 통해서 코루틴함수를 실행 시킬 수 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StopCoroutine(&quot;코루틴함수명&quot;) 또는 위처럼 저장해놓은 co변수를 넣어서도 가능.&lt;/p&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;위 예시에서는 CoExploadAfterSeconds()를 통해서 Explode Enter를 먼저 출력한 후 4초 후에 Explode Execute 를&amp;nbsp; 출력할 예정이었지만 CoStopExplode에서 2초만 기다리고 StopCoroutine(co)를 해줬기 때문에&amp;nbsp; &amp;nbsp;Explode Excute!!!는 출력되지 않는 것을 확인할 수 있습니다.&lt;/p&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>유니티</category>
      <category>C# 코루틴</category>
      <category>유니티 비동기</category>
      <category>유니티 코루틴</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/124</guid>
      <comments>https://igh01ti.tistory.com/124#entry124comment</comments>
      <pubDate>Thu, 2 Feb 2023 13:10:07 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 애니메이션 및 행동 관리하기(with 스테이트 패턴)</title>
      <link>https://igh01ti.tistory.com/123</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;그냥 조건문으로 관리하면 안되나?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 유니티를 배운 후, 캐릭터의 애니메이션 및 행동을 관리해주기 위한 스크립트를 짜보라 하면 보통 아래같은 방식으로 작성합니다&lt;/p&gt;
&lt;pre id=&quot;code_1675026319188&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(뛰는 중)
{
	뛰는 애니메이션 실행.
    움직일 목적지로 이동시킴.
    
    if(죽음)
    {
    	죽는 애니메이션 실행.
        각종 필요한 처리..
    	...
    }
    else
    {
    	if(속도를 줄여서 걷게됨)
        {
        	...
        }
    }
}
else if(먹는 중)
{
    if(죽음)
        {
            ...
        }
    else if()...
}&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;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;스테이트 패턴&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;color: #ee2323;&quot;&gt;&lt;b&gt;enum으로 플레이어의 상태&lt;/b&gt;&lt;/span&gt;를 지정해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675026675987&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public enum PlayerState
	{
		Die,
		Moving,
		Idle,
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Die, Moving, Idle 기본적인 3가지로 가정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;핵심은, Update문&lt;/b&gt;&lt;/span&gt;에서 볼 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675026721658&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Update()
    {
		switch (_state)
		{
			case PlayerState.Die:
				UpdateDie();
				break;
			case PlayerState.Moving:
				UpdateMoving();
				break;
			case PlayerState.Idle:
				UpdateIdle();
				break;
		}
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;state에 따라서 해당하는 상태에서 일어나야 할 일을 처리해주는 함수를 호출해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 하면, if문이 얼기설기 중첩되는 방식을 쉽게 막아주며 가독성도 높일 수 있습니다.&lt;/p&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_1675027244076&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UpdateDie()
	{
		// 아무것도 못함
	}
    
void UpdateMoving()
	{
		Vector3 dir = _destPos - transform.position;
		if (dir.magnitude &amp;lt; 0.0001f)
		{
			_state = PlayerState.Idle;
		}
		else
		{
			float moveDist = Mathf.Clamp(_speed * Time.deltaTime, 0, dir.magnitude);
			transform.position += dir.normalized * moveDist;
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime);
		}

		// 애니메이션
		Animator anim = GetComponent&amp;lt;Animator&amp;gt;();
		// 현재 게임 상태에 대한 정보를 넘겨준다
        //애니메이터에서 speed변수값이 변경되면 뛰기 애니메이션을 변경되게 설정해놨음
		anim.SetFloat(&quot;speed&quot;, _speed);
	}
    
    void UpdateIdle()
	{
		// 애니메이션
		Animator anim = GetComponent&amp;lt;Animator&amp;gt;();
		anim.SetFloat(&quot;speed&quot;, 0);
	}&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;p data-ke-size=&quot;size16&quot;&gt;그래도 기존 방식보다는 확실히 코드를 읽는데 수월한 건 변함없습니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 스테이트</category>
      <category>유니티 애니메이션 관리</category>
      <category>유니티 애니메이션 스크립트</category>
      <category>유니티 애니메이션코드</category>
      <category>유니티 움직임 관리</category>
      <category>유니티 조건문</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/123</guid>
      <comments>https://igh01ti.tistory.com/123#entry123comment</comments>
      <pubDate>Mon, 30 Jan 2023 06:21:00 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 애니메이션 기초(스테이트 머신) 및 파라미터 설정</title>
      <link>https://igh01ti.tistory.com/122</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Animator Controller&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;86&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVRMDu/btrXmSLZowU/kEEVRRzssIyrmvhp3rc6y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVRMDu/btrXmSLZowU/kEEVRRzssIyrmvhp3rc6y1/img.png&quot; data-alt=&quot;Animator Controller&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVRMDu/btrXmSLZowU/kEEVRRzssIyrmvhp3rc6y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVRMDu%2FbtrXmSLZowU%2FkEEVRRzssIyrmvhp3rc6y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;86&quot; height=&quot;101&quot; data-origin-width=&quot;86&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Animator Controller&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/upFgW/btrXmICB4n4/K3EaRGXVT1hKflsWyrXNV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/upFgW/btrXmICB4n4/K3EaRGXVT1hKflsWyrXNV1/img.png&quot; data-alt=&quot;Animator 컴포넌트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/upFgW/btrXmICB4n4/K3EaRGXVT1hKflsWyrXNV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FupFgW%2FbtrXmICB4n4%2FK3EaRGXVT1hKflsWyrXNV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;196&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Animator 컴포넌트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터등에 애니메이션을 적용하려면 먼저 Animator 컴포넌트를 추가해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 Animator의 구조를 설정해주려면 Animator Controller가 필요합니다.&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;272&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdaJV/btrXnlmDbKy/dhTKmfTk9tF9tXPhzVOKp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdaJV/btrXnlmDbKy/dhTKmfTk9tF9tXPhzVOKp1/img.png&quot; data-alt=&quot;준비된 애니메이션(Animation Clip)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdaJV/btrXnlmDbKy/dhTKmfTk9tF9tXPhzVOKp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdaJV%2FbtrXnlmDbKy%2FdhTKmfTk9tF9tXPhzVOKp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;272&quot; height=&quot;202&quot; data-origin-width=&quot;272&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;준비된 애니메이션(Animation Clip)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이션(Animation Clip)을 준비했다면, 애니메이션 컨트롤러에 애니메이션들을 넣어줍니다.&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;899&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RBe6m/btrXqrTs6Ti/2cGOPpa0iWsD9zkA8EoQdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RBe6m/btrXqrTs6Ti/2cGOPpa0iWsD9zkA8EoQdk/img.png&quot; data-alt=&quot;애니메이션 컨트롤러에 애니메이션들을 설정해줌.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RBe6m/btrXqrTs6Ti/2cGOPpa0iWsD9zkA8EoQdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRBe6m%2FbtrXqrTs6Ti%2F2cGOPpa0iWsD9zkA8EoQdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;899&quot; height=&quot;459&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;459&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;이번 예시 같은 경우엔, Stand 애니메이션을 기본 애니메이션으로 설정해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진을 보면, 화살표를 볼 수 있는데, 이 화살표에 조건을 추가해 줌으로써 애니메이션의 변화를 만들 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Parameters 추가&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XChDj/btrXpcoHz7d/hkfkVPltb0KAZwBcyNw2iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XChDj/btrXpcoHz7d/hkfkVPltb0KAZwBcyNw2iK/img.png&quot; data-alt=&quot;조건을 위한 파라미터 추가방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XChDj/btrXpcoHz7d/hkfkVPltb0KAZwBcyNw2iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXChDj%2FbtrXpcoHz7d%2FhkfkVPltb0KAZwBcyNw2iK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;421&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;421&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;조건에 사용하기 위한 파라미터는 위 방법으로 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저같은 경우에는 Float형식의 Speed변수와 Trigger형식의 Dead변수를 반들어주었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;전이 조건 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU3RrQ/btrXqEeex8I/rWnZzZH6OGvGHT4S2E9HY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU3RrQ/btrXqEeex8I/rWnZzZH6OGvGHT4S2E9HY1/img.png&quot; data-alt=&quot;Stand-&amp;amp;gt;Run으로 가기 위한 조건&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU3RrQ/btrXqEeex8I/rWnZzZH6OGvGHT4S2E9HY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU3RrQ%2FbtrXqEeex8I%2FrWnZzZH6OGvGHT4S2E9HY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;619&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Stand-&amp;gt;Run으로 가기 위한 조건&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진은 Stand애니메이션에서 Run애니메이션으로 뻗어있는 화살표의 인스펙터창입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conditions부분을 보면 Speed파라미터가 0.01보다 클때 애니메이션이 변화하도록 설정한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 저 같은 경우 즉각적인 애니메이션의 변화를 원해서 Has Exit Time을 꺼주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Transition Duration&lt;/span&gt;&lt;/b&gt;을 0.01(사실상 0)으로 설정해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;애니메이션을 부드럽게 이어주기 위한 옵션&lt;/span&gt;&lt;/b&gt;인데 예를들어 Transition Duration이 1이라면 이전 애니메이션과 바뀔 애니메이션을 1초동안 부드럽게 섞어서 이어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2D 애니메이션일 경우에는 이 블렌드(Transitioni Duration)가 제대로 작동하지 않습니다&lt;/b&gt;&lt;/span&gt;. 따라서 저는 거의 0에 가까운 0.01로 설정해주었습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Has Exit Time이란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Exit Time은 &lt;u&gt;&lt;b&gt;파라미터에 의존하지 않고 상태의 정규화된 시간에 의존하는 특별한 전환&lt;/b&gt;&lt;/u&gt;입니다.&amp;nbsp;&lt;br /&gt;예를들어 Stand-&amp;gt;Run으로 전이하는 화살표일때, Has Exit Time이 켜져있고 Exit Time이 0.5(50%)라면,&lt;br /&gt;전이 조건이 만족되어도 ,이전 애니메이션, 즉 Stand 애니메이션이 최소 절반을 만족해야 전이가 발생합니다.&lt;br /&gt;정해진 시간이 지나면 알아서 다른 상태로 옮길려는 특성이 있습니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Any State&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJKExY/btrXoDNBY3C/6aOfyL8fislBcUNMgAldL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJKExY/btrXoDNBY3C/6aOfyL8fislBcUNMgAldL1/img.png&quot; data-alt=&quot;Any State&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJKExY/btrXoDNBY3C/6aOfyL8fislBcUNMgAldL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJKExY%2FbtrXoDNBY3C%2F6aOfyL8fislBcUNMgAldL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;177&quot; height=&quot;126&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Any State&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Any State는 이름 그대로 어떤 상태에 있었더라도(가령, 달리기..가만히 서있기 등등) 화살표 조건을 만족하면 해당 상태로 변환하게 됩니다.&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;553&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caWijV/btrXqry9ARh/bCs7dNhDnnplCKKBjkKXpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caWijV/btrXqry9ARh/bCs7dNhDnnplCKKBjkKXpk/img.png&quot; data-alt=&quot;Dead 트리거를 conditions으로 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caWijV/btrXqry9ARh/bCs7dNhDnnplCKKBjkKXpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaWijV%2FbtrXqry9ARh%2FbCs7dNhDnnplCKKBjkKXpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;598&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dead 트리거를 conditions으로 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 같은 경우엔, Dead 파라미터가 켜진다면 죽은것으로 판단하고AnyState-&amp;gt;Dead로 움직이게 설정하였습니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;스크립트에서 사용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 위 파라미터는 스크립트에서&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;Animator _anim = GetComponent&amp;lt;Animator&amp;gt;();
//변수 이름_(anim)은 임의로 지정했음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 애니메이터 컴포넌트를 얻은 뒤,&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;_anim.SetFloat(&quot;Speed&quot;,_inputVec.magnitude);
//파라미터이름,값&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 방식으로 조정할 수 있습니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 animation</category>
      <category>유니티 animatorcontroller</category>
      <category>유니티 statemachine</category>
      <category>유니티 스테이트머신</category>
      <category>유니티 애니메이션</category>
      <category>유니티 애니메이션컨트롤러</category>
      <category>유니티 애니메이터</category>
      <category>유니티 애니메이터컨트롤러</category>
      <category>유니티 전이</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/122</guid>
      <comments>https://igh01ti.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 28 Jan 2023 19:28:38 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Input System을 스크립트에서 사용하는법</title>
      <link>https://igh01ti.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://igh01ti.tistory.com/120&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 포스트&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;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Behavior&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5EpNv/btrW57HK76t/Nhi20MK4vLX2KXa2JFByIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5EpNv/btrW57HK76t/Nhi20MK4vLX2KXa2JFByIk/img.png&quot; data-alt=&quot;로직 제어용 스크립트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5EpNv/btrW57HK76t/Nhi20MK4vLX2KXa2JFByIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5EpNv%2FbtrW57HK76t%2FNhi20MK4vLX2KXa2JFByIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;98&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로직 제어용 스크립트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ymfd0/btrW2txKQ4Z/t31YLrl52PEKcov4RQttt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ymfd0/btrW2txKQ4Z/t31YLrl52PEKcov4RQttt0/img.png&quot; data-alt=&quot;Player Input의 Behavior&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ymfd0/btrW2txKQ4Z/t31YLrl52PEKcov4RQttt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYmfd0%2FbtrW2txKQ4Z%2Ft31YLrl52PEKcov4RQttt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;267&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player Input의 Behavior&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 게임 오브젝트에 키 입력값을 전달받고 로직을 제어할 스크립트를 붙여줬습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Behavior란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;:입력이 들어왔을 때, 해당 내용을 전달해주는 방법을 고르는 부분&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- Send Messages, Broadcast Messages :&lt;/b&gt; 유니티의 Send Message 기능을 사용하여 특정 함수를 호출하는 방법&lt;br /&gt;&lt;b&gt;- Invoke Unity Events, Invoke C Sharp Events :&lt;/b&gt; 유니티나 C#의 이벤트 기능을 사용하는 방법&lt;br /&gt;&lt;br /&gt;위 방법을 스크립트에서 사용하기 위해선&lt;br /&gt;&lt;b&gt;using UnityEngine.InputSystem;&lt;/b&gt;&lt;br /&gt;위와 같은 네임스페이스 적용이 필요함.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Message를 선택했을 때&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 키가 입력을 인식하면, 특정 함수를 자동으로 호출하는 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Broadcast Messages&lt;/b&gt;의 경우, &lt;b&gt;하위 계층에 있는 오브젝트들까지 제어&lt;/b&gt;를 할 수 있음&lt;/li&gt;
&lt;li&gt;함수명이 &lt;b&gt;&quot;On + Actions name&quot;&lt;/b&gt; 으로 구성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BvIRS/btrW1PnkI0U/g8C3zaKFzgCW8AODTpfoeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BvIRS/btrW1PnkI0U/g8C3zaKFzgCW8AODTpfoeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BvIRS/btrW1PnkI0U/g8C3zaKFzgCW8AODTpfoeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBvIRS%2FbtrW1PnkI0U%2Fg8C3zaKFzgCW8AODTpfoeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;295&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 &quot;Move&quot; Actions 하나만 설정 해놨는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Actions에서 받는 키를 입력하게 되면,&amp;nbsp; &lt;b&gt;On + Actions name 이름인 함수를 자동으로 호출&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674586623493&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void OnMove(InputValue value)
{
	Vector2 input=value.Get&amp;lt;Vector2&amp;gt;();
    //&quot;Move&quot; Actions에 해당하는 키 리턴은 'Vector2'로 받도록 설정해놨기 때문
    if(input!=null)
    {
    }
}
//&quot;Move&quot; Actions에 해당하는 키 입력 시 자동으로 호출됨.
/*
저 같은 경우 w,a,s,d,화살표를 Move 액션에 입력키로 설정해놨기때문에
해당 키들이 눌린다면 위 OnMove가 호출됩니다.
*/



//만약에 Action Type을 &quot;Button&quot;으로 설정한 &quot;Jump&quot; Actions도 추가했었다 하면
vod OnJump()
{
}
//Action Type이 &quot;Button&quot;인 경우에는 따로 매개변수가 없습니다.&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Invoke Unity Events 기능 사용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity의 Event방식 사용&lt;/li&gt;
&lt;li&gt;해당 Actions에 대한 키 입력이 들어오면, 설정한 이벤트 함수를 호출해 줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVnlu/btrXnJNRGQO/KAqVtmoaODYgxeRkfSVtY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVnlu/btrXnJNRGQO/KAqVtmoaODYgxeRkfSVtY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVnlu/btrXnJNRGQO/KAqVtmoaODYgxeRkfSVtY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVnlu%2FbtrXnJNRGQO%2FKAqVtmoaODYgxeRkfSVtY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;307&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674827717473&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void OnMove(InputAction.CallbackContext context)
{
	Vector2 input = context.ReadValue&amp;lt;Vector2&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스펙터창에서 함수를 지정해주기 위해선 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드시 함수의 접근지정자를 public&lt;/b&gt;&lt;/span&gt;으로 해줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(C#스크립트를 바로 끌어다 놓는것이 아닌, 하이레키창에 있는 오브젝트를 드래그해서 찾아야함)&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 broadcast message</category>
      <category>유니티 invoke</category>
      <category>유니티 invoke unity events</category>
      <category>유니티 sendmessae</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/121</guid>
      <comments>https://igh01ti.tistory.com/121#entry121comment</comments>
      <pubDate>Wed, 25 Jan 2023 03:31:17 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Input받는 방법 (Input System 이용)</title>
      <link>https://igh01ti.tistory.com/120</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;기존 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1674573958320&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    [SerializeField] Vector2 _inputVec;
    
    void Update()
    {
        _inputVec.x = Input.GetAxisRaw(&quot;Horizontal&quot;);
        _inputVec.y = Input.GetAxisRaw(&quot;Vertical&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUnCPx/btrWX5YtFrx/LJXqVC2lOny1Ouo8u5jkR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUnCPx/btrWX5YtFrx/LJXqVC2lOny1Ouo8u5jkR0/img.png&quot; data-alt=&quot;Project Settings-Input Manager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUnCPx/btrWX5YtFrx/LJXqVC2lOny1Ouo8u5jkR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUnCPx%2FbtrWX5YtFrx%2FLJXqVC2lOny1Ouo8u5jkR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;476&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Project Settings-Input Manager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QCZYc/btrWWsNbh5k/a63exq18FbjZuRKk7RQKX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QCZYc/btrWWsNbh5k/a63exq18FbjZuRKk7RQKX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QCZYc/btrWWsNbh5k/a63exq18FbjZuRKk7RQKX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQCZYc%2FbtrWWsNbh5k%2Fa63exq18FbjZuRKk7RQKX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;436&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project Settings-Input Manager를 보면 Horizontal, Vertical...등등 각 이름에 대한 버튼 할당과 type이나 axis등에 대한 정보도 설정해줄 수 있습니다. 이를 코드를 통해서 이용하는 것이구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 vr, 엑박컨트롤러, 플스컨트롤러등등... 다양한 컨트롤러에 대응하기에 위 방법은 수고스러운 면이 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Input System을 사용하게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Input System&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-style=&quot;style3&quot;&gt;다양한 플랫폼에서 빠르게 컨트롤 설정 가능&lt;/li&gt;
&lt;li data-ke-style=&quot;style3&quot;&gt;하나의 코드를 통해 다양한 플랫폼의 입력 환경을 지원할 수 있는 것이 특징&lt;/li&gt;
&lt;li data-ke-style=&quot;style3&quot;&gt;Package Manager에서 Input System을 설치하여 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;1)패키지 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0L6Rh/btrW4EsehRI/8alINxv047Hb30h9ksYW3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0L6Rh/btrW4EsehRI/8alINxv047Hb30h9ksYW3k/img.png&quot; data-alt=&quot;Window-Package Manager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0L6Rh/btrW4EsehRI/8alINxv047Hb30h9ksYW3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0L6Rh%2FbtrW4EsehRI%2F8alINxv047Hb30h9ksYW3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;563&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Window-Package Manager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Package Manager에서 Unity Registry로 설정해줍니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2RLVQ/btrW37OI7Zd/pQtyEEq7Kqh5PXF7AqgKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2RLVQ/btrW37OI7Zd/pQtyEEq7Kqh5PXF7AqgKsK/img.png&quot; data-alt=&quot;Input System 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2RLVQ/btrW37OI7Zd/pQtyEEq7Kqh5PXF7AqgKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2RLVQ%2FbtrW37OI7Zd%2FpQtyEEq7Kqh5PXF7AqgKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;567&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Input System 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input System을 Install해줍니다.&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;2) 설치 확인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wzKqf/btrW76aGK49/nPtJojOFPvqk6DiBi09cKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wzKqf/btrW76aGK49/nPtJojOFPvqk6DiBi09cKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wzKqf/btrW76aGK49/nPtJojOFPvqk6DiBi09cKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwzKqf%2FbtrW76aGK49%2FnPtJojOFPvqk6DiBi09cKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;470&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project Settings-Player-Active Input Handling이 Input Manager(Old)가 아니면 적용이 되어 있는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwI9Oe/btrWVKHggkM/Ghw58QTAg0XJDLky4TpUVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwI9Oe/btrWVKHggkM/Ghw58QTAg0XJDLky4TpUVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwI9Oe/btrWVKHggkM/Ghw58QTAg0XJDLky4TpUVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwI9Oe%2FbtrWVKHggkM%2FGhw58QTAg0XJDLky4TpUVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;405&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저의 In Project에 Input System이 잘 들어가 있는지도 확인해줍니다.&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;3)Input Actions 파일 생성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input Actions파일은 어떤 키를 누르면, 어떤 기능이 작동되어야한다.&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;857&quot; data-origin-height=&quot;1111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eraPXn/btrWUGrBLm7/i5FgUMDJm1Tgvn48VMNOA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eraPXn/btrWUGrBLm7/i5FgUMDJm1Tgvn48VMNOA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eraPXn/btrWUGrBLm7/i5FgUMDJm1Tgvn48VMNOA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeraPXn%2FbtrWUGrBLm7%2Fi5FgUMDJm1Tgvn48VMNOA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;1111&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;1111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project창에서 Input Actions를 생성해줍니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oKSdn/btrW4FSdQYc/WjIdIPmYNlTk2VDLhPeKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oKSdn/btrW4FSdQYc/WjIdIPmYNlTk2VDLhPeKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oKSdn/btrW4FSdQYc/WjIdIPmYNlTk2VDLhPeKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoKSdn%2FbtrW4FSdQYc%2FWjIdIPmYNlTk2VDLhPeKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1023&quot; height=&quot;574&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 No Control Schemas상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Control Schemas란 어떤 플랫폼에서 input을 어떤 설정으로 사용하겠다는 내용을 미리 저장해 놓는 것을 말합니다.&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;&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;334&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBSKom/btrWZXslFjU/okqrsPTqRBzDHCvrs2KpWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBSKom/btrWZXslFjU/okqrsPTqRBzDHCvrs2KpWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBSKom/btrWZXslFjU/okqrsPTqRBzDHCvrs2KpWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBSKom%2FbtrWZXslFjU%2FokqrsPTqRBzDHCvrs2KpWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;334&quot; height=&quot;134&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbD2cs/btrW76oeV76/Y7JcKiKiKN3eIhaz3cVX5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbD2cs/btrW76oeV76/Y7JcKiKiKN3eIhaz3cVX5K/img.png&quot; data-alt=&quot;PC에 해당하는 요소들 추가(키보드,마우스)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbD2cs/btrW76oeV76/Y7JcKiKiKN3eIhaz3cVX5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbD2cs%2FbtrW76oeV76%2FY7JcKiKiKN3eIhaz3cVX5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;202&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC에 해당하는 요소들 추가(키보드,마우스)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 PC라는 이름의 스키마를 만들고 PC에선 키보드,마우스를 사용할 것이기때문에 2개를 추가해줬습니다.&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;305&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDPK0a/btrWUdwaN7Y/qYyyMSNfpHJbTKOkhdwFvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDPK0a/btrWUdwaN7Y/qYyyMSNfpHJbTKOkhdwFvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDPK0a/btrWUdwaN7Y/qYyyMSNfpHJbTKOkhdwFvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDPK0a%2FbtrWUdwaN7Y%2FqYyyMSNfpHJbTKOkhdwFvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;197&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 예를들어서 VR도 게임에서 활용하고자 한다면, 그에 맞는 input설정이 필요하겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 빈 깡통형식으로 VR스키마를 하나 만들어주겠습니다.&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;252&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cABLEn/btrWWsfjERn/WIH8hEnLvSj6Vm8BddD2X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cABLEn/btrWWsfjERn/WIH8hEnLvSj6Vm8BddD2X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cABLEn/btrWWsfjERn/WIH8hEnLvSj6Vm8BddD2X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcABLEn%2FbtrWWsfjERn%2FWIH8hEnLvSj6Vm8BddD2X0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;116&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Input System을 그대로 썼다면, 빌드할때 플랫폼따라서 코드를 수정한다던지 등등 신경쓸게 많았겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;이 방식으로 하면 이 부분만 바꿔서 빌드해주면 되기때문에 간단&lt;/b&gt;&lt;/u&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;4) Action Maps 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐릭터, 몬스터, UI 등 다른 곳에 사용할 키들을 맵으로 각각 묶어서 저장할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKzsQO/btrWZWGWNtw/CYKdvH5xrm4PX5SVjAGXh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKzsQO/btrWZWGWNtw/CYKdvH5xrm4PX5SVjAGXh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKzsQO/btrWZWGWNtw/CYKdvH5xrm4PX5SVjAGXh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKzsQO%2FbtrWZWGWNtw%2FCYKdvH5xrm4PX5SVjAGXh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;221&quot; height=&quot;59&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 PC플랫폼에서 플레이어캐릭터에게 사용할 키 맵을 만들 것이기 때문에, &quot;Player&quot;란 이름으로 생성했습니다.&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;5) Actions 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Actions는 어떤 행위에 사용될 키 입력을 받을 것인지에 대한 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN6XFw/btrWS2hpSdm/M6U88ktL2Jzfylap4PHJ51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN6XFw/btrWS2hpSdm/M6U88ktL2Jzfylap4PHJ51/img.png&quot; data-alt=&quot;Move 액션 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN6XFw/btrWS2hpSdm/M6U88ktL2Jzfylap4PHJ51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN6XFw%2FbtrWS2hpSdm%2FM6U88ktL2Jzfylap4PHJ51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;275&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Move 액션 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동에 관한 내용을 생성하기위헤 &quot;Move&quot;라고 설정하였습니다.(이름은 자유)&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b27W1W/btrW2uKcnH8/yVRmzOaWTWmBPJH5iqOhtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b27W1W/btrW2uKcnH8/yVRmzOaWTWmBPJH5iqOhtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b27W1W/btrW2uKcnH8/yVRmzOaWTWmBPJH5iqOhtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb27W1W%2FbtrW2uKcnH8%2FyVRmzOaWTWmBPJH5iqOhtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;267&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위에 있는 &amp;lt;No Binding&amp;gt;은 일단 지워줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1008&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F78xI/btrWYLMuhzs/TOkeOdgFk6t94gSPjKXur0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F78xI/btrWYLMuhzs/TOkeOdgFk6t94gSPjKXur0/img.png&quot; data-alt=&quot;Action Type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F78xI/btrWYLMuhzs/TOkeOdgFk6t94gSPjKXur0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF78xI%2FbtrWYLMuhzs%2FTOkeOdgFk6t94gSPjKXur0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;252&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Action Type&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Action Type이란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Value&lt;/b&gt; &lt;b&gt;:&lt;/b&gt; 입력 들어온 값에 따라 결정 ('+' 값이 들어오면 오른쪽, '-'값이 들어오면 왼쪽 같은 방식)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Button :&lt;/b&gt; 버튼이 눌렸는지, 안 눌렸는지에 따라 입력 여부 결정(점프)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pass Through :&lt;/b&gt; Value와 비슷하지만 약간의 차이(&lt;a href=&quot;https://www.youtube.com/watch?v=DMUZfVSYJfs&amp;amp;ab_channel=samyam&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;영상 링크&lt;/a&gt;). 대부분 Value를 쓰면 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BqwwN/btrWXiDLjrb/7ZkoHLCXcCdvcirKTaTdq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BqwwN/btrWXiDLjrb/7ZkoHLCXcCdvcirKTaTdq1/img.png&quot; data-alt=&quot;Control Type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BqwwN/btrWXiDLjrb/7ZkoHLCXcCdvcirKTaTdq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBqwwN%2FbtrWXiDLjrb%2F7ZkoHLCXcCdvcirKTaTdq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;513&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Control Type&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Control Type은 해당 키가 눌렸을 때, 스크립트에서 어떤 자료형 타입으로 리턴받아 사용할 지 정하는 옵션입니다.&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;WASD&lt;/b&gt; 또는 &lt;b&gt;&amp;uarr;&amp;larr;&amp;rarr;&amp;darr;&lt;/b&gt;을 사용한다고 가정하고 키 바인딩을 4개 하도록 하겠습니다.&lt;/p&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;697&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdNQgt/btrW7UuA9dz/54UdjjLfOalgipz6vLtSu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdNQgt/btrW7UuA9dz/54UdjjLfOalgipz6vLtSu1/img.png&quot; data-alt=&quot;Add Up\Down\Left\Right Composite 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdNQgt/btrW7UuA9dz/54UdjjLfOalgipz6vLtSu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdNQgt%2FbtrW7UuA9dz%2F54UdjjLfOalgipz6vLtSu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;201&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add Up\Down\Left\Right Composite 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N5YZs/btrWZXlAvth/zZZd8003S1Pi4PiE5WiV7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N5YZs/btrWZXlAvth/zZZd8003S1Pi4PiE5WiV7K/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N5YZs/btrWZXlAvth/zZZd8003S1Pi4PiE5WiV7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN5YZs%2FbtrWZXlAvth%2FzZZd8003S1Pi4PiE5WiV7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;199&quot; height=&quot;148&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;148&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;No Binding은 아직 키 설정을 안해줬다는 뜻입니다.&lt;/p&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;72&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EcYeV/btrWX30G0Kj/REPoTP4YTTfhHBkkdHzLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EcYeV/btrWX30G0Kj/REPoTP4YTTfhHBkkdHzLDK/img.png&quot; data-alt=&quot;2D Vector-&amp;amp;gt;WASD로 이름 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EcYeV/btrWX30G0Kj/REPoTP4YTTfhHBkkdHzLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEcYeV%2FbtrWX30G0Kj%2FREPoTP4YTTfhHBkkdHzLDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;72&quot; height=&quot;61&quot; data-origin-width=&quot;72&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2D Vector-&amp;gt;WASD로 이름 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이름을 각각 W,A,S,D로 설정해주고 관련 설정을 적용해주겠습니다.&lt;/p&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;810&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7AfGr/btrWS3ABFij/A1v8uaA6NwdtpeswVgxA01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7AfGr/btrWS3ABFij/A1v8uaA6NwdtpeswVgxA01/img.png&quot; data-alt=&quot;w 검색해서 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7AfGr/btrWS3ABFij/A1v8uaA6NwdtpeswVgxA01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7AfGr%2FbtrWS3ABFij%2FA1v8uaA6NwdtpeswVgxA01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;371&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;w 검색해서 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSVrPu/btrWTK17fNY/cjROcNrI44xmKbchAzrirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSVrPu/btrWTK17fNY/cjROcNrI44xmKbchAzrirk/img.png&quot; data-alt=&quot;최종 완성된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSVrPu/btrWTK17fNY/cjROcNrI44xmKbchAzrirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSVrPu%2FbtrWTK17fNY%2FcjROcNrI44xmKbchAzrirk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;297&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;297&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;6. 적용할 게임 오브젝트에 Player Input 컴포넌트 추가&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKIvIz/btrW0PukYDL/AwlKtbUUgkQHJNbKvqpjE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKIvIz/btrW0PukYDL/AwlKtbUUgkQHJNbKvqpjE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKIvIz/btrW0PukYDL/AwlKtbUUgkQHJNbKvqpjE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKIvIz%2FbtrW0PukYDL%2FAwlKtbUUgkQHJNbKvqpjE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;975&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xck1H/btrW6puR9Fu/W7ZAti7zQk9admbVcztvsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xck1H/btrW6puR9Fu/W7ZAti7zQk9admbVcztvsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xck1H/btrW6puR9Fu/W7ZAti7zQk9admbVcztvsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxck1H%2FbtrW6puR9Fu%2FW7ZAti7zQk9admbVcztvsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;225&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Player Input컴포넌트를 추가한 후, 미리 만들어두었던 Input Actions파일을 설정해줍니다.&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;422&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zbZpY/btrWXjQee8O/r5YQ5aWQYTuKiFJGdoxDzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zbZpY/btrWXjQee8O/r5YQ5aWQYTuKiFJGdoxDzk/img.png&quot; data-alt=&quot;Default Schema&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zbZpY/btrWXjQee8O/r5YQ5aWQYTuKiFJGdoxDzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzbZpY%2FbtrWXjQee8O%2Fr5YQ5aWQYTuKiFJGdoxDzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;227&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default Schema&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default Schema는 빌드할 때, 타겟 플랫폼에 맞게 설정해 주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Any로 해놓으면 알아서 설정되긴 합니다.&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;421&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IfdvM/btrWU7CxzTu/uBlJv3Y0W4aJnem4tyVwek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IfdvM/btrWU7CxzTu/uBlJv3Y0W4aJnem4tyVwek/img.png&quot; data-alt=&quot;Default Map&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IfdvM/btrWU7CxzTu/uBlJv3Y0W4aJnem4tyVwek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIfdvM%2FbtrWU7CxzTu%2FuBlJv3Y0W4aJnem4tyVwek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;226&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default Map&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default Map은 현재 Player Input 컴포넌트가 부착된 오브젝트가 제 경우엔 플레이어캐릭터이므로, 아까 생성했던 &quot;Player&quot; Map을 선택해줬습니다.&lt;/p&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;&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;gt;(&lt;a href=&quot;https://igh01ti.tistory.com/121&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다음 포스트 링크&lt;/a&gt;)&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 input</category>
      <category>유니티 마우스</category>
      <category>유니티 입력</category>
      <category>유니티 입력받기</category>
      <category>유니티 키보드</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/120</guid>
      <comments>https://igh01ti.tistory.com/120#entry120comment</comments>
      <pubDate>Wed, 25 Jan 2023 00:50:27 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Awake와 Start차이</title>
      <link>https://igh01ti.tistory.com/119</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baBCwa/btrWXjWR1R3/ypGwIOkJRSpu8TU7Zptrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baBCwa/btrWXjWR1R3/ypGwIOkJRSpu8TU7Zptrf0/img.png&quot; data-alt=&quot;https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baBCwa/btrWXjWR1R3/ypGwIOkJRSpu8TU7Zptrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaBCwa%2FbtrWXjWR1R3%2FypGwIOkJRSpu8TU7Zptrf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1058&quot; height=&quot;214&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티의 &lt;a href=&quot;https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이벤트 함수 실행순서&lt;/a&gt;를 살펴보면 Awake가 먼저 실행되고 Start가 실행됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Awake&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Awake는 Start보다 무조건 먼저 실행됩니다.&lt;/li&gt;
&lt;li&gt;프리팹이 인스턴스화 된 직후에 호출됩니다. 오브젝트가 비활성화되어 있다면 awake 함수는 호출되지 않다가 오브젝트가 활성되는 순간 호출됩니다. 그 후 오브젝트를 비활성화(Deactive) -&amp;gt; 활성화(Active) 해도 다시 호출되지 않습니다. 최초 1회만 호출됩니다.&lt;/li&gt;
&lt;li&gt;보통 변수등의 초기화, 스크립트간 참조(reference)를 Awake에서 해줍니다.&lt;/li&gt;
&lt;li&gt;Awake 만 있는 스크립트에 경우 스크립트 활성화(Enable) 버튼이 뜨지 않습니다. OnEnable, Start 같은 함수가 있어 스크립트가 비활성화(Disable) 해 놓았더라도 Awake 함수는 호출됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[주의할 점]:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;각 게임 오브젝트의 Awake()의 호출 순서는 랜덤이기 때문에, 스크립트간의 참조(reference) 설정을 위해서만 Awake를 사용하고, 그걸 이용해서 정보를 주고 받을 때는 Start를 사용해야 합니다.(Start 과정에서는 이미 모든 오브젝트들의 Awake가 끝났기 떄문에)&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Start&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Start는 Awake보다 늦게 실행됩니다.&lt;/li&gt;
&lt;li&gt;스크립트 인스턴스가 활성화된 경우에 호출합니다. 즉 게임 오브젝트 + 스크립트 모두 활성화되어있을 때 최초 1회의 한정하여 호출합니다. 호출 시기는 첫 번째 프레임 업데이트 전입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;gameObject.SetActive(false)와 this.enabled=false 차이 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;a href=&quot;https://blog.naver.com/1mi2/220928872232&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr2ws8/btrWWsM7EnY/ITEjaveP0s0u9ESuMbg6N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr2ws8/btrWWsM7EnY/ITEjaveP0s0u9ESuMbg6N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr2ws8/btrWWsM7EnY/ITEjaveP0s0u9ESuMbg6N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr2ws8%2FbtrWWsM7EnY%2FITEjaveP0s0u9ESuMbg6N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;232&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번은 gameObject.SetActive(false)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번은 this.enabled=false&lt;/p&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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1의 체크가 해제된 상태(=gameObject.SetActive(false))일때&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A) 게임오브젝트를 비활성화한 상태로 게임을 시작하면, 또는&lt;br /&gt;B) 프리팹 설정에서 1번 체크박스를 꺼놓은 프리팹을 게임 중에 Instantiate(prefab) 으로 생성할 경우&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Awake도, Start도, OnEnable도 모두 호출되지 않습니다.&lt;br /&gt;&lt;br /&gt;만약 이걸 다시 체크하게 된다면, Awake,&lt;u&gt;&lt;b&gt;OnEnable,&lt;/b&gt;&lt;/u&gt;Start가 실행될 것입니다.&lt;/b&gt;&lt;/u&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;2의 체크만 해제된 상태(=this.enabled=false)일때&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;위 사진의 1번 체크박스는 켜져있지만 2번 체크박스는 꺼진 상태를 의미합니다.&lt;br /&gt;게임 오브젝트는 활성화되어 있기때문에 &lt;u&gt;&lt;b&gt;Awake는 호출되지만,&lt;u&gt;&lt;b&gt;Start()와&lt;/b&gt;&lt;/u&gt; OnEnable()는 호출되지 않습니다.&lt;/b&gt;&lt;/u&gt;&amp;nbsp;&lt;br /&gt;이 두 함수는 컴포넌트의 활성화 여부에 따라 호출됩니다.&lt;br /&gt;게임이 돌아가는 도중에 체크박스를 켜거나 GetComponent&amp;lt;Component&amp;gt;().enabled = true 설정을 하면, 그 이후 OnEnable과 Start가 호출되게 됩니다.&lt;/blockquote&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;</description>
      <category>유니티</category>
      <category>유니티 awake</category>
      <category>유니티 enabled</category>
      <category>유니티 setactive</category>
      <category>유니티 start</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/119</guid>
      <comments>https://igh01ti.tistory.com/119#entry119comment</comments>
      <pubDate>Tue, 24 Jan 2023 21:44:12 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 오브젝트를 이동시키는 방법들</title>
      <link>https://igh01ti.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 이동(위치 변경)을 위해서 사용하는 방법은 아래와 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;transform.Translate()&lt;br /&gt;&lt;br /&gt;transform.position에 직접 값을 입력해주는 방법&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rigidbody.MovePosition()&lt;br /&gt;&lt;br /&gt;Rigidbody.position에 직접 값을 입력해주는 방법&lt;br /&gt;&lt;br /&gt;Rigidbody.AddForce()&lt;br /&gt;&lt;br /&gt;Rigidbody.AddRelativeForce()&lt;br /&gt;&lt;br /&gt;Rigidbody.velocity&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Transform.Translate()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674327132805&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//transform.Translate(new Vector3(float, float, float));

void Update () 
    {
        // 게임 오브젝트 기준으로 이동
        transform.Translate(Vector3.right * Time.deltaTime);

        // 월드 좌표 기준으로 이동
        transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
    }&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;&lt;u&gt;&lt;b&gt;물리작용이 필요없는(rigid body가 없는) 오브젝트에서 사용&lt;/b&gt;&lt;/u&gt;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;transform.position에 직접 입력&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674327601837&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;transform.position=new Vector3(x,y,z);
//해당 위치로 이동합니다. (거리가 매우 가까운게 아니라면, 텔레포트같은 느낌)&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_1674327650412&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;transform.localPosition=new Vector3(x,y,z);
//localPosition은 상대좌표를 나타냄. 게임오브젝트의 부모가 있을 경우 부모로부터의 떨어진 좌표를 의미&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_1674327705683&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Transform target;
float speed=10f;

void FixedUpdate()
{
	Vector3 a= transform.position;
	Vector3 b= target.position;
	transform.position=Vector3.Lerp(a,b,speed);
    //이런식으로 Lerp를 이용해서 부드럽게? 이동 구현 가능
}&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_1674328210683&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public Transform Target;
public float Speed = 1.0f;

void Update()
{
	transform.position = Vector3.MoveTowards(transform.position, Target.position, Speed * Time.deltaTime);
    //현재위치, 목표위치, 속도   를 인자로 넘겨주면 현재 위치에서 목표 위치로 일정한 속도로 움직임
}&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;u&gt;&lt;b&gt;rigidbody가 있는 오브젝트라면 transform.position은 지양&lt;/b&gt;&lt;/u&gt;하는것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 사용하면 모든 콜라이더들이 rigidbody와의 상대적 위치를 재계산하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황에따라서 RigidBody.position이나 RigidBody.MovePosition()을 사용합시다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Rigidbody.MovePosition()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674328451462&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//rb는 리지드바디 컴포넌트를 의미

rb.MovePosition(new Vector3 (x,y,z));
//target지점의 position으로 RigidBody를 이동시킴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rigidbody.MovePosition에는 interpolation옵션이 있기 때문에 Rigidbody가 있는 오브젝트의 경우 Rigidbody.MovePosition을 사용한 움직임을 구현하는것이 좋습니다. (Rigidybody.position은 interpolation은 없는듯..? &lt;a href=&quot;https://docs.unity3d.com/ScriptReference/Rigidbody-position.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;) (&lt;a href=&quot;http://egloos.zum.com/metashower/v/9660975&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Rigidbody의 interpolation링크,&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;transform.position을 이용하는 방법과의 차이점은, &lt;u&gt;&lt;b&gt;transform.position을 설정하는 것은 &quot;텔레프트&quot;의 개념&lt;/b&gt;&lt;/u&gt;입니다. 매우 작은거리를 계속 텔레포트 시킨다면 눈으로 보기에는 Rigidbody.MovePosition과 유사해 보입니다. 그러나 transform.position을 이용한다면, 이전 위치와 새 위치 사이에 있는 다른 오브젝트는 이동의 영향을 받지 않습니다. 또한 목표 위치에 있는 콜라이더는 다음 업데이트 시 이동한 리지드바디와 즉시 물리반응을 하게 됩니다.&lt;/p&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;u&gt;&lt;b&gt;rigidbody.MovePosition()을 사용하면 유니티가 이전 위치와 새 위치 사이의 직선 경로를 추적하고 업데이트 간에 해당 경로를 따라 빠르게 이동한 것처럼 처리&lt;/b&gt;&lt;/u&gt;합니다. 즉, 이전 경로와 새로운 경로 사이에 어떤 물리작용을 하는 물체가 존재한다면 물리 작용이 일어나게 됩니다.(transform.position의 경우 아무일도 안일어남)&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpaoC/btrWRCvsdY3/RVmgqMLMs8ZMnepc9KAfb0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpaoC/btrWRCvsdY3/RVmgqMLMs8ZMnepc9KAfb0/img.gif&quot; data-alt=&quot;rigidbody 2D일때 중력,공기저항 비정상!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpaoC/btrWRCvsdY3/RVmgqMLMs8ZMnepc9KAfb0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bzpaoC/btrWRCvsdY3/RVmgqMLMs8ZMnepc9KAfb0/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;235&quot; height=&quot;246&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rigidbody 2D일때 중력,공기저항 비정상!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, rigidbody컴포넌트를 지닌 오브젝트는 왠만하면 이 함수를 이용하면 되는데, 문제점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;rigidbody 2D일 경우에는 Rigidbody2D.MovePosition을 통한 이동이 중력이나 선형 공기저항에는 영향을 받지 않습니다.(&lt;a href=&quot;https://docs.unity3d.com/ScriptReference/Rigidbody2D.MovePosition.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;). &lt;/b&gt;&lt;/span&gt;2D일 경우에는 MovePosition+중력을 적용해주기 위한 코드를 추가해주던지 다른 방법(rigidbody.velocity를 이용...)을 사용해야 겠습니다. 3d일 경우에는 정상이기때문에 사용하셔도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위 문제는 rigidbody2d.moveposition은 위치를 고정시키려하는데 rigidbody2d.gravityscale은 당기려 하기 때문에, 이 과정에서 중력이 이겨서 천천히 중력의 방향대로 끌려가는것 같습니다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Rigidbody.position&lt;/b&gt;&lt;/span&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;rigid body컴포넌트를 지닌 물체를 텔레포트할때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transform.position을 사용하여 텔레포트를 구현하면 모든 콜라이더들이 rigidbody와의 상대적인 위치를 재계산하기 때문에 성능적으로 이걸 사용하는것이 이득입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉 움직이는 물체는 rigidbody컴포넌트를 달아주고 그것을 활용하여 움직여주는게 성능적으로 이득이라는 것이겠죠?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 지속적인 움직임(캐릭터 이동등..)을 위해서는 interpolation이 적용되는 Rigidbody.MovePosition()을 사용하는 것이 좋다고 합니다.&lt;/p&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://docs.unity3d.com/ScriptReference/Rigidbody-position.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Rigidbody.AddForce()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674332637212&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rigidbody.AddForce(new Vector3(x,y,z), ForceMode mode=ForceMode.Force);
//AddForce(방향*힘,힘의 종류)&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 힘의종류, 즉 &lt;u&gt;&lt;b&gt;파라미터로 넣어주는 ForceMode는 어떤 식으로 힘을 전달할 것인가를 결정&lt;/b&gt;&lt;/u&gt;해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caUYfM/btrWQ379mjg/SwIMQIFe3cpG2SO3A5vCgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caUYfM/btrWQ379mjg/SwIMQIFe3cpG2SO3A5vCgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caUYfM/btrWQ379mjg/SwIMQIFe3cpG2SO3A5vCgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaUYfM%2FbtrWQ379mjg%2FSwIMQIFe3cpG2SO3A5vCgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;191&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질량을 고려한다면, F=ma 공식이 적용되어서 질량에따른 가속도가 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Force: 연속적인 힘+ 질량을 고려함 (일반적인 물리 현상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Acceleration: 연속적인 힘, 질량을 무시함 (질량에 관계없이 가속을 주고 싶다면 이용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Impulse: 불연속적인 힘+ 질량 고려함 (짧은 순간의 힘, 충돌이나 폭발과 같은 것에 쓰임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VelocityChange: 불연속적인 힘+ 질량 무시함 (질량을 무시해야하고 짧은 순간의 힘을 구현할떄)&lt;/p&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;이때, AddForce의 힘의 방향은 Global Coordinate입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Rigidbody.AddRelativeForce()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1674333193709&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rigidbody.AddRelativeForce(new Vector3(x,y,z), ForceMode mode=ForceMode.Force);
//AddRelativeForce(방향*힘,힘의 종류)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rigidbody.AddForce는 Global coordinate가 기준이기 때문에 &lt;u&gt;&lt;b&gt;Local Coordinate를 기준으로 힘을 주고 싶을 때 사용&lt;/b&gt;&lt;/u&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;극단적인 예로, 차같은 경우 좌회전을 하는데 global인 경우 좌회전하기 전에는 w가 분명 직진인데 그 후에는 오른쪽이 됩니다. 이런 것을 해결해 주기 위해서 사용합니다.&lt;/p&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;u&gt;&lt;b&gt;AddForce로도 해당 오브젝트의 로컬 좌표로 힘을 가해줄 수 있는데&lt;/b&gt;&lt;/u&gt;,&lt;/p&gt;
&lt;pre id=&quot;code_1674333398805&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rigidbody.AddForce(transform.forward)
//transform.forward를 사용하면 로컬좌표 기준 앞 방향을 world coordinate로 변환해서 알려줌&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 구현해도 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Rigidbody.velocity&lt;/b&gt;&lt;/span&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;rigidbody에 질량과 상관없이&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;일반적인 사용법은 1인칭 fps게임에서 점프할 때 속도를 변경하는 것인데, 이는 즉각적인 속도 변화를 원하기 때문이라고 합니다.&lt;/p&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://docs.unity3d.com/kr/2022.1/ScriptReference/Rigidbody-velocity.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674333831024&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;Rigidbody-velocity - Unity 스크립팅 API&quot; data-og-description=&quot;The velocity vector of the rigidbody. It represents the rate of change of Rigidbody position.&quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/kr/2022.1/ScriptReference/Rigidbody-velocity.html&quot; data-og-url=&quot;https://docs.unity3d.com/kr/2022.1/ScriptReference/Rigidbody-velocity.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2022.1/ScriptReference/Rigidbody-velocity.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unity3d.com/kr/2022.1/ScriptReference/Rigidbody-velocity.html&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;Rigidbody-velocity - Unity 스크립팅 API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The velocity vector of the rigidbody. It represents the rate of change of Rigidbody position.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unity3d.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEWaZW/btrWWsZlBrX/J0aL9Re7ZbsxuVwS4b85pk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEWaZW/btrWWsZlBrX/J0aL9Re7ZbsxuVwS4b85pk/img.gif&quot; data-alt=&quot;rigidbody2d.velocity를 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEWaZW/btrWWsZlBrX/J0aL9Re7ZbsxuVwS4b85pk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bEWaZW/btrWWsZlBrX/J0aL9Re7ZbsxuVwS4b85pk/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;546&quot; height=&quot;272&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rigidbody2d.velocity를 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rigidbody2d의 경우 rigidbody2d.MovePosition은 중력적용이 이상하기 때문에, 중력을 고려한 점프가 필요한 경우엔 rigidbody2d.velocity를 사용해도 괜찮을 것 같습니다. rigidbody2d.AddFoce를 사용해도 괜찮을 것이구요.. (위 사진 출처:&lt;a href=&quot;https://medium.com/@qldrhqorhsh/unity-rigidbody2d-velocity-moveposition-4777ca2a9d20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 addforce</category>
      <category>유니티 addrelativeforce</category>
      <category>유니티 moveforward</category>
      <category>유니티 movePosition</category>
      <category>유니티 rigidbody</category>
      <category>유니티 Rigidbody.position</category>
      <category>유니티 transform.position</category>
      <category>유니티 velocity</category>
      <category>유니티 점프</category>
      <category>유니티2d 움직임</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/118</guid>
      <comments>https://igh01ti.tistory.com/118#entry118comment</comments>
      <pubDate>Sun, 22 Jan 2023 04:35:13 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Update(), FixedUpdate() 그리고 Physics Loop</title>
      <link>https://igh01ti.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rito15.github.io/posts/unity-fixed-update-and-physics-loop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Update()&lt;/b&gt;&lt;/span&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;유니티엔진에서 Update()는 매 프레임 호출됩니다.&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;DirectX, OpenGL, Vulkan..등 그래픽스 라이브러리를 사용한 게임엔진은 기본적으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Game Loop(게임 루프)를 통해서 프레임 기반 동작이 수행됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674303836563&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Main Function */

// Game Loop
while(...)
{
    // User Inputs..
    // Game Logics..
    // Draw Calls..
    // ...
}&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674303936735&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Unity Game Loop
while(...)
{
    // ...
    
    foreach(var m in monoBehavioursWhoHaveUpdateMethod)
    {
        m.Update();
    }
    
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 엔진은 Update()메소드가 존재하는 모든 MonoBehaviour를 찾아서 스크립팅 런타임이 내부적으로 저장해놓았다가 게임 루프에서 일괄적으로 순회하며 호출해주는 방식이라고 합니다.&lt;/p&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;그리고 많이들 Update()문에서 사용하는 Time.delTime은 게임 루프의 이전 수행과 현재 수행 간의 시간 간격을 저장한 값입니다. 이를 통해서 보정을 진행하죠 보통..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;FixedUpdate()&lt;/b&gt;&lt;/span&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;FixedUpdate()는 잘못 이해하고 계신분들이 많습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정해놓은 일정한 주기로 실행되고(기본값 0.02초) 물리를 위한 연산이기때문에 Update()와는 별개의 루프라고 생각할 수 있습니다. 하지만 이는 &lt;b&gt;&lt;u&gt;틀렸습니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티의 내부 동작 구조를 살펴봅시다.(&lt;a href=&quot;https://docs.unity3d.com/Manual/ExecutionOrder.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KTiUD/btrWS2Us1bH/K4Nv6XiqMknrZWKBsUb5I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KTiUD/btrWS2Us1bH/K4Nv6XiqMknrZWKBsUb5I1/img.png&quot; data-alt=&quot;빨간색=매 프레임 마다 실행되는 로직,즉 Game Loop&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KTiUD/btrWS2Us1bH/K4Nv6XiqMknrZWKBsUb5I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKTiUD%2FbtrWS2Us1bH%2FK4Nv6XiqMknrZWKBsUb5I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;719&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빨간색=매 프레임 마다 실행되는 로직,즉 Game Loop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl7mp2/btrWQud1T30/0UL6JBtdYTukjZJZOqkUrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl7mp2/btrWQud1T30/0UL6JBtdYTukjZJZOqkUrK/img.png&quot; data-alt=&quot;노란색=Game Loop속에 Physics Loop가 포함된것을 확인 가능.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl7mp2/btrWQud1T30/0UL6JBtdYTukjZJZOqkUrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl7mp2%2FbtrWQud1T30%2F0UL6JBtdYTukjZJZOqkUrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;546&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노란색=Game Loop속에 Physics Loop가 포함된것을 확인 가능.&lt;/figcaption&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;피직스 루프안에는 FixedUpdate가 처음부분에서 시작됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Update()와 FixedUpdate()는 완전히 분리된 것이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fixed Time Step값이 deltaTime보다 작으면, Physics Loop가 여러 번 반복하여 실행되는 원리입니다.&lt;/p&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;Fixed Time Step은&amp;nbsp;0.02이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프레임의&amp;nbsp;deltaTime이&amp;nbsp;0.1이었다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.1 / 0.02 = 5회 만큼&amp;nbsp;Physics Loop가 실행될 것으로 예측할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로,&amp;nbsp;deltaTime이&amp;nbsp;0.005처럼 너무 작았다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프레임에는&amp;nbsp;Physics Loop가 한 번도 실행되지 않을 수 있습니다.&lt;/p&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;u&gt;FixedUpdate()는&amp;nbsp;Physics Loop의 초입에 실행되며,&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;결국 게임 루프와는 별개로 일정한 주기마다 호출되는 것이 아니라&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;게임 루프 내에서 중첩 루프를 통해 호출된다는 것을 알 수 있습니다.&lt;/u&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;그치만 이렇게 생각하면 복잡하므로, 개발시에는 일정 주기로 FixedUpdate에서 물리계산을 진행한다~~라고 생각해도 될 것 같습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Physics Loop의 필요성&lt;/b&gt;&lt;/span&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;0.02초의 주기를 갖고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 주기에 따라 계산된 횟수로&amp;nbsp;&lt;b&gt;Physics Loop&lt;/b&gt;가 실행되는 것일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리 업데이트가 단순히 프레임 기반으로 실행되는, 반대의 상황을 가정해보면 쉽게 이해할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZGYOP/btrWQHK3Hky/yu4TxalPRPDUuLDXaGWMzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZGYOP/btrWQHK3Hky/yu4TxalPRPDUuLDXaGWMzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZGYOP/btrWQHK3Hky/yu4TxalPRPDUuLDXaGWMzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZGYOP%2FbtrWQHK3Hky%2Fyu4TxalPRPDUuLDXaGWMzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;280&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 공이 벽에 부딪혀서 원래는 튕겨나갈것으로 생각을 했으나&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;486&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SDIG8/btrWS272TDp/ZNoPQXeHDwIYGVtBxenf7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SDIG8/btrWS272TDp/ZNoPQXeHDwIYGVtBxenf7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SDIG8/btrWS272TDp/ZNoPQXeHDwIYGVtBxenf7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSDIG8%2FbtrWS272TDp%2FZNoPQXeHDwIYGVtBxenf7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;267&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터가 너무 안좋아서 프레임이 낮다면??(update주기가 너무 느리다면?)&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;b&gt;즉, Frame Rate에 따른 신뢰성 낮은 물리 시뮬레이션결과를 얻게 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;&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;490&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJdaft/btrWUHieayB/pKFnLC88naMghD9naac0g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJdaft/btrWUHieayB/pKFnLC88naMghD9naac0g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJdaft/btrWUHieayB/pKFnLC88naMghD9naac0g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJdaft%2FbtrWUHieayB%2FpKFnLC88naMghD9naac0g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;298&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Fixed Time Step주기를 정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deltaTime이 너무 오래 걸렸으면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deltaTime과 Fixed Time Step의 관계에 따라 그만큼 Physics Loop를 반복함으로써&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;일정한 주기로 물리 업데이트가 진행되는 것처럼 보정하는 방식&lt;/b&gt;&lt;/u&gt;을 사용합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Physics Loop를 왜 Game Loop속에 넣었을까?&lt;/b&gt;&lt;/span&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;이론적으로는 Physics Loop용 별도의 스레드를 통해서 일정한 주기로 수행되게 한다면 최고일텐데 왜 그랬지 않았을까요?&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;메인스레드에서는 물리관련에 접근하지 못하게하고, FixedUpdate()및 내부 물리 연산에서는 물리와 관련없는 데이터에 접근하지 못하도록 완전히 분리하는 방식을 채택한다면, 프로그래머 입장에서 난이도가 매우 어려워지고, 물리 업데이트의 결과는 트랜스폼에 적용되어야 하므로 동기화 문제에서 자유롭지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 메인 스레드와 물리 스레드의 공유 데이터를 모두 동기화(lock...)하자니, 게임 루프를 기반으로 동작하는 메인 스레드 특성 상 물리 스레드는 게임 루프의 동작에 종속되고, 반대로 게임 루프도 물리 스레드의 동작에 종속되는 최악의 경우가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위와같은 복잡한 문제를 가질바에 Physics Loop를 게임 루프 내에서 실행하고, deltaTime과 fixedDeltaTime의 관계에 따라 실행 횟수를 보정해주는 방식을 채택한 것으로 보입니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/117</guid>
      <comments>https://igh01ti.tistory.com/117#entry117comment</comments>
      <pubDate>Sat, 21 Jan 2023 21:41:56 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] tag, layer, sorting layer차이</title>
      <link>https://igh01ti.tistory.com/116</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;요약&lt;br /&gt;&lt;br /&gt;-Tag는 단일 게임 오브젝트를 관리하기 위해 사용&lt;br /&gt;-Layer는 그룹으로 묶어 관리하기 위해서 사용&lt;br /&gt;-Sorting Layer는 게임 오브젝트의 렌더링 순서를 정의하기 위해 사용&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dp2lc/btrWRx8FHVw/JJblxLxnq3Kt4cs2H0k9W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dp2lc/btrWRx8FHVw/JJblxLxnq3Kt4cs2H0k9W1/img.png&quot; data-alt=&quot;게임오브젝트의 인스펙터창에서 확인할 수 있는 Tag, Layer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dp2lc/btrWRx8FHVw/JJblxLxnq3Kt4cs2H0k9W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDp2lc%2FbtrWRx8FHVw%2FJJblxLxnq3Kt4cs2H0k9W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;183&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;게임오브젝트의 인스펙터창에서 확인할 수 있는 Tag, Layer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ1l9P/btrWR8N73r3/qf7Kg2iYDIUT3xMVVClZwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ1l9P/btrWR8N73r3/qf7Kg2iYDIUT3xMVVClZwK/img.png&quot; data-alt=&quot;tag나 layer를 기본값 이외에도 추가 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ1l9P/btrWR8N73r3/qf7Kg2iYDIUT3xMVVClZwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ1l9P%2FbtrWR8N73r3%2Fqf7Kg2iYDIUT3xMVVClZwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;221&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tag나 layer를 기본값 이외에도 추가 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZHk4u/btrWQIC7dge/H8IjTK7eKXqBwhLDDQq0g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZHk4u/btrWQIC7dge/H8IjTK7eKXqBwhLDDQq0g1/img.png&quot; data-alt=&quot;Tags, Sorting Layers, Layers 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZHk4u/btrWQIC7dge/H8IjTK7eKXqBwhLDDQq0g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZHk4u%2FbtrWQIC7dge%2FH8IjTK7eKXqBwhLDDQq0g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;524&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Tags, Sorting Layers, Layers 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Tag&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tag는 각 게임 오브젝트를 식별하는 용도로 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 사용하는 방식으로는, 충돌을 검사하는 OnCollision, OnTrigger 함수에서 CompareTag()함수를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674297996563&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.transform.CompareTag(&quot;PlayerAttack&quot;))
    {
        OnDamage(collision.transform);
    }
}&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;위 방식 외에도 단순 문자열 비교등으로도 사용 가능한데, 이렇게 한다면 해당 문자열을 가져오기 위해 문자열의 복사본을 생성하게되고 유니티 시스템상 복사본을 생성할때 GC(가비지콜렉터)가 호출되기 때문에 성능상 손해를 볼 수 있습니다.(약 27%의 성능 손해) (&lt;a href=&quot;https://sorting.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1674298081425&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (collision.tag == &quot;PlayerAttack&quot;){ ... }
if (collision.tag.Equals(&quot;PlayerAttack&quot;)){ ... }&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Layer&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layer는 오브젝트 그룹을 만들고 관리하는 용도입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 레이어는 Default로 설정되어 있습니다.&lt;/li&gt;
&lt;li&gt;상위 오브젝트와 하위 오브젝트는 서로 다른 레이어를 가질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;Layer를 사용하는 방법&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 선택적 렌더링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:카메라로부터 특정 레이어만을 렌더링하게 설정 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyUZB/btrWQtzndId/x1Nky64WpARljYPUyNy24k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyUZB/btrWQtzndId/x1Nky64WpARljYPUyNy24k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyUZB/btrWQtzndId/x1Nky64WpARljYPUyNy24k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpyUZB%2FbtrWQtzndId%2Fx1Nky64WpARljYPUyNy24k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;439&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 레이어 충돌 매트릭스 (Layer Collision Matrix)&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;503&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OmeuW/btrWQurt6RA/1qmFR2v5h2Tq52325grmtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OmeuW/btrWQurt6RA/1qmFR2v5h2Tq52325grmtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OmeuW/btrWQurt6RA/1qmFR2v5h2Tq52325grmtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOmeuW%2FbtrWQurt6RA%2F1qmFR2v5h2Tq52325grmtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;467&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;주의) Layer Collision Matrix는 프로젝트 세팅의 Physics와 Physics2D에 각각 존재하는데, 서로의 설정이 서로에게 영향을 주지 못합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 레이 캐스팅 충돌 (Raycasting Collision)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이캐스팅은 레이저를 쏴서 모든 오브젝트에 대해 충돌을 판단하는것이 기본인데, 비효율적이기 때문에,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layer Mask를 사용하면 특정 레이어와의 충돌을 판정할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 바닥 레이어로 설정된 곳만 마우스로 클릭할 수 있게 한다던지...등등&lt;/p&gt;
&lt;pre id=&quot;code_1674297343677&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//특정 Layer만 raycast하기
RaycastHit hit;
float distance = 10f;
int layerMask = 1 &amp;lt;&amp;lt; LayerMask.NameToLayer(&quot;Player&quot;);  // Player 레이어만 충돌 체크함
//(레이어마스크는 비트플래그 방식이기때문에 위처럼 사용)
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), out hit, distance  ,layerMask);


또는

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
float distance = 10f;
Physics.Raycast(ray, out hit,distance, LayerMask.GetMask(&quot;Wall&quot;));
//위처럼 LayerMask.GetMask()를 이용할수도있음&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Sorting Layer&lt;/b&gt;&lt;/span&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;게임 오브젝트 내에서 렌더링 순서를 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 2D 시스템에서 스프라이트를 정렬하는데 유용합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q58ph/btrWVKlltiP/n9XdpnujTc7IL2GKzf3gmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q58ph/btrWVKlltiP/n9XdpnujTc7IL2GKzf3gmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q58ph/btrWVKlltiP/n9XdpnujTc7IL2GKzf3gmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ58ph%2FbtrWVKlltiP%2Fn9XdpnujTc7IL2GKzf3gmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;290&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mVpB6/btrWRQ1he1I/JkSvnwNsllIB6J2NLKhuek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mVpB6/btrWRQ1he1I/JkSvnwNsllIB6J2NLKhuek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mVpB6/btrWRQ1he1I/JkSvnwNsllIB6J2NLKhuek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmVpB6%2FbtrWRQ1he1I%2FJkSvnwNsllIB6J2NLKhuek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;306&quot; height=&quot;335&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sorting Layer나 Order in Layer를 조절해줘야지 위 캐릭터의 그림자분이 캐릭터뒤로 가게 설정할 수 있습니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 layer</category>
      <category>유니티 sorting layer</category>
      <category>유니티 tag</category>
      <category>유니티 렌더링</category>
      <category>유니티 앞으로오기</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/116</guid>
      <comments>https://igh01ti.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 21 Jan 2023 05:50:45 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Rigidbody의 Gravity의 기준은?</title>
      <link>https://igh01ti.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Rigidbody의 Gravity를 설정할 수 있다는건 다들 알고 계실겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UY2l/btrWQtMq0ED/ehoaGnY20Q7K6deAzNyrvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UY2l/btrWQtMq0ED/ehoaGnY20Q7K6deAzNyrvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UY2l/btrWQtMq0ED/ehoaGnY20Q7K6deAzNyrvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UY2l%2FbtrWQtMq0ED%2FehoaGnY20Q7K6deAzNyrvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;297&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 이 중력 크기의 기준은 어디에 있을까요?&lt;/p&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;712&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcny9f/btrWQIJsNkl/UQ3pkj7y5iCgICsHuDuHXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcny9f/btrWQIJsNkl/UQ3pkj7y5iCgICsHuDuHXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcny9f/btrWQIJsNkl/UQ3pkj7y5iCgICsHuDuHXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcny9f%2FbtrWQIJsNkl%2FUQ3pkj7y5iCgICsHuDuHXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;475&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project Settings에 들어가서 Physics의 Gravity가 바로 그 기준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Rigidbody 2D를 사용했기때문에 Physics 2D를 보면 y축 -9.81값이 설정되어 있는것을 알 수 있습니다.&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;만약, Rigidbody의 Gravity Scale을 1로 설정한다면 y축 -9.81의 중력을 그대로 받겠다는 뜻이 되겠습니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 gravity</category>
      <category>유니티 rigidbody</category>
      <category>유니티 중력</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/114</guid>
      <comments>https://igh01ti.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 21 Jan 2023 05:42:34 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 방해되는 3d 아이콘 크기 줄이기</title>
      <link>https://igh01ti.tistory.com/113</link>
      <description>&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;443&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLoyp/btrWS3rOA2H/DQBwJnvKkFGOB1FClcT6l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLoyp/btrWS3rOA2H/DQBwJnvKkFGOB1FClcT6l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLoyp/btrWS3rOA2H/DQBwJnvKkFGOB1FClcT6l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLoyp%2FbtrWS3rOA2H%2FDQBwJnvKkFGOB1FClcT6l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;369&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;369&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;이때는 3d 아이콘의 크기를 줄여줘야 합니다.&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;936&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9MTDr/btrWRPOluAn/2ctfALaTcYkA3Vhl4kCLxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9MTDr/btrWRPOluAn/2ctfALaTcYkA3Vhl4kCLxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9MTDr/btrWRPOluAn/2ctfALaTcYkA3Vhl4kCLxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9MTDr%2FbtrWRPOluAn%2F2ctfALaTcYkA3Vhl4kCLxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;584&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;584&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>유니티</category>
      <category>유니티 3d 아이콘</category>
      <category>유니티 아이콘</category>
      <category>유니티 아이콘 크기</category>
      <category>유니티 아이콘 크기 조절</category>
      <category>유니티 크기 조절</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/113</guid>
      <comments>https://igh01ti.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 21 Jan 2023 05:35:39 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Sprite Atlas (스프라이트 아틀라스)</title>
      <link>https://igh01ti.tistory.com/112</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;Sprite란?&lt;/span&gt;&lt;/b&gt; (&lt;a href=&quot;https://docs.unity3d.com/kr/2022.1/Manual/Sprites.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Sprites는 2D 그래픽 오브젝트입니다. &lt;br /&gt;만약 3D 작업을 주로 해왔다면 Sprites는 스탠다드 텍스처라고 생각하면 됩니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Sprite Atlas란?&lt;/b&gt;&lt;/span&gt; (&lt;a href=&quot;https://docs.unity3d.com/kr/2021.3/Manual/class-SpriteAtlas.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;스프라이트 아틀라스(Sprite Atlas)는 여러 개의 텍스처를 단일 텍스처로 결합하는 에셋입니다.&amp;nbsp;&lt;/blockquote&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;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Sprite Atlas를 왜 쓰는가?&lt;/b&gt;&lt;/span&gt; (&lt;a href=&quot;https://funfunhanblog.tistory.com/301&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Draw call을 줄여서 성능을 향상시키기 위해서입니다.&lt;br /&gt;(Draw call? =&amp;gt; cpu가 gpu에게 그려달라고 요청하는것. 당연히 적을수록 좋음)&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;62&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJcO4I/btrWRdB7BAU/ksXX3hPieusDvlaUGzHzwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJcO4I/btrWRdB7BAU/ksXX3hPieusDvlaUGzHzwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJcO4I/btrWRdB7BAU/ksXX3hPieusDvlaUGzHzwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJcO4I%2FbtrWRdB7BAU%2FksXX3hPieusDvlaUGzHzwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;62&quot; height=&quot;94&quot; data-origin-width=&quot;62&quot; data-origin-height=&quot;94&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;434&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cftKRn/btrWS27sKfH/fCur4hNwDrWdyMZBVzc1Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cftKRn/btrWS27sKfH/fCur4hNwDrWdyMZBVzc1Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cftKRn/btrWS27sKfH/fCur4hNwDrWdyMZBVzc1Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcftKRn%2FbtrWS27sKfH%2FfCur4hNwDrWdyMZBVzc1Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;574&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Sprite Mode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-Single:이미지 자체를 하나의 Sprite를 지정합니다.&lt;br /&gt;-Multiple:이미지를 여러 Sprite로 나눌 수 있습니다.&lt;br /&gt;-Polygon:사각형, 원, 삼각형 등의 모양을 Sprite으로 만들어 사용할 수 있습니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Pixels Per Unit&lt;/b&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Ldzb/btrWRPHzNDF/HRKkVeiQwUf2wOxM0zUWi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Ldzb/btrWRPHzNDF/HRKkVeiQwUf2wOxM0zUWi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Ldzb/btrWRPHzNDF/HRKkVeiQwUf2wOxM0zUWi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Ldzb%2FbtrWRPHzNDF%2FHRKkVeiQwUf2wOxM0zUWi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;330&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
Unit은 유니티의 거리 단위를 의미합니다.&lt;br /&gt;즉, 위 빨간색 사각형은 1x1 unit을 의미합니다.&lt;br /&gt;Pixels per unit이란 저 한칸의 한 변의 길이를 몇 픽셀로 설정할지에 대한 옵션입니다.&lt;br /&gt;(ex. 100으로 설정하면 한칸을 100x100픽셀로 인식하겠다는 뜻.)&lt;br /&gt;(보통 주 캐릭터의 픽셀갯수를 따라가는 것 같습니다.)&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;b&gt;Mesh Type &lt;/b&gt;&lt;/b&gt;(&lt;a href=&quot;https://notyu.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 링크&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;스프라이트는 mesh를 기반으로 이미지를 보여줍니다.&lt;br /&gt;mesh는 컴퓨터 그래픽스에서 물체의 모양을 구성하는 vertex,edge,face등을 갖는 데이터입니다.&amp;nbsp;&lt;br /&gt;Mesh Type에는 Full Rect와 Tight 두 가지 타입이 있습니다.&lt;br /&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scHe9/btrWQLsuFtZ/udiGKriVnMbdegvqU65an0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scHe9/btrWQLsuFtZ/udiGKriVnMbdegvqU65an0/img.png&quot; data-alt=&quot;-Full Rect: 이미지와 동일한 형태로 스프라이트를 렌더링합니다. RGBA를 기반으로 투명 영역을 포함하는 사각 영역 전체를 렌더링합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scHe9/btrWQLsuFtZ/udiGKriVnMbdegvqU65an0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FscHe9%2FbtrWQLsuFtZ%2FudiGKriVnMbdegvqU65an0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;525&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;-Full Rect: 이미지와 동일한 형태로 스프라이트를 렌더링합니다. RGBA를 기반으로 투명 영역을 포함하는 사각 영역 전체를 렌더링합니다.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrstl/btrWQbSLZK5/bHIkMaA9J3LdM1tj6ZsySK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrstl/btrWQbSLZK5/bHIkMaA9J3LdM1tj6ZsySK/img.png&quot; data-alt=&quot;-Tight: 스프라이트의 투명 영역을 제외하고, RGBA를 기반으로 일정 영역을 렌더링합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrstl/btrWQbSLZK5/bHIkMaA9J3LdM1tj6ZsySK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwrstl%2FbtrWQbSLZK5%2FbHIkMaA9J3LdM1tj6ZsySK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;553&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;-Tight: 스프라이트의 투명 영역을 제외하고, RGBA를 기반으로 일정 영역을 렌더링합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Extrude Edges&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;렌더링 할 때 가장자리의 여유 공간을 길이로 나타낸 수치입니다. Mesh Type과 연관이 있습니다.&lt;br /&gt;Mesh Type이 Full Rect일때는 전체 영역을 렌더링하므로 영향이 없지만, Tight일 경우 이 수치를 증가시키면 각 영역을 기준으로 투명 영역을 더 많이 포함하는 것을 볼 수 있습니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Pivot&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;스프라이트의 회전 기준점입니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Wrap Mode&lt;/b&gt;(&lt;a href=&quot;https://worldeye.tistory.com/entry/Wrap-mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;텍스쳐를 정점에 입히는 방식(컴퓨터 그래픽스 u,v관련). 보통 Clamp로 설정&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Filter Mode&lt;/b&gt;(&lt;a href=&quot;http://darkpgmr.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;컴퓨터 그래픽스의 interpolate방식 선택..&lt;br /&gt;&lt;br /&gt;-Point(no filter): 보간 안함. 픽셀게임에서는 이걸 선택&lt;br /&gt;-Bilinear: 이중 선형 보간으로 필터링&lt;br /&gt;-Trilinear: 삼중 선형 보간으로 필터링&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Compression&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;텍스쳐를 압축하는 방식 선택.&amp;nbsp;&lt;br /&gt;도트의 경우 굳이 압축할 필요가 없기떄문에 None을 선택&lt;/blockquote&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;Sprite Mode를 Multiple로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭 하나하나가 18x18을 기준으로 그려졌기때문에 Pixels Per Unit은 18로 설정해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;픽셀아트이기 때문에 Filter Mode는 Point로 설정해줍니다. 그리고 Compression도 None으로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Apply를 누른 뒤, Sprite Editor에 들어갑니다.&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;1414&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDcxyf/btrWSwt7w8G/c9KmF6sCRAxizM4mjb2W8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDcxyf/btrWSwt7w8G/c9KmF6sCRAxizM4mjb2W8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDcxyf/btrWSwt7w8G/c9KmF6sCRAxizM4mjb2W8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDcxyf%2FbtrWSwt7w8G%2Fc9KmF6sCRAxizM4mjb2W8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1414&quot; height=&quot;821&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slice에서 Type을 Grid By Cell Size로 설정해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Pixel Size와 Padding등을 픽셀아트 제작자가 의도한 대로 적어서 Slice해줍니다.&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;1416&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZkVY/btrWTLxNcUP/DvNASr36k9XGUX812I9UP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZkVY/btrWTLxNcUP/DvNASr36k9XGUX812I9UP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZkVY/btrWTLxNcUP/DvNASr36k9XGUX812I9UP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZkVY%2FbtrWTLxNcUP%2FDvNASr36k9XGUX812I9UP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;825&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 위 빨간색쪽을 누르면 위 같이 alpha값만 보는 화면으로 넘어갑니다.(=색 상관없이 픽셀이 존재하는 부분은 흰색으로 표현됨)&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;934&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxhxhr/btrWQK1td6p/5Lxn0lO2d8Ndnnq99MsW5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxhxhr/btrWQK1td6p/5Lxn0lO2d8Ndnnq99MsW5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxhxhr/btrWQK1td6p/5Lxn0lO2d8Ndnnq99MsW5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxhxhr%2FbtrWQK1td6p%2F5Lxn0lO2d8Ndnnq99MsW5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;733&quot; data-origin-width=&quot;934&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;그리고 순서를 인식하기 쉽게 이름을 알아서 각 조각마다 입력해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 확인했다면 Apply를 눌러서 잘라줍니다.&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;1006&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nX5do/btrWRcDhqDG/xWtRwKkjgnvcosrjufcsc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nX5do/btrWRcDhqDG/xWtRwKkjgnvcosrjufcsc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nX5do/btrWRcDhqDG/xWtRwKkjgnvcosrjufcsc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnX5do%2FbtrWRcDhqDG%2FxWtRwKkjgnvcosrjufcsc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;114&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Project창에서 위처럼 나눠진 모습을 확인 가능합니다.&lt;/p&gt;</description>
      <category>유니티</category>
      <category>유니티 filter mode</category>
      <category>유니티 mesh type</category>
      <category>유니티 wrap mode</category>
      <category>유니티 스프라이트</category>
      <category>유니티 아틀라스</category>
      <category>유니티sprite mode</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/112</guid>
      <comments>https://igh01ti.tistory.com/112#entry112comment</comments>
      <pubDate>Sat, 21 Jan 2023 01:54:55 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 셋(set),맵(map)</title>
      <link>https://igh01ti.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;셋(set), 멀티셋(multiset), 맵(map), 멀티맵(multimap)은 &lt;b&gt;&lt;u&gt;이진 탐색 트리(BST)&lt;/u&gt;&lt;/b&gt;를 기반으로 하는 연관 컨테이너(associative container)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(정확히 말하면 Red-black-tree. 스스로 균형을 맞추는 bst라고 생각)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 vector,list,deque같은 시퀀스 컨테이너들과 비교했을때, 트리구조가 갖는 장점을 그대로 가져갑니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;셋(set)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동으로 정렬됨&lt;/li&gt;
&lt;li&gt;중복된 원소 없음(중복된 원소를 허락하고 싶다면 multiset 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 존재 유무를 판별할때 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672730961371&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::set&amp;lt;int&amp;gt; s; //셋 정의

s.insert(10); //셋에 키값 추가

//셋에 해당 키가 있는지 확인하는 방법
auto itr = s.find(20);
if (itr != s.end()) 
{
  std::cout &amp;lt;&amp;lt; &quot;Yes&quot; &amp;lt;&amp;lt; std::endl;
} 
else 
{
  std::cout &amp;lt;&amp;lt; &quot;No&quot; &amp;lt;&amp;lt; std::endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋에 원소를 추가하거나 지우는 작업은 O(log N)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위기반 for문또한 사용 가능하며, 원소들의 접근 순서는 반복자를 이용해서 접근했을때와 동일합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;멀티셋(multiset)&lt;/span&gt;&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;셋에서 중복된 원소를 허락한 버전입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672731757041&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::multiset&amp;lt;std::string&amp;gt; s;

  s.insert(&quot;a&quot;);
  s.insert(&quot;b&quot;);
  s.insert(&quot;a&quot;);
  s.insert(&quot;c&quot;);
  s.insert(&quot;d&quot;);
  s.insert(&quot;c&quot;);

  print_set(s);
 
/*출력결과
a
a
b
c
c
d
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 set이라면 a,b,c,d 이렇게 출력됐을 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;맵(map)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동으로 정렬됨&lt;/li&gt;
&lt;li&gt;중복된 key 없음(중복된 key를 허락하고 싶다면 multimap 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵은 셋과 거의 동일하지만 셋은 key만 보관하지만, 맵은 key-value를 보관합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672732109490&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;map&amp;lt;string,int&amp;gt; student_score;

student_score.insert(std::pair&amp;lt;std::string,int&amp;gt;(&quot;김남제&quot;,50));

student_score.insert(std::make_pair(&quot;엄준식&quot;, 100));

student_score[&quot;찬우정&quot;]=60;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로 입력하는 타입은 key의 타입이고, 두번째는 value의 타입입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 세가지 방법으로 key-value의 추가가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[]연산자의 경우, 만일 해당하는 키가 맵에 없다면 추가될 것이고, 있다면 value값이 바뀌게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert는 이미 해당하는 키가 있다면 새로운 value로 대체하지 않고 무시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672732489581&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 K, typename V&amp;gt;
void print_map(std::map&amp;lt;K, V&amp;gt;&amp;amp; m) {
  // 맵의 모든 원소들을 출력하기
  for (auto itr = m.begin(); itr != m.end(); ++itr) {
    std::cout &amp;lt;&amp;lt; itr-&amp;gt;first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; itr-&amp;gt;second &amp;lt;&amp;lt; std::endl;
  }
}

template &amp;lt;typename K, typename V&amp;gt;
void print_map(std::map&amp;lt;K, V&amp;gt;&amp;amp; m) {
  // kv 에는 맵의 key 와 value 가 std::pair 로 들어갑니다.
  for (const auto&amp;amp; kv : m) {
    std::cout &amp;lt;&amp;lt; kv.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; kv.second &amp;lt;&amp;lt; std::endl;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋의 경우 *itr가 저장된 원소를 바로 가리켰지만, 맵은 반복자가 맵에 저장되어 있는 std::pair를 가리킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 itr-&amp;gt;first로 해당 원소의 키를, itr-&amp;gt;second로는 해당 원소의 값을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위기반 for문을 사용하면 std::pair값을 받아와서 위처럼 사용가능합니다.&lt;/p&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;pre id=&quot;code_1672732779278&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; map&amp;lt;string,int&amp;gt; student_score;
 
student_score.insert(std::pair&amp;lt;std::string,int&amp;gt;(&quot;김남제&quot;,50));

std::cout&amp;lt;&amp;lt;&quot;엄준식의 성적은? &quot;&amp;lt;&amp;lt;student_score[&quot;엄준식&quot;];

//출력: 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 엄준식은 map에 key로 없지만, 위처럼 사용하게되면 자동으로 값의 디폴트 생성자를 호출해서 원소를 추가해버립니다. 따라서 안전한 사용을 위해서는 find 함수를 통해 확인 후 사용하는것이 좋습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;멀티맵(multi map)&lt;/span&gt;&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;맵에서 중복된 원소를 허락하는 버전입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672732984895&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 K, typename V&amp;gt;
  void print_map(const std::multimap&amp;lt;K, V&amp;gt;&amp;amp; m) {
  // 맵의 모든 원소들을 출력하기
  for (const auto&amp;amp; kv : m) {
    std::cout &amp;lt;&amp;lt; kv.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; kv.second &amp;lt;&amp;lt; std::endl;
  }
}

  std::multimap&amp;lt;int, std::string&amp;gt; m;
  m.insert(std::make_pair(1, &quot;hello&quot;));
  m.insert(std::make_pair(1, &quot;hi&quot;));
  m.insert(std::make_pair(1, &quot;ahihi&quot;));
  m.insert(std::make_pair(2, &quot;bye&quot;));
  m.insert(std::make_pair(2, &quot;baba&quot;));

  print_map(m);

  std::cout &amp;lt;&amp;lt; &quot;--------------------&quot; &amp;lt;&amp;lt; std::endl;

  // 1 을 키로 가지는 반복자들의 시작과 끝을
  // std::pair 로 만들어서 리턴한다.
  auto range = m.equal_range(1);
  for (auto itr = range.first; itr != range.second; ++itr) {
    std::cout &amp;lt;&amp;lt; itr-&amp;gt;first &amp;lt;&amp;lt; &quot; : &quot; &amp;lt;&amp;lt; itr-&amp;gt;second &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; std::endl;
  }
  
  
  /*출력 결과
1 hello
1 hi
1 ahihi
2 bye
2 baba
--------------------
1 : hello 
1 : hi 
1 : ahihi 
*/&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;unordered_set과 unordered_map&lt;/span&gt;&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;셋,맵은 bst를 이용하기 때문에, 어쩔수없이 정렬이 되는데, 이 오버헤드를 없애고자 나온 것이&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unordered_set과 unordered_map입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unordered_set과 unordered_map은 bst가 아닌, 해시맵을 사용하기 때문에 insert,erase,find 모두가 O(1) (보통의 경우)로 수행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yhHi2/btrVcmIz6xi/cNGJTFBQKs8Xk0fdw5cpwk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yhHi2/btrVcmIz6xi/cNGJTFBQKs8Xk0fdw5cpwk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yhHi2/btrVcmIz6xi/cNGJTFBQKs8Xk0fdw5cpwk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyhHi2%2FbtrVcmIz6xi%2FcNGJTFBQKs8Xk0fdw5cpwk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;620&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(그래서 사실 hashset, hashmap이란 이름이 어울리지만 이러한 이름을 너무 많이 쓰고 있어서 충돌을 피하려고 위와같은 이름으로 했다고 합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 함수란 임의의 크기의 데이터를 고정된 크기의 데이터로 대응시켜주는 함수라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 보통 고정된 크기의 데이터라고 하면 일정 범위의 정수값을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 함수의 가장 중요한 성질은, 만약에&amp;nbsp;&lt;b&gt;같은 원소를 해시 함수에 전달한다면 같은 해시값을 리턴&lt;/b&gt;&lt;b&gt;한다는 점&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 덕분에 원소의 탐색을 빠르게 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간색 공과 보라색 공 처럼 다른 원소임에도 불구하고 같은 해시값을 갖는 경우가 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를&amp;nbsp;&lt;b&gt;해시 충돌(hash collision)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운이 매우 매우 나쁘다면 다른 색들의 공이 모두 1 번 상자에 들어갈 수 도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 탐색이&amp;nbsp;O(1)&lt;span aria-hidden=&quot;true&quot;&gt;O(1)&lt;/span&gt;&amp;nbsp;은 커녕&amp;nbsp;O(N)&lt;span aria-hidden=&quot;true&quot;&gt;O(N)&lt;/span&gt;&amp;nbsp;(여기서&amp;nbsp;n&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;a href=&quot;https://modoocode.com/238&quot;&gt;insert&lt;/a&gt;&amp;nbsp;해야 합니다. 이를&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;rehash&amp;nbsp;라 하며 &lt;span aria-hidden=&quot;true&quot;&gt;O(N)&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;만큼의 시간&lt;/b&gt;이 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;기본 타입들(int, double 등등) 과 std::string 의 경우 라이브러리 자체적으로 해시 함수가 내장되어 있으므로, 그냥 사용하셔도 됩니다. 그러나 직접 만든 클래스의 경우 해쉬함수를 직접 만들어줘야 합니다. 그리고 셋이나 맵과는 다르게 순서대로 정렬하지 않기 때문에 operator&amp;lt; 는 필요하지 않지만 hash collision시 상자 안에 있는 원소들과 비교를 해야하기 때문에 operator==는 필요합니다...&lt;/p&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://modoocode.com/224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://modoocode.com/224&lt;/a&gt; 이곳과 &lt;a href=&quot;https://woo-dev.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://woo-dev.tistory.com/106&lt;/a&gt; 이곳 참고)&lt;/p&gt;</description>
      <category>C++/STL</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/111</guid>
      <comments>https://igh01ti.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 3 Jan 2023 17:26:29 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 컴프리헨션(함축)</title>
      <link>https://igh01ti.tistory.com/110</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;리스트 컴프리헨션&lt;/b&gt;&lt;/span&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;&lt;b&gt;[표현식 for 항목 in 순회 가능한 객체]&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;pre id=&quot;code_1663934997719&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;number_list=[number-1 for number in range(1,6)]

print(number_list) #출력: [0, 1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1663935580805&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rows=range(1,4)
cols=range(1,3)
cells=[(row,col) for row in rows for col in cols]

for cell in cells:
    print(cell)

&quot;&quot;&quot;
출력:
(1, 1)
(1, 2)
(2, 1)
(2, 2)
(3, 1)
(3, 2)
&quot;&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;튜플 언패킹(각 튜플로부터 row와 col의 값만 출력하기 위해서)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663935728839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rows=range(1,4)
cols=range(1,3)
cells=[(row,col) for row in rows for col in cols]

for row,col in cells:
    print(row,col)
&quot;&quot;&quot;
출력:
1 1
1 2
2 1
2 2
3 1
3 2
&quot;&quot;&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;&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;[표현식 for 항목 in 순회 가능한 객체 if 조건]&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;pre id=&quot;code_1663935294309&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;number_list=[number for number in range(1,6) if number %2 ==1]

print(number_list) #출력: [1, 3, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;딕셔너리 컴프리헨션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;{키_표현식 : 값_표현식 for 표현식 in 순회 가능한 객체}&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663937689095&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;word='letters'

letter_counts1={letter: word.count(letter) for letter in word}
print(letter_counts1)
#출력: {'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}


letter_counts2={letter: word.count(letter) for letter in set(word)} #set을 사용해봄
print(letter_counts2)
#출력: {'l': 1, 'r': 1, 's': 1, 'e': 2, 't': 2}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;셋 컴프리헨션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;{표현식 for 표현식 in 순회 가능한 객체}&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663967340328&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a_set={number for number in range(1,6) if number % 3 ==1}
print(a_set) #출력: {1, 4}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;제네레이터 컴프리헨션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;튜플은 컴프리헨션이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호 안의 내용은 제너레이터 컴프리헨션이고 이것은 &lt;u&gt;&lt;b&gt;제너레이터 객체를 반환&lt;/b&gt;&lt;/u&gt;합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1663968121773&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;number_thing=(number for number in range(1,6))

print(type(number_thing)) #출력: &amp;lt;class 'generator'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1663968156266&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;number_thing=(number for number in range(1,6))

for number in number_thing:
    print(number)
&quot;&quot;&quot;
출력:
1
2
3
4
5
&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1663968183417&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;number_thing=(number for number in range(1,6))

number_list=list(number_thing)
print(number_list) #출력: [1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;제네레이터는 한 번만 실행될 수 있음.&lt;br /&gt;리스트,셋,문자열,딕셔너리는 메모리에 존재하지만, 제너레이터는 즉석에서 그 값을 생성하고, 이터레이터를 통해서 한 번에 값을 하나씩 처리한다.&amp;nbsp;&lt;br /&gt;제너레이터는 이 값을 기억하지 않으므로 다시 시작하거나 제너레이터를 백업할 수 없다.&lt;/blockquote&gt;</description>
      <category>Python</category>
      <category>파이썬 제너레이터</category>
      <category>파이썬 컴프리헨션</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/110</guid>
      <comments>https://igh01ti.tistory.com/110#entry110comment</comments>
      <pubDate>Fri, 23 Sep 2022 21:57:10 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 숫자 시퀀스 생성하기: range()</title>
      <link>https://igh01ti.tistory.com/109</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1663927396285&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;range(start,stop,step) 형식을 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;start를 생략하면 범위는 0에서 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stop은 꼭 입력해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step의 기본값은 1이며, -1을 지정하면 거꾸로 진행할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zip(),range()와 같은 함수는 순회 가능한 객체를 반환합니다.&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;그러므로 for ...in 형태로 순회가 가능합니다.&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_1663933247113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for x in range(0,3):
    print(x)
&quot;&quot;&quot;
출력:
0
1
2
&quot;&quot;&quot;


for x in range(2,-1,-1):
    print(x)
&quot;&quot;&quot;
출력:
2
1
0
&quot;&quot;&quot;

for x in range(2, 0, -1):
    print(x)
&quot;&quot;&quot;
출력:
2
1
&quot;&quot;&quot;

print(list(range(0,3))) #출력: [0, 1, 2]

print(list(range(0,11,2))) #출력: [0, 2, 4, 6, 8, 10]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>파이썬 range</category>
      <category>파이썬 range()</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/109</guid>
      <comments>https://igh01ti.tistory.com/109#entry109comment</comments>
      <pubDate>Fri, 23 Sep 2022 20:41:15 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 여러 시퀀스 순회하기: zip()</title>
      <link>https://igh01ti.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;zip()함수를 사용하면 여러 시퀀스를 병렬로 순회할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1663925281292&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;days=['Monday','Tuesday','Wednesday']
fruits=['banana','orange','peach']
drinks=['coffee','tea','beer']
desserts=['tiramisu','ice cream','pie','pudding'] #혼자만 4개임.

for day,fruit,drink,dessert in zip(days,fruits,drinks,desserts):
    print(day, &quot;: drink&quot;, drink, &quot;-eat&quot;, fruit, &quot;- enjoy&quot;, dessert)
    &quot;&quot;&quot;
    출력:
    Monday : drink coffee -eat banana - enjoy tiramisu
	Tuesday : drink tea -eat orange - enjoy ice cream
	Wednesday : drink beer -eat peach - enjoy pie
    &quot;&quot;&quot;
    
    #desserts의 pudding이 출력 안 되는걸 볼 수 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zip() 함수는 동일한 오프셋에 있는 항목으로부터 튜플을 만들 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1663925570030&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;small='a','b','c'
big='A','B','C'

print(list(zip(small,big)))
#출력:[('a', 'A'), ('b', 'B'), ('c', 'C')]

print(dict(zip(small,big)))
#출력: {'a': 'A', 'b': 'B', 'c': 'C'}&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663925600585&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;small='a','b','c'
big='A','B','C'

print(zip(small,big)) #불가능한 표현
#출력: &amp;lt;zip object at 0x000002a64353a940&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 위와같이 zip()단독으로 바로 print를 하게 되면 오브젝트의 위치를 반환하는 것을 알 수 있습니다.&lt;/p&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;u&gt;&lt;b&gt; zip()에 의해 반환되는 값&lt;/b&gt;&lt;/u&gt;은 튜플이나 리스트 자신이 아니라 &lt;u&gt;&lt;b&gt;하나로 반환될 수 있는 순회 가능한 값&lt;/b&gt;&lt;/u&gt;이라는것을 알 수 있습니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>파이썬 zip()</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/108</guid>
      <comments>https://igh01ti.tistory.com/108#entry108comment</comments>
      <pubDate>Fri, 23 Sep 2022 18:35:17 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 라인 유지하기: \</title>
      <link>https://igh01ti.tistory.com/107</link>
      <description>&lt;pre id=&quot;code_1663921359657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;line_test='abc'+ \
    'def'+ \
    'ghi'

print(line_test) #출력: abcdefghi&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;</description>
      <category>Python</category>
      <category>파이썬 \</category>
      <category>파이썬 라인 유지</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/107</guid>
      <comments>https://igh01ti.tistory.com/107#entry107comment</comments>
      <pubDate>Fri, 23 Sep 2022 17:23:13 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 셋(Set)</title>
      <link>https://igh01ti.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셋&lt;/b&gt;은 값(value)를 버리고 키(key)만 있는 딕셔너리와 같습니다.&lt;/p&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;존재하는지 여부만 판단할때 셋을 사용합니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;셋 생성: set(), { , , }&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1663840490227&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;empty_set1=set()
# empty_set2={} ==&amp;gt; 이건 빈 딕셔너리를 의미한다! 빈 셋이 아님

set1={1,2,3}
print(set1) #출력: {1, 2, 3}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리의 키와 마찬가지로 &lt;u&gt;&lt;b&gt;셋은 순서가 없다!&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;데이터 타입 변환: set()&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;u&gt;리스트-&amp;gt;셋&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663841099391&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list=['aaa','bbb','ccc','aaa']
set_test=set(list)
print(set_test) #출력: {'ccc', 'bbb', 'aaa'}&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;u&gt;문자열-&amp;gt;셋&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663841027994&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string='letters'

set_test=set(string)
print(set_test) #출력: {'s', 'l', 't', 'e', 'r'}&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;u&gt;튜플-&amp;gt;셋&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663841205715&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tuple=('aaa','bbb','ccc','aaa')
set_test=set(tuple)
print(set_test) #출력: {'bbb', 'ccc', 'aaa'}&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;u&gt;딕셔너리-&amp;gt;셋&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663841356039&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict_test={'a':'hello', 'b':'world', 'c':'!!!!'}
set_test=set(dict_test)
print(set_test) #출력: {'a', 'c', 'b'}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;in 활용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1663841892230&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drinks={
    'martini': {'vodka','vermouth'},
    'black russian': {'vodka','kahlua'},
    'white russian': {'cream','kahlua','vodka'},
    'manhattan': {'rye','vermouth','bitters'},
    'screwdirver': {'orange juice','vodka'}
}

for name,contents in drinks.items():
    if 'vodka' in contents:
        print(name) 
&quot;&quot;&quot;
출력:
martini
black russian
white russian
screwdirver
&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;셋을 집합으로 활용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1663846109348&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a={1,2}
b={2,3}

#----인터섹션(교집합)----#
print(a&amp;amp;b) #출력:{2}
print(a.intersection(b)) #출력:{2}

#----유니온(합집합)----#
print(a|b) #출력:{1, 2, 3}
print(a.union(b)) #출력:{1, 2, 3}

#----디퍼런스(차집합)----#
print(a-b) #출력:{1}
print(a.difference(b)) #출력:{1}

#----익스클루시브(대칭 차집합:한 쪽 셋에는 들어 있지만 양쪽 모두에 들어 있지 않은)----#
print(a^b) #출력:{1, 3}
print(a.symmetric_difference(b)) #출력:{1, 3}

#----서브셋(부분집합)----# #a가 b의 부분집합인가?
print(a&amp;lt;=b) #출력:False
print(a.issubset(b)) #출력:False

#----프로퍼 서브셋(진부분집합)----#
print(a&amp;lt;b) #출력:False

#----슈퍼셋(서브셋의 반대)----#
print(a&amp;gt;=b) #출력:False
print(a&amp;gt;=a) #출력:True&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1663845110790&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drinks={
    'martini': {'vodka','vermouth'},
    'black russian': {'vodka','kahlua'},
    'white russian': {'cream','kahlua','vodka'},
    'manhattan': {'rye','vermouth','bitters'},
    'screwdirver': {'orange juice','vodka'}
}

for name,contents in drinks.items():
    if 'vodka' in contents and not contents &amp;amp; {'vermouth','cream'}: #교집합 활용
        print(name)
&quot;&quot;&quot;
출력:
black russian
screwdirver
&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>파이썬 셋</category>
      <category>파이썬 집합</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/106</guid>
      <comments>https://igh01ti.tistory.com/106#entry106comment</comments>
      <pubDate>Fri, 23 Sep 2022 03:52:14 +0900</pubDate>
    </item>
    <item>
      <title>폰(Pawn)</title>
      <link>https://igh01ti.tistory.com/105</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;폰(Pawn)이란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;폰과 액터의 차이는&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXeqOM/btrLOgw2SRA/c5RKOsjtmRft5vgRrPcik0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXeqOM/btrLOgw2SRA/c5RKOsjtmRft5vgRrPcik0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXeqOM/btrLOgw2SRA/c5RKOsjtmRft5vgRrPcik0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXeqOM%2FbtrLOgw2SRA%2Fc5RKOsjtmRft5vgRrPcik0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;500&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이름이 MyPawn으로 Pawn클래스를 하나 만들었습니다.&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;보시는 바와 같이 APawn을 상속하고 있습니다. (A는 언리얼의 네이밍 컨벤션)&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;873&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Coto3/btrLMzRm7Zr/LqyMg2uQwjJ0AG2TFxmwRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Coto3/btrLMzRm7Zr/LqyMg2uQwjJ0AG2TFxmwRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Coto3/btrLMzRm7Zr/LqyMg2uQwjJ0AG2TFxmwRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCoto3%2FbtrLMzRm7Zr%2FLqyMg2uQwjJ0AG2TFxmwRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;419&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;작명규칙 링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662982661373&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;언리얼 엔진 4 코드베이스에 에픽게임즈가 사용하는 표준과 규칙입니다.&quot; data-og-host=&quot;docs.unrealengine.com&quot; data-og-source-url=&quot;https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/&quot; data-og-url=&quot;https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hnfhI/hyPLcbhkso/f9uHTHd8lr3CuqX2LvNFMk/img.png?width=1080&amp;amp;height=608&amp;amp;face=0_0_1080_608&quot;&gt;&lt;a href=&quot;https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hnfhI/hyPLcbhkso/f9uHTHd8lr3CuqX2LvNFMk/img.png?width=1080&amp;amp;height=608&amp;amp;face=0_0_1080_608');&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;언리얼 엔진 4 코드베이스에 에픽게임즈가 사용하는 표준과 규칙입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxCE0q/btrLR7TEBfs/ORXqxFsx4iiqtjvtx17Dlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxCE0q/btrLR7TEBfs/ORXqxFsx4iiqtjvtx17Dlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxCE0q/btrLR7TEBfs/ORXqxFsx4iiqtjvtx17Dlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxCE0q%2FbtrLR7TEBfs%2FORXqxFsx4iiqtjvtx17Dlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;103&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pawn의 구조가 궁금해서 타고 들어가서 보면,&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;Actor를 상속받고 있는 것을 볼 수 있습니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662982847291&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyPawn.h

// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyPawn.h를 보면 원래 Actor클래스에는 없었던 SetupPlayerInputComponent가 기본적으로 있는 것을 볼 수 있습니다.&lt;/p&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;이런식으로 액터에다가 추가 기능들이 더해진 것이 Pawn입니다.&lt;/p&gt;</description>
      <category>언리얼엔진</category>
      <category>언리얼 pawn</category>
      <category>언리얼 폰</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/105</guid>
      <comments>https://igh01ti.tistory.com/105#entry105comment</comments>
      <pubDate>Mon, 12 Sep 2022 20:38:50 +0900</pubDate>
    </item>
    <item>
      <title>언리얼에서 로그 찍기</title>
      <link>https://igh01ti.tistory.com/104</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;로그 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662732493865&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//카테고리, 로깅 수준, 형식, 인자 
UE_LOG(LogTemp,Warning,TEXT(&quot;BeginPlay %d&quot;),3);&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;p data-ke-size=&quot;size16&quot;&gt;로깅 수준의 종류는&amp;nbsp;&lt;a href=&quot;https://docs.unrealengine.com/4.26/en-US/API/Runtime/Core/Logging/ELogVerbosity__Type/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt; 에서 확인 가능합니다. (언리얼 에디터 상에서 색상이 바뀌고 파일로 기록이 남는등의 차이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 저장된 로그파일은 &lt;u&gt;Saved\Logs 경로&lt;/u&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;그리고 형식,인자는 printf()에서 쓰는 방식처럼 쓰면 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662734105964&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
	//카테고리, 로깅 수준, 형식, 인자
	UE_LOG(LogTemp, Warning, TEXT(&quot;BeginPlay %d&quot;), 3);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액터의 BeginPlay() 부분에 써봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQuplc/btrLLY3tDy0/CvyEJ0RkF0SbCEa0zcaz60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQuplc/btrLLY3tDy0/CvyEJ0RkF0SbCEa0zcaz60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQuplc/btrLLY3tDy0/CvyEJ0RkF0SbCEa0zcaz60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQuplc%2FbtrLLY3tDy0%2FCvyEJ0RkF0SbCEa0zcaz60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;62&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 로그 창에 다음과 같이 뜨게 됩니다. (로깅수준이 Warning이라 노란색)&lt;/p&gt;</description>
      <category>언리얼엔진</category>
      <category>언리얼 로그</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/104</guid>
      <comments>https://igh01ti.tistory.com/104#entry104comment</comments>
      <pubDate>Fri, 9 Sep 2022 23:36:21 +0900</pubDate>
    </item>
    <item>
      <title>액터(Actor) 기초</title>
      <link>https://igh01ti.tistory.com/102</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;언리얼에서 액터(Actor) 이란?&lt;/b&gt;&lt;/span&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;액터는 월드에 배치하는 오브젝트를 의미합니다. 물체의 가장 기본이 된다고도 볼 수 있습니다.&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;이번 포스트에서는 Actor에 겉모습을 지정해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF47QK/btrLKKLSVGU/lwt3KX1ykZCz9WyDE52kN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF47QK/btrLKKLSVGU/lwt3KX1ykZCz9WyDE52kN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF47QK/btrLKKLSVGU/lwt3KX1ykZCz9WyDE52kN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF47QK%2FbtrLKKLSVGU%2Flwt3KX1ykZCz9WyDE52kN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;564&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 c++ 클래스로 Actor를 생성합니다. 이름은 MyActor 기본으로 생성하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;MyActor.h 와 My&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;Actor&lt;/span&gt;&lt;/b&gt;.cpp 초기상태&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662724345469&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyActor.h 초기상태

#pragma once

#include &quot;CoreMinimal.h&quot;
#include &quot;GameFramework/Actor.h&quot;
#include &quot;MyActor.generated.h&quot;

UCLASS()
class TISTORY_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
};&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_1662724387807&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyActor.cpp 초기상태
#include &quot;MyActor.h&quot;

// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Actor에 겉모습 입히기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;/span&gt;언리얼에는 2가지의 Mesh유형이 존재합니다.&lt;/p&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;u&gt;&lt;b&gt;StaticMesh&lt;/b&gt;&lt;/u&gt;, 다른 하나는 &lt;u&gt;&lt;b&gt;SkeletalMesh&lt;/b&gt;&lt;/u&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;보통 관절의 움직임등이 필요한(ex 캐릭터) 액터에는 SkeletalMesh를,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에는 전부 StaticMesh를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jhtop0419.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고링크&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;&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;이번 포스트에서는 단순한 의자 형태의 Actor을 생성할 것이기 때문에 StaticMesh를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662725093389&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyActor.h에 추가
private:
	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* Mesh;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyActor.h에 위 코드를 추가합니다.&lt;/p&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;UPROPERTY() 는 언리얼에서 제공하는 기능(리플렉션)을 사용하기 위해서 반드시&lt;/b&gt; 붙여줘야합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPROPERTY()와 관련된 내용은==&amp;gt;&lt;b&gt;&lt;a href=&quot;https://minusi.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC-UPROPERTY-Unreal-UPROPERTY&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VisibleAnywhere와 관련된 내용은 ==&amp;gt; &lt;b&gt;&lt;a href=&quot;https://igh01ti.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662726407626&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyActor.cpp에 추가
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	Mesh = CreateDefaultSubobject&amp;lt;UStaticMeshComponent&amp;gt;(TEXT(&quot;MESH&quot;));

	RootComponent = Mesh;

	static ConstructorHelpers::FObjectFinder&amp;lt;UStaticMesh&amp;gt; SM(TEXT(&quot;StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'&quot;));

	if (SM.Succeeded())
	{
		Mesh-&amp;gt;SetStaticMesh(SM.Object);
	}
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662726877429&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Mesh = CreateDefaultSubobject&amp;lt;UStaticMeshComponent&amp;gt;(TEXT(&quot;MESH&quot;));

RootComponent = Mesh;&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;Mesh에 관한 메모리 관리를 언리얼 상에서 자동으로 해주게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 직접 delete할 필요가 없습니다. (일종의 스마트포인터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TEXT는 해시값으로 사용하기 위해서 주는 값인데, 겹치지 않게 주면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 굳이 TEXT()를 사용해서 전달을 해주냐면, 기기마다 문자열 체계가 다를 수 있기 때문에 해당 호환성을 위해서 언리얼에선 문자열을 TEXT()를 사용해서 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 컴포넌트 중에 하나를 RootComponent로 설정해줘야합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662726922179&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static ConstructorHelpers::FObjectFinder&amp;lt;UStaticMesh&amp;gt; SM(TEXT(&quot;StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'&quot;));&lt;/code&gt;&lt;/pre&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;912&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqnhRp/btrLKKSDSIg/PBI8eqZ2vR97OidX4rAV90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqnhRp/btrLKKSDSIg/PBI8eqZ2vR97OidX4rAV90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqnhRp/btrLKKSDSIg/PBI8eqZ2vR97OidX4rAV90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqnhRp%2FbtrLKKSDSIg%2FPBI8eqZ2vR97OidX4rAV90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;884&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드하고 싶은 스태틱메시를 Ctrl+C 를 하던가, 파일 경로 복사를해서 TEXT()속에 붙여넣어야 합니다.&lt;/p&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;u&gt;&lt;b&gt;SM에 해당 스태틱메시가 로드된 상태&lt;/b&gt;&lt;/u&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662729571518&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (SM.Succeeded())
{
	Mesh-&amp;gt;SetStaticMesh(SM.Object);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SM에 해당 스태틱메시 로드가 정상적으로 됐다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스태틱메시컴포넌트인 Mesh에 해당 로드된 오브젝트를 설정해줍니다.&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;&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;1276&quot; data-origin-height=&quot;981&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2GBOJ/btrLKGo9Pjh/fEaxUG8XCDzA2ZT6ns4QP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2GBOJ/btrLKGo9Pjh/fEaxUG8XCDzA2ZT6ns4QP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2GBOJ/btrLKGo9Pjh/fEaxUG8XCDzA2ZT6ns4QP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2GBOJ%2FbtrLKGo9Pjh%2FfEaxUG8XCDzA2ZT6ns4QP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;981&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 빌드를 완료하고 방금 만든 MyPawn클래스를 맵에 끌어다놓으면 의도한대로 겉모습이 바뀐걸 볼 수 있습니다.&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;pre id=&quot;code_1662731083728&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//MyActor.h에 추가

UPROPERTY(EditAnywhere,Category=Stat)
int32 Hp;

UPROPERTY(EditAnywhere,Category = Stat)
int32 Mp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 int32형으로 카테고리를 지정해주고 빌드하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b21zxa/btrLPn2fsDA/w65LAzDEpAwImSpXVpUIa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b21zxa/btrLPn2fsDA/w65LAzDEpAwImSpXVpUIa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b21zxa/btrLPn2fsDA/w65LAzDEpAwImSpXVpUIa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb21zxa%2FbtrLPn2fsDA%2Fw65LAzDEpAwImSpXVpUIa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;96&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 프로퍼티창에 생기게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;UPROPERTY()를 안쓰면 뜨지 않습니다.&lt;/u&gt;&lt;/p&gt;</description>
      <category>언리얼엔진</category>
      <category>언리얼 pawn</category>
      <category>언리얼 폰</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/102</guid>
      <comments>https://igh01ti.tistory.com/102#entry102comment</comments>
      <pubDate>Fri, 9 Sep 2022 22:26:35 +0900</pubDate>
    </item>
    <item>
      <title>visible과 edit의 차이</title>
      <link>https://igh01ti.tistory.com/101</link>
      <description>&lt;h2 id=&quot;visible-edit의-차이-왜-이렇게-쓸까&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;Visible, Edit의 차이? 왜 이렇게 쓸까&lt;/b&gt;&lt;/span&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;여기서 Visible과 Edit의 차이를 궁금해서 찾다가 알아낸 사실을 기록하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;UPROPERTY(VisibleAnywhere) 
UStaticMeshComponent *Body; 

UPROPERTY(EditAnywhere,Category=IDtest)
int32 ID;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언뜻봐서는 직관적으로 Visible은 언리얼에디터에서 수정이 불가능하겠지? Edit은 수정이 가능한것이겠지? 라고 생각했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그러나 위 코드처럼 Body와 ID를 만들었을때 충격적이게도 Body에 속하는 속성들을 언리얼 상에서 수정이 가능하였고 ID또한 수정이 가능하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그러나&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;UPROPERTY(EditAnywhere) 
UStaticMeshComponent *Body;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성했을경우 Body의 속성을 언리얼에디터에서 수정이 불가능하였습니다. 도대체 어떤 차이일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;확인해본 결과 객체에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;visible&lt;/b&gt;을 사용했을 경우 객체일 경우 오브젝트 안의 속성들을 언리얼에디터에서 수정이 가능하지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;edit&lt;/b&gt;을 사용했을때는 객체의 레퍼런스 자체를 변경하는 옵션이(staticmesh에서 다른 컴포넌트로 한다던지&amp;hellip;) 언리얼 에디터상에서 나타나고 오브젝트 안의 속성들을 수정할수없었다.&lt;/p&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;객체에는 visible&lt;/b&gt;을 쓰는게 맞을것 같고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;int32 ID&lt;/b&gt;같은 일반적인 자료형의 경우에는 수정을 원할때만 Edit 키워드를 쓰면 될 것 같다.&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;906&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0RYlX/btrLK2yGsd9/rs2kJGS0nvWYdCGmetZ6d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0RYlX/btrLK2yGsd9/rs2kJGS0nvWYdCGmetZ6d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0RYlX/btrLK2yGsd9/rs2kJGS0nvWYdCGmetZ6d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0RYlX%2FbtrLK2yGsd9%2Frs2kJGS0nvWYdCGmetZ6d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;189&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이것은 visible과 edit뒤에 붙는 키워드 3개인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DefaultsOnly&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;InstanceOnly&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Anywhere&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;세개와의 조합을 표로 나타낸 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;해당 표는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://darkcatgame.tistory.com/62&quot;&gt;https://darkcatgame.tistory.com/62&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당 블로그에서 잘 정리해뒀기에 인용하였습니다.&lt;/p&gt;
&lt;h3 id=&quot;이-기능은-언리얼-오브젝트라는-특별한-객체에만-사용-가능&quot; data-ke-size=&quot;size23&quot;&gt;#이 기능은 언리얼 오브젝트라는 특별한 객체에만 사용 가능.&lt;/h3&gt;</description>
      <category>언리얼엔진</category>
      <category>언리얼 edit</category>
      <category>언리얼 editanywhere</category>
      <category>언리얼 visible</category>
      <category>언리얼 visibleanywhere</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/101</guid>
      <comments>https://igh01ti.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 9 Sep 2022 21:12:45 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 하키(1358번)</title>
      <link>https://igh01ti.tistory.com/100</link>
      <description>&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;1148&quot; data-origin-height=&quot;1129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgb96K/btrLK5IWWtk/dkklsJR4M4XKTPGpYTT4uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgb96K/btrLK5IWWtk/dkklsJR4M4XKTPGpYTT4uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgb96K/btrLK5IWWtk/dkklsJR4M4XKTPGpYTT4uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgb96K%2FbtrLK5IWWtk%2FdkklsJR4M4XKTPGpYTT4uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;1129&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;1129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGXr7V/btrLNpMXhYH/X3TSGI9hk84BoAiROzoDpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGXr7V/btrLNpMXhYH/X3TSGI9hk84BoAiROzoDpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGXr7V/btrLNpMXhYH/X3TSGI9hk84BoAiROzoDpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGXr7V%2FbtrLNpMXhYH%2FX3TSGI9hk84BoAiROzoDpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;222&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqsnkq/btrLLiONJsW/OGOK412TuZfM95xtM3CyJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqsnkq/btrLLiONJsW/OGOK412TuZfM95xtM3CyJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqsnkq/btrLLiONJsW/OGOK412TuZfM95xtM3CyJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqsnkq%2FbtrLLiONJsW%2FOGOK412TuZfM95xtM3CyJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;222&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;222&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOabWj/btrLLzCM62n/KTevBt346s77AOeVGEKl9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOabWj/btrLLzCM62n/KTevBt346s77AOeVGEKl9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOabWj/btrLLzCM62n/KTevBt346s77AOeVGEKl9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOabWj%2FbtrLLzCM62n%2FKTevBt346s77AOeVGEKl9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;389&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 상황이라고 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 푸는 알고리즘은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;직사각형안인가?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;왼쪽&amp;nbsp;반원&amp;nbsp;중심부터&amp;nbsp;거리가&amp;nbsp;r(=h/2)&amp;nbsp;이하인가?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;오른쪽&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;반원&amp;nbsp;중심부터&amp;nbsp;거리가&amp;nbsp;r(=h/2)&amp;nbsp;이하인가?&lt;/b&gt;&lt;/li&gt;
&lt;/ol&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;&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_1662719782343&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
#include&amp;lt;cmath&amp;gt;
using namespace std;

int main()
{
    double w,h,x,y,p; //p는 선수의 수
    cin&amp;gt;&amp;gt;w&amp;gt;&amp;gt;h&amp;gt;&amp;gt;x&amp;gt;&amp;gt;y&amp;gt;&amp;gt;p;
    int aws=0;
    for(int i=0; i&amp;lt;p; i++)
    {
        double p_x,p_y;
        cin&amp;gt;&amp;gt;p_x&amp;gt;&amp;gt;p_y;
        
        double distance_from_left_circle=sqrt(pow((x-p_x),2)+pow(y+h/2-p_y,2));
        double distance_from_right_circle=sqrt(pow((x+w-p_x),2)+pow(y+h/2-p_y,2));
        
        if((p_x&amp;gt;=x &amp;amp;&amp;amp; p_x&amp;lt;=x+w) &amp;amp;&amp;amp; (p_y&amp;gt;=y &amp;amp;&amp;amp; p_y&amp;lt;=y+h)) //직사각형 안인가?
            aws++;
        else if(distance_from_left_circle&amp;lt;=h/2) //왼쪽 반원 안에 있는가?
            aws++;
        else if(distance_from_right_circle&amp;lt;=h/2) //오른쪽 반원 안에 있는가?
            aws++;
    }
    cout&amp;lt;&amp;lt;aws;
}&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;</description>
      <category>알고리즘/백준 문제풀이</category>
      <category>c++ 1358번</category>
      <category>c++ 하키</category>
      <category>백준 1358번</category>
      <category>백준 하키</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/100</guid>
      <comments>https://igh01ti.tistory.com/100#entry100comment</comments>
      <pubDate>Fri, 9 Sep 2022 19:37:46 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 딕셔너리(딕트)</title>
      <link>https://igh01ti.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리는 값(value)에 상응하는 고유한 키(key)를 지정합니다.&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;u&gt;&lt;b&gt;key-value 형태&lt;/b&gt;&lt;/u&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 data-ke-size=&quot;size16&quot;&gt;딕셔너리는 &lt;u&gt;&lt;b&gt;항목의 순서를 따지지 않습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;다른 언어에서는 딕셔너리를 연관 배열, 해시, 해시맵 등이라고 부릅니다.&amp;nbsp;&lt;br /&gt;파이썬에서는 딕셔너리를 딕트라고도 부릅니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;딕셔너리 생성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중괄호{}안에 콤바로 구분된 &lt;u&gt;&lt;b&gt;키:값&lt;/b&gt;&lt;/u&gt; 쌍을 지정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662712929158&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;empty_dict={}

dict={'day':'2022년 9월 9일',
      '시간':'오후 5시 40분',
      '장소':'우리집',
      '좋아하는 숫자':'01'}

print(dict['시간']) #출력:오후 5시 40분

print(dict) #출력:{'day': '2022년 9월 9일', '시간': '오후 5시 40분', '장소': '우리집', '좋아하는 숫자': '01'}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;딕셔너리로 변환하기: dict()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dict() 함수를 사용해서 두 값으로 이루어진 시퀀스를 딕셔너리로 변환할 수 있습니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662713951557&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list=[['지역','서울'],['스마트폰','아이폰']]

dict_test=dict(list)

print(dict_test) #출력:{'지역': '서울', '스마트폰': '아이폰'}   ==&amp;gt;이 순서는 바뀔수 있습니다.
print(dict_test['스마트폰']) #출력:아이폰

------------------------------------------------------------------------------------------

test=[('지역','서울'),('스마트폰','아이폰')]

dict_test=dict(test)

print(dict_test) #출력:{'지역': '서울', '스마트폰': '아이폰'}아이폰
print(dict_test['스마트폰']) #출력:아이폰

------------------------------------------------------------------------------------------

test=['ab','cd','ef']

dict_test=dict(test)

print(dict_test) #출력:{'a': 'b', 'c': 'd', 'e': 'f'}
print(dict_test['e']) #출력:f&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;항목 추가/변경하기:[key]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키가 딕셔너리에 이미 존재하는 경우, 그 값은 새 값으로 대체됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키가 존재하지 않는 경우, 새 값이 키와 사전에 추가됩니다.&lt;/p&gt;
&lt;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_1662715705463&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict_test={'day':'2022년 9월 9일',
      '시간':'오후 5시 40분',
      '장소':'우리집',
      '좋아하는 숫자':'01'}

dict_test['전공']='컴공'

print(dict_test['전공']) #출력:컴공
print(dict_test) #출력:{'day': '2022년 9월 9일', '시간': '오후 5시 40분', '장소': '우리집', '좋아하는 숫자': '01', '전공': '컴공'}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;딕셔너리 결합하기: update()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662715816943&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;first={'a':1,'b':2}
second={'b':3,'c':4}

first.update(second)

print(first) #출력:{'a': 1, 'b': 3, 'c': 4}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 두 딕셔너리에 키 값이 겹친다면, ( ) 속에 있는딕셔너리가 경쟁에서 이깁니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;키와 del로 항목 삭제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662716163154&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

del test['a']

print(test) #출력:{'b': 2}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;모든 항목 삭제: clear()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662716312718&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

test.clear()

print(test) #출력:{}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;pre id=&quot;code_1662716340900&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

test={}

print(test) #출력:{}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 딕셔너리를 할당해도 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;key 존재 여부 확인: in&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662716461950&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

print('b' in test) #출력:True&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;항목 얻기:[key],&amp;nbsp; get()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662716793960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

print(test['a']) #출력:1

print(test.get('a')) #출력:1

print(test.get('c')) #출력:None

print(test.get('c','Not Exist')) #출력:Not Exist&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;모든 키, 값 얻기: keys(), values()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662717090876&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

print(test.keys()) #출력:dict_keys(['a', 'b'])

list_test=list(test.keys())
print(list_test) #출력:['a', 'b']&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;아래 코드와 같이 list()를 호출해서 dict_keys객체를 리스트로 변환하는 응용도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662717206992&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

print(test.values()) #출력:dict_values([1, 2])

list_test=list(test.values())
print(list_test) #출력:[1, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;모든 쌍의 key-value 얻기:&lt;/b&gt; &lt;b&gt;items()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662717411821&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

print(test.items()) #출력:dict_items([('a', 1), ('b', 2)])

list_test=list(test.items())
print(list_test) #출력:[('a', 1), ('b', 2)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 키와 값은 (key,value) 와 같이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;튜플&lt;/b&gt;&lt;/span&gt;로 반환됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;할당:=, 복사: copy()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662718496396&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

testA=test
testA['a']=8
print(test['a']) #출력:8&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;pre id=&quot;code_1662718568549&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test={'a':1,'b':2}

testB=test.copy()
testB['a']=8
print(test['a']) #출력:1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 복사 'copy()'같은 경우에는 말 그대로 복사기 때문에 영향을 미치지 않습니다.&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;/p&gt;</description>
      <category>Python</category>
      <category>파이썬 딕셔너리</category>
      <category>파이썬 딕트</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/99</guid>
      <comments>https://igh01ti.tistory.com/99#entry99comment</comments>
      <pubDate>Fri, 9 Sep 2022 19:17:16 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 튜플(tuple)</title>
      <link>https://igh01ti.tistory.com/98</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;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;튜플을 사용하는 이유&lt;/b&gt;&lt;/span&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;튜플은 리스트의 append(),insert()등과 같은 함수가 없고 함수의 수도 적습니다.&lt;/p&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;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;li&gt;함수의 인자들은 튜플로 전달됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 보통 리스트와 딕셔너리를 더 많이 사용하는 편입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;튜플 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662708155019&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TupleA='hi','hello'
TupleB=('python','study')

print(TupleA) #출력:('hi', 'hello')
print(TupleB) #출력:('python', 'study')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( )는 써도 되고 안써도 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;튜플 언패킹(tuple unpacking)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662710286084&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Tuple=('hi','hello','bye')

a,b,c=Tuple #####튜플 언패킹####

print(a,b,c) #출력:hi hello bye

a='hhh'
print(a) #출력:hhh

print(Tuple) #출력:('hi', 'hello', 'bye')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;튜플은 한 번에 여러 변수를 할당할 수 있는데 이를 튜플 언패킹이라고 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;값 교환&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662711548549&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a='aaaa'
b='bbbb'

a,b=b,a

print(a,b) #출력:bbbb aaaa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 문장에서 값을 교환하기 위해 임시 변수를 사용하지 않고 튜플을 사용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;다른 객체를 튜플로&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662711656106&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list=['hi','hello']

tuple_test=tuple(list)
print(tuple_test) #출력:('hi', 'hello')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tuple()은 다른 객체를 튜플로 만들어줍니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>튜플</category>
      <category>파이썬 튜플</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/98</guid>
      <comments>https://igh01ti.tistory.com/98#entry98comment</comments>
      <pubDate>Fri, 9 Sep 2022 17:32:45 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 주식가격(Lv.2)</title>
      <link>https://igh01ti.tistory.com/97</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cecbqE/btrLKhI5nsz/fKgje9CRKTb5wHcSenE1s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cecbqE/btrLKhI5nsz/fKgje9CRKTb5wHcSenE1s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cecbqE/btrLKhI5nsz/fKgje9CRKTb5wHcSenE1s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcecbqE%2FbtrLKhI5nsz%2FfKgje9CRKTb5wHcSenE1s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1057&quot; height=&quot;652&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&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;2중 for문을 사용했습니다.&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;처음 for문은 검사할 시점의 주식가격을 결정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 for문에서는 첫번째 for문에서 결정된 가격에비해 하락이 있었나 여부를 판단해서 계산합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662633050312&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; prices) {
    vector&amp;lt;int&amp;gt; answer;
    for(int i=0; i&amp;lt;prices.size(); i++)
    {
        int count=0;
        for(int j=i+1; j&amp;lt;prices.size(); j++)
        {
            if(prices[i] &amp;lt;= prices[j])
                count++;
            else
            {
                count++;
                break;
            }
        }
        answer.push_back(count);
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/프로그래머스 문제풀이</category>
      <category>c++ 프로그래머스 주식가격</category>
      <category>프로그래머스 주식가격</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/97</guid>
      <comments>https://igh01ti.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 8 Sep 2022 19:31:27 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 어린 왕자(1004번)</title>
      <link>https://igh01ti.tistory.com/96</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;1155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SYWbh/btrLKit6rid/YI6CNNnChN5ihuTr2nnnGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SYWbh/btrLKit6rid/YI6CNNnChN5ihuTr2nnnGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SYWbh/btrLKit6rid/YI6CNNnChN5ihuTr2nnnGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSYWbh%2FbtrLKit6rid%2FYI6CNNnChN5ihuTr2nnnGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1151&quot; height=&quot;1155&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;1155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhEZ1b/btrLKGBfDk8/PsCODkgftlAmue8kq8uT8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhEZ1b/btrLKGBfDk8/PsCODkgftlAmue8kq8uT8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhEZ1b/btrLKGBfDk8/PsCODkgftlAmue8kq8uT8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhEZ1b%2FbtrLKGBfDk8%2FPsCODkgftlAmue8kq8uT8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1165&quot; height=&quot;644&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&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;진입/이탈을 세는 &lt;u&gt;&lt;b&gt;매커니즘&lt;/b&gt;&lt;/u&gt;은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;출발점이 해당 행성계 안에 있는지 확인합니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도착점이 해당 행성계 안에 있는지 확인합니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출발,도착점 둘다 해당 행성계 안에 있거나 밖에 있는거 아니면 count를 증가시켜줍니다. (=진입/이탈횟수를 저장하는 변수)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1662628781528&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
#include&amp;lt;vector&amp;gt;
#include&amp;lt;tuple&amp;gt;
#include&amp;lt;cmath&amp;gt;

using namespace std;

int main()
{
    int t; //테스트케이스
    cin&amp;gt;&amp;gt;t;
    
    for(int i=0; i&amp;lt;t; i++)
    {
        int startX,startY,endX,endY;
        cin&amp;gt;&amp;gt;startX&amp;gt;&amp;gt;startY&amp;gt;&amp;gt;endX&amp;gt;&amp;gt;endY;
        pair&amp;lt;int,int&amp;gt; start=make_pair(startX,startY); //출발점
        pair&amp;lt;int,int&amp;gt; end=make_pair(endX,endY); //도착점
        
        int n; //행성계 갯수
        cin&amp;gt;&amp;gt;n;
        vector&amp;lt;tuple&amp;lt;int,int,int&amp;gt;&amp;gt; v; //행성계들의 (x,y,반지름) 이 저장됨
        for(int i=0; i&amp;lt;n; i++)
        {
            int x,y,r;
            cin&amp;gt;&amp;gt;x&amp;gt;&amp;gt;y&amp;gt;&amp;gt;r;
            v.push_back(make_tuple(x,y,r));
        }
        
        int count=0;
        for(int i=0; i&amp;lt;n; i++)
        {
            double distance_from_start=sqrt(pow(get&amp;lt;0&amp;gt;(v[i])-start.first,2)+pow(get&amp;lt;1&amp;gt;(v[i])-start.second,2));
            double distance_from_end=sqrt(pow(get&amp;lt;0&amp;gt;(v[i])-end.first,2)+pow(get&amp;lt;1&amp;gt;(v[i])-end.second,2));
            
            bool is_start_in_planet=distance_from_start &amp;lt; get&amp;lt;2&amp;gt;(v[i]); //출발점이 해당 행성계에 있는가
            bool is_end_in_planet=distance_from_end &amp;lt; get&amp;lt;2&amp;gt;(v[i]); //도착점이 해당 행성계에 있는가?
            
            if(is_start_in_planet!=is_end_in_planet) //출발,도착점중 하나는 행성계 안에 있고 하나는 밖에 있을때만 count++
                count++;
        }
        
        cout&amp;lt;&amp;lt;count&amp;lt;&amp;lt;&quot;\n&quot;;
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/백준 문제풀이</category>
      <category>c++ 백준 1004번</category>
      <category>c++ 어린왕자 백준</category>
      <category>백준 1004</category>
      <category>백준 어린왕자</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/96</guid>
      <comments>https://igh01ti.tistory.com/96#entry96comment</comments>
      <pubDate>Thu, 8 Sep 2022 18:21:08 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 리스트(List)</title>
      <link>https://igh01ti.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;튜플&lt;/b&gt;&lt;/u&gt;은 항목을 할당하고 나서 바꿀수없는 '불변(immutable)'한 성질을 갖습니다.&lt;/p&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;u&gt;&lt;b&gt;리스트&lt;/b&gt;&lt;/u&gt;는 그와 반대로 자유롭게 수정하거나 삭제할 수 있는 mutable한 성질을 갖습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;리스트 생성하기: [ ]또는 list()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662575629619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

empty_list=[] #빈 리스트 생성
empth_list_another=list() #빈 리스트 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 리스트는 값이 유일할 필요가 없습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;요소들이 순서는 상관없이 유일한 값으로만 유지될 필요가 있다면, &lt;br /&gt;리스트보단 &lt;b&gt;셋(set)&lt;/b&gt;을 사용하는 것이 더 좋습니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;슬라이스로 항목 추출&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662612895059&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

print(week[0:3]) #출력:['Monday', 'Tuesday', 'Wednesday']

print(week[::2]) #출력:['Monday', 'Wednesday', 'Friday', 'Sunday']

print(week[::-2]) #출력:['Sunday', 'Friday', 'Wednesday', 'Monday']

print(week[::-1]) #출력:['Sunday', 'Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;리스트 끝 항목 추가: append()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662612978847&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

week.append('good')
print(week) #출력:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'good']&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;특정 위치에 항목 추가: insert()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662613035329&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

week.insert(2,'good')
print(week) #출력:['Monday', 'Tuesday', 'good', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 인자로 오프셋을 주는데, 리스트의 끝을 넘는 오프셋을 주면 append()처럼 끝에다가 추가합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;오프셋으로 항목 삭제하기: del&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662616065145&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

del week[2]

print(week) #출력:['Monday', 'Tuesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;del은 리스트 함수가 아닌 파이썬 구문입니다.&lt;br /&gt;del은 할당(=)의 반대입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;값으로 항목 삭제하기: remove()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트에서 삭제할 항목의 위치를 모르는 경우, 값을 이용해서 삭제할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662616332113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

week.remove('Tuesday')

print(week) #출력:['Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;오프셋으로 항목을 얻은 후 삭제하기: pop()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662616403683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

print(week.pop()) #맨마지막인 Sunday삭제
print(week.pop(3)) #오프셋3번에 위치한 Thursday삭제
print(week) #출력:['Monday', 'Tuesday', 'Wednesday', 'Friday', 'Saturday']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pop()은 리스트에서 항목을 가져오는 동시에 그 항목을 삭제합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인자를 주지 않으면 -1을 사용합니다.(맨 끝)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;값으로 오프셋 찾기: index()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662616654572&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

print(week.index('Friday')) #출력:4&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;존재여부 확인: in&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662617240737&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

print('Sunday' in week) #출력:True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트에 값이 적어도 하나 존재하면 in은 True를 반환합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;값 세기: count()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662617363422&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test=['hi','hi','hi','hello',123]
print(test.count('hi')) #출력:3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트에 특정 값이 얼마나 있는지&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;리스트 병합하기: extend() 또는 +=&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662614130284&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday']
others=['hi','hello']
another=['world','python']

week.extend(others)
print(week) #출력:['Monday', 'Tuesday', 'hi', 'hello']


week+=another
print(week) #출력:['Monday', 'Tuesday', 'hi', 'hello', 'world', 'python']&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_1662614322452&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday']

a=100
other=['hello','hi']
week.append(a)
week.append(other)

print(week) #출력:['Monday', 'Tuesday', 100, ['hello', 'hi']]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 append()를 사용하면 항목을 병합하지 않고, 그 자체가 하나의 리스트로 추가됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(리스트는 다른 타입의 요소를 포함할 수 있습니다)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;정렬하기: sort(), sorted()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662620427342&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

week.sort()
print(week) #출력:['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday', 'Tuesday', 'Wednesday']

week.sort(reverse=True)
print(week) #출력:['Wednesday', 'Tuesday', 'Thursday', 'Sunday', 'Saturday', 'Monday', 'Friday']&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sort()는 리스트 자체를 내부적으로 정렬합니다.&lt;/li&gt;
&lt;li&gt;기본적으로 오름차순으로 정렬&lt;/li&gt;
&lt;li&gt;reverse=True를 추가하면 내림차순으로 정렬됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;항목 갯수 얻기: len()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662622630649&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

print(len(week)) #출력:7&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;할당: =, 복사: copy(), list()변환함수, 슬라이스[:]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662623037001&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a=[1,2,3]

b=a
print(b) #출력:[1, 2, 3]

b[0]='change'
print(b) #출력:['change', 2, 3]
print(a) #출력:['change', 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할점은&lt;u&gt;&lt;b&gt; b=a를 한 후에 b의 값을바꾸면 a의 값도 마찬가지로 변경&lt;/b&gt;&lt;/u&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;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_1662623294097&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a=[1,2,3]

b=a.copy()
print(b) #출력:[1, 2, 3]

c=list(a)
print(c) #출력:[1, 2, 3]

d=a[:]
print(d) #출력:[1, 2, 3]

b[0]='changeB'
c[0]='changeC'
d[0]='changeD'

print(a) #출력:[1, 2, 3]
print(b) #출력:['changeB', 2, 3]
print(c) #출력:['changeC', 2, 3]
print(d) #출력:['changeD', 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;copy() 함수&lt;/li&gt;
&lt;li&gt;list() 변환 함수&lt;/li&gt;
&lt;li&gt;슬라이스 [:]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용해서 한 리스트를 새로운 리스트로 복사할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들은 자신만의 값을 가진 새로운 객체입니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>파이선 추가 append()</category>
      <category>파이썬 copy()</category>
      <category>파이썬 count()</category>
      <category>파이썬 in</category>
      <category>파이썬 join()</category>
      <category>파이썬 len()</category>
      <category>파이썬 sort()</category>
      <category>파이썬 값 찾기</category>
      <category>파이썬 리스트</category>
      <category>파이썬 삭제</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/95</guid>
      <comments>https://igh01ti.tistory.com/95#entry95comment</comments>
      <pubDate>Thu, 8 Sep 2022 16:54:57 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 문자열 다루기</title>
      <link>https://igh01ti.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#string-methods&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문자열 함수에 관한 표준 문서 웹사이트&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662474417973&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;hello&quot;) #출력:hello

print('hello') #출력:hello

print(&quot;hello 'world'&quot;) #출력: hello 'world'

print('hello &quot;world&quot;') #출력: hello &quot;world&quot;



print(&quot;hello&quot; + &quot;world&quot;) #출력: helloworld

print(&quot;hello&quot;,&quot;world&quot;) #출력: hello world

print(&quot;hello&quot; &quot;world&quot;) #출력: helloworld&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 문자열을 ' ' 또는 &quot; &quot;로 감싸서 표현합니다.&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;이때 저 기호 자체를 문자열로 만들고싶다면 위 코드의 3,4번째같이 사용하면 됩니다.&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;+를 이용하여 두 문자열을 이어붙일수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662483668150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print('hello', end='%^&amp;amp;') 
print(&quot;world&quot;) 
#출력 : hello%^&amp;amp;world


print('hello', 'world', sep='-')
#출력: hello-world


f = open('test.txt', 'w')
print('hello world', file=f)
f.close()
#test.txt에 hello world가 저장됨


import sys
print('MyError', file=sys.stderr)
#표준에러처리로 MyError가 발생함&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;end 인자를 사용하면 print함수 마지막 효과를 변경할 수 있습니다. (기본값은 개행)&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;sep 인자를 사용하면 콤마로 구분된 문자열을 다르게 결합할 수 있습니다. (기본값은 공백)&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;file 인자를 사용하면 출력 결과를 파일, 표준에러처리로 보낼 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662484223283&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i = 123

f = 3.14

s = 'Hello'

print('i: %d, f: %f, s: %s' % (i, f, s))

#출력 : i: 123, f: 3.140000, s: Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어식 표현방법도 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;이스케이프 문자&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662484031398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;escape \'test&quot;) #출력 : escape 'test&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;복제하기: *&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662485061544&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;ha&quot; * 3) 
#출력: hahaha&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문자 추출: []&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662485137761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;abcdefg&quot;

print(string[0]) #출력:a

print(string[1]) #출력:b

print(string[-1]) #출력:g

print(string[-2]) #출력:f&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 왼쪽은 0, 오른쪽으로 1,2,3...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 오른쪽은 -1, 왼쪽으로 -2,-3,-4...&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;슬라이스: [start:end:step]&lt;/b&gt;&lt;/span&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;start는 시작 오프셋(맨 처음을 의미하는것이 아님. 이 자리에 들어오는 숫자가 시작지점이라는 뜻)을 의미,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;end는 끝 오프셋(맨 끝 말하는것이 아닌, 이 자리에 들어오는 숫자가 끝 지점이라는뜻)을 의미,(실제로는 이것 바로 앞까지를 의미함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step은 옵션.&lt;/p&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;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;[start:] start오프셋부터 끝까지 시퀀스를 추출한다&lt;/li&gt;
&lt;li&gt;[:end] 처음부터 (end-1)오프셋까지 시퀀스를 추출한다&lt;/li&gt;
&lt;li&gt;[start : end] start오프셋부터 (end-1) 오프셋까지 시퀀스를 추출한다&lt;/li&gt;
&lt;li&gt;[start:end:step] step만큼 문자를 건너뛰면서, start 오프셋부터 (end-1)오프셋까지 시퀀스를 추출한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1662485574816&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;abcdefg&quot;

print(string[1:2]) #출력: b

print(string[3::2]) #출력: df&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문자열 길이: len()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662486839170&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(len(&quot;abc&quot;)) #출력: 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스페이스와 줄바꿈도 포함된 길이가 나옵니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문자열 나누기: split()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662557874762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;ca t, do g, compu ter&quot;

print(string.split()) #출력: ['ca', 't,', 'do', 'g,', 'compu', 'ter']

print(string.split(&quot;,&quot;)) #출력: ['ca t', ' do g', ' compu ter']

a=string.split()
print(a[1]) #출력: t,&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 구분자를 기준으로 하나의 문자열을 작은 문자열들의&lt;u&gt;&lt;b&gt; 리스트&lt;/b&gt;&lt;/u&gt;로 나누기 위해서 문자열 내장함수 split()을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분자를 지정하지 않으면 split()은 문자열에 등장하는 공백 문자(줄바꿈,스페이스,탭)을 사용합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문자열로 결합하기: join()&lt;/b&gt;&lt;/span&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;join()함수는 split()함수의 반대입니다.&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;join()함수는 문자열 리스트를 하나의 문자열로 결합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662563241192&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string_list=['hello','world','python']

join_string='#'.join(string_list)

print(join_string) #출력: hello#world#python&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문자열 정렬( center(), ljust(), rjust() )&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662574433139&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;hello world&quot;

print(string.center(30)) #출력:         hello world          

print(string.ljust(30)) #출력:hello world                   

print(string.rjust(30)) #출력:                   hello world&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;p data-ke-size=&quot;size16&quot;&gt;center,ljust,rjust가 있음&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;대체하기: replace()&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662574751736&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;hello world hello world hello world&quot;

print(string.replace(&quot;hello&quot;,&quot;hi&quot;,2)) #출력:hi world hi world hello world&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;그 외 다양한 함수&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662567069759&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;hello world&quot;

print(string.startswith(&quot;he&quot;)) #출력: True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startswith() : 특정 문자로 시작하는지 여부를 출력해줌&lt;/p&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;pre id=&quot;code_1662567177548&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;hello world&quot;

print(string.endswith(&quot;orld&quot;)) #출력: True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;endswith() : 특정 문자로 끝나는지 여부를 출력해줌&lt;/p&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;pre id=&quot;code_1662568192221&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;is is is is&quot;

print(string.find(&quot;is&quot;)) #출력: 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;find(): 특정 문자가 &lt;u&gt;첫번째로 나오는 오프셋&lt;/u&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;pre id=&quot;code_1662568282689&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;is is is is&quot;

print(string.rfind(&quot;is&quot;)) #출력: 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rfind(): 특정 문자가 &lt;u&gt;마지막으로 나오는 오프셋&lt;/u&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;pre id=&quot;code_1662568328207&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;is is is is&quot;

print(string.count(&quot;is&quot;)) #출력: 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;count(): 특정 문자가 몇 번 나오는지 출력해줌&lt;/p&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;pre id=&quot;code_1662568392535&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;this is *&quot;
print(string.isalnum()) #출력: False


Ironman=&quot;ILoveYou3000&quot;
print(Ironman.isalnum()) #출력: True

Ironman=&quot;I Love You3000&quot;
print(Ironman.isalnum()) #출력: False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isalnum():&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662574236701&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string=&quot;hello world this is PYTHON..!..&quot;


print(string.strip('.')) #출력: hello world this is PYTHON..!

print(string.capitalize()) #출력: Hello world this is python..!..

print(string.title()) #출력: Hello World This Is Python..!..

print(string.upper()) #출력: HELLO WORLD THIS IS PYTHON..!..

print(string.lower()) #출력: hello world this is python..!..

print(string.swapcase()) #출력: HELLO WORLD THIS IS python..!..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strip(): 양끝에서 특정 시퀀스를 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;capitalize(): 첫 단어를 대문자로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;title(): 모든 단어의 첫글자를 대문자로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upper(): 모두 대문자로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lower(): 모두 소문자로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;swapcase(): 대문자는 소문자로, 소문자는 대문자로&lt;/p&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;&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;</description>
      <category>Python</category>
      <category>파이썬 문자열</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/94</guid>
      <comments>https://igh01ti.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 7 Sep 2022 02:08:35 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준-터렛(1002번)</title>
      <link>https://igh01ti.tistory.com/93</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;1025&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buiLXj/btrLqdAAOHF/jpE1mQy0xvgwuk2Ylgen3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buiLXj/btrLqdAAOHF/jpE1mQy0xvgwuk2Ylgen3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buiLXj/btrLqdAAOHF/jpE1mQy0xvgwuk2Ylgen3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuiLXj%2FbtrLqdAAOHF%2FjpE1mQy0xvgwuk2Ylgen3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1155&quot; height=&quot;1025&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;1025&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662393000656&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int t;
cin&amp;gt;&amp;gt;t;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 테스트케이스의 갯수 T를 입력받습니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662393025399&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   int x1,y1,r1,x2,y2,r2;
   for (int i = 0; i &amp;lt; t; i++)
   {
      cin&amp;gt;&amp;gt;x1&amp;gt;&amp;gt;y1&amp;gt;&amp;gt;r1&amp;gt;&amp;gt;x2&amp;gt;&amp;gt;y2&amp;gt;&amp;gt;r2;
      double distance=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
      
      ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x1,y1,r1&amp;nbsp; &amp;nbsp;x2,y2,r2값을 입력받고, 두 원의 중심 사이의 거리를 distance에 저장합니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662393074115&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//원이 겹칠떄
if (distance == 0 &amp;amp;&amp;amp; r1 == r2)
	cout &amp;lt;&amp;lt; -1&amp;lt;&amp;lt;&quot;\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원이 겹칠때 교점이 무한개이므로 -1을 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662393113517&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//원이 한점에서 만날때
else if (distance == r1 + r2 || distance + (r1 &amp;gt; r2 ? r2 : r1) == (r1 &amp;gt; r2 ? r1 : r2))
	cout &amp;lt;&amp;lt; 1&amp;lt;&amp;lt;&quot;\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2PIbt/btrLqWTbPvQ/HsP8H3HdRVHuSkhxv0vRYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2PIbt/btrLqWTbPvQ/HsP8H3HdRVHuSkhxv0vRYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2PIbt/btrLqWTbPvQ/HsP8H3HdRVHuSkhxv0vRYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2PIbt%2FbtrLqWTbPvQ%2FHsP8H3HdRVHuSkhxv0vRYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;715&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;715&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distance ==r1+r2 는 왼쪽의 상황,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distance + (r1 &amp;gt; r2 ? r2 : r1) == (r1 &amp;gt; r2 ? r1 : r2) 는 오른쪽의 상황을 의미합니다.&lt;/p&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;pre id=&quot;code_1662393246641&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//원이 아예 안만날때
else if (distance &amp;gt; r1 + r2 || distance + (r1 &amp;gt; r2 ? r2 : r1) &amp;lt; (r1 &amp;gt; r2 ? r1 : r2))
	cout &amp;lt;&amp;lt; 0&amp;lt;&amp;lt;&quot;\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQXgf/btrLtZIA1WH/pniXckxvQkzj1TRfQNqR4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQXgf/btrLtZIA1WH/pniXckxvQkzj1TRfQNqR4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQXgf/btrLtZIA1WH/pniXckxvQkzj1TRfQNqR4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQXgf%2FbtrLtZIA1WH%2FpniXckxvQkzj1TRfQNqR4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;842&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distance &amp;gt; r1 + r2는 왼쪽 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distance + (r1 &amp;gt; r2 ? r2 : r1) &amp;lt; (r1 &amp;gt; r2 ? r1 : r2)는 오른쪽 상황입니다.&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;이때 원이 완전히 겹치는 경우에도 distance + (r1 &amp;gt; r2 ? r2 : r1) &amp;lt; (r1 &amp;gt; r2 ? r1 : r2) &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞서서 원이 겹치는건 if문으로 먼저 처리를 해주었기 때문에 따로 처리를 해주지 않아도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;pre id=&quot;code_1662393507804&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//원이 2점에서 만날때
else
	cout &amp;lt;&amp;lt; 2&amp;lt;&amp;lt;&quot;\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외 나머지 상황은 원이 2점에서 만나는 것이기때문에 2를 출력해줍니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 테스트케이스 t만큼 반복해주면 됩니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662393648414&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
#include&amp;lt;cmath&amp;gt;
#include&amp;lt;math.h&amp;gt;
using namespace std;

int main()
{
   int t;
   cin&amp;gt;&amp;gt;t;
   int x1,y1,r1,x2,y2,r2;
   for (int i = 0; i &amp;lt; t; i++)
   {
      cin&amp;gt;&amp;gt;x1&amp;gt;&amp;gt;y1&amp;gt;&amp;gt;r1&amp;gt;&amp;gt;x2&amp;gt;&amp;gt;y2&amp;gt;&amp;gt;r2;
      double distance=sqrt(pow(x1-x2,2)+pow(y1-y2,2));

      //원이 겹칠떄
      if (distance == 0 &amp;amp;&amp;amp; r1 == r2)
         cout &amp;lt;&amp;lt; -1&amp;lt;&amp;lt;&quot;\n&quot;;
      //원이 한점에서 만날때
      else if (distance == r1 + r2 || distance + (r1 &amp;gt; r2 ? r2 : r1) == (r1 &amp;gt; r2 ? r1 : r2))
         cout &amp;lt;&amp;lt; 1&amp;lt;&amp;lt;&quot;\n&quot;;
      //원이 아예 안만날때
      else if (distance &amp;gt; r1 + r2 || distance + (r1 &amp;gt; r2 ? r2 : r1) &amp;lt; (r1 &amp;gt; r2 ? r1 : r2))
         cout &amp;lt;&amp;lt; 0&amp;lt;&amp;lt;&quot;\n&quot;;
      //원이 2점에서 만날때
      else
         cout &amp;lt;&amp;lt; 2&amp;lt;&amp;lt;&quot;\n&quot;;
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종코드입니다.&lt;/p&gt;</description>
      <category>알고리즘/백준 문제풀이</category>
      <category>c++ 터렛</category>
      <category>백준 c++ 터렛</category>
      <category>백준 터렛</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/93</guid>
      <comments>https://igh01ti.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 6 Sep 2022 01:01:31 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 올바른 괄호 (Lv.2)</title>
      <link>https://igh01ti.tistory.com/92</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2328&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKS6UY/btrLihXAOOH/jCC5JLrIwtIhy1KENdIV0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKS6UY/btrLihXAOOH/jCC5JLrIwtIhy1KENdIV0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKS6UY/btrLihXAOOH/jCC5JLrIwtIhy1KENdIV0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKS6UY%2FbtrLihXAOOH%2FjCC5JLrIwtIhy1KENdIV0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2328&quot; height=&quot;1174&quot; data-origin-width=&quot;2328&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQ8us/btrLmyRx2Gv/6EQaaxCsTSDVTJKRk7WQsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQ8us/btrLmyRx2Gv/6EQaaxCsTSDVTJKRk7WQsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQ8us/btrLmyRx2Gv/6EQaaxCsTSDVTJKRk7WQsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQ8us%2FbtrLmyRx2Gv%2F6EQaaxCsTSDVTJKRk7WQsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;726&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&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;고려해야할 핵심 내용은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신의 작업이 완료되었을때 자기 앞의 모든 일이 완료되어야만 배포 가능하다.( 아니면 대기 )&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이를 다음과 같은 매커니즘으로 풀었습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각 progresses에 for문을 사용해서 해당하는 speeds를 더해줍니다. (for문을 한바퀴 다 돌때마다 day가 하루씩 지난다는 생각)&lt;/li&gt;
&lt;li&gt;만약 progresses의 어떤 작업이 &lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;100이상&lt;/b&gt;&lt;/span&gt;이 되었다면 작업이 끝났다는 것인데 이때 해당 작업의 위치의 &lt;b&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;인덱스가 0일때&lt;/span&gt;&lt;/b&gt;만 해당 날짜에 배포된 처리를 해줍니다. = 벡터에서 erase해줍니다.&lt;/li&gt;
&lt;li&gt;for문을 한번 다 돌았을때 배포된 작업의 갯수가 0이 아니라면 aws벡터(reuturn 예정인 벡터)에 push_back해줍니다.&lt;/li&gt;
&lt;li&gt;만약 배포된 작업의 갯수가 총 작업의 갯수와 같아진다면 반복문을 종료하고 return해줍니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 구현하면 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662349019406&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; progresses, vector&amp;lt;int&amp;gt; speeds) {
    int complete=0; //완료된 작업의 갯수
    int progresses_num=progresses.size();
    vector&amp;lt;int&amp;gt; aws;
    while(complete!=progresses_num) //작업이 모두 완료 될때까지 while문 실행
    {
        int limit=progresses.size();
        int temp=0; //해당 날짜에 배포된 작업의 갯수
        for(int i=0; i&amp;lt;limit; i++)
        {
            progresses[i]=progresses[i]+speeds[i];
            if(progresses[i]&amp;gt;=100 &amp;amp;&amp;amp; i==0) //해당 작업이 완료되었고 앞에 작업이 꿑나서 erase된 상태라면
            {
                temp++;
                progresses.erase(progresses.begin()+i);
                speeds.erase(speeds.begin()+i);
                i--; //벡터에서 erase해줬으므로 i--를 해주고 그 다음에 i++하게됨으로 정상작동
                limit--; 
                complete++;
            }
        }
        if(temp!=0) //1개 이상 배포된 날일때만 push_back해줌
            aws.push_back(temp);
    }
    return aws;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/프로그래머스 문제풀이</category>
      <category>C++ 기능개발</category>
      <category>프로그래머스 c++ 기능개발</category>
      <category>프로그래머스 기능개발</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/92</guid>
      <comments>https://igh01ti.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 5 Sep 2022 12:46:15 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 소숫점 고정해서 출력하기</title>
      <link>https://igh01ti.tistory.com/91</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;소숫점 고정&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662303819138&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout&amp;lt;&amp;lt;fixed; 
cout.setf(ios::fixed);&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;보통 윗 방법으로 많이 쓰는 것 같습니다.&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;u&gt;&lt;b&gt;기본적으로 소숫점 6자리까지 출력이 됩니다&lt;/b&gt;&lt;/u&gt;. (소숫점 7자리에서 반올림함)&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1662303959562&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
   double r=1.123456789;
   cout&amp;lt;&amp;lt;fixed;
   cout&amp;lt;&amp;lt;r;
}

//출력 결과: 1.123457&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;소숫점 자릿수 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662304026745&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout.precision(7); //소숫점 7자리까지 표현. (소숫점 8자리에서 반올림함)&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #c1bef9;&quot;&gt;&lt;b&gt;소숫점 고정 해제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662304125607&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout.unsetf(ios::fixed);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C++/기타</category>
      <category>c++ 소수</category>
      <category>c++ 소숫점</category>
      <category>c++ 소숫점 자리수</category>
      <category>c++ 소숫점고정</category>
      <author>게임 개발자(진)</author>
      <guid isPermaLink="true">https://igh01ti.tistory.com/91</guid>
      <comments>https://igh01ti.tistory.com/91#entry91comment</comments>
      <pubDate>Mon, 5 Sep 2022 00:10:31 +0900</pubDate>
    </item>
  </channel>
</rss>