<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>fullstack</title>
    <link>https://cpp11.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 21:54:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bugwasd</managingEditor>
    <item>
      <title>blender에서 3d nft random generate 하는 법</title>
      <link>https://cpp11.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;FZRandomizer 3버전을 사용하여 blender에서 3d nft를 random generate 하는 법을 알아보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 다음 링크에서 FZRandomizer 3를 무료로 다운받아줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fruitzeus.gumroad.com/l/FZRandomizer&quot;&gt;https://fruitzeus.gumroad.com/l/FZRandomizer&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670074916401&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;gumroad:product&quot; data-og-title=&quot;FZRandomizer 3&quot; data-og-description=&quot;FZRandomizer is a blender addon which allows you to randomize characters &amp;amp; other mesh objects.READ ME:Terms &amp;amp; Conditions&quot; data-og-host=&quot;fruitzeus.gumroad.com&quot; data-og-source-url=&quot;https://fruitzeus.gumroad.com/l/FZRandomizer&quot; data-og-url=&quot;https://fruitzeus.gumroad.com/l/FZRandomizer&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PrRA6/hyQMwUl59W/6UkMq0KVibomPF2FaxcLNK/img.png?width=1005&amp;amp;height=414&amp;amp;face=0_0_1005_414&quot;&gt;&lt;a href=&quot;https://fruitzeus.gumroad.com/l/FZRandomizer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fruitzeus.gumroad.com/l/FZRandomizer&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PrRA6/hyQMwUl59W/6UkMq0KVibomPF2FaxcLNK/img.png?width=1005&amp;amp;height=414&amp;amp;face=0_0_1005_414');&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;FZRandomizer 3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FZRandomizer is a blender addon which allows you to randomize characters &amp;amp; other mesh objects.READ ME:Terms &amp;amp; Conditions&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fruitzeus.gumroad.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 FZRandomizer_3_0_3.py 와 같은 파이썬 파일을 하나 받게됩니다&lt;/p&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;그럼 이제 blender에서&amp;nbsp;Edit - Preferences 로 들어간 뒤, Add-ons 탭을 선택해 줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 Install an add-on 버튼을 눌러 아까 받은 파일을 인스톨 해주면 됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.44.48.png&quot; data-origin-width=&quot;2086&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDwXKr/btrSIr6l4jN/8S53I3IKhZpe2a5OvTiSa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDwXKr/btrSIr6l4jN/8S53I3IKhZpe2a5OvTiSa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDwXKr/btrSIr6l4jN/8S53I3IKhZpe2a5OvTiSa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDwXKr%2FbtrSIr6l4jN%2F8S53I3IKhZpe2a5OvTiSa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;290&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.44.48.png&quot; data-origin-width=&quot;2086&quot; data-origin-height=&quot;1180&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;그럼 다음과 같이 FZRandomizer 가 추가된 것을 볼 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체크박스가 표시되어 있어야 합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.48.42.png&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQ8Jn/btrSKvNgRiD/eRjMy7CQWfcH7h0NW0b6Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQ8Jn/btrSKvNgRiD/eRjMy7CQWfcH7h0NW0b6Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQ8Jn/btrSKvNgRiD/eRjMy7CQWfcH7h0NW0b6Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQ8Jn%2FbtrSKvNgRiD%2FeRjMy7CQWfcH7h0NW0b6Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;298&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.48.42.png&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 blender 뷰포트의 오른쪽상단을 보면 다음과 같이 FZRandomizer 탭이 추가된 것을 볼 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.51.29.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8CM9/btrSJYPAPIx/3k2vuZZVXmx89AV0USOzgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8CM9/btrSJYPAPIx/3k2vuZZVXmx89AV0USOzgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8CM9/btrSJYPAPIx/3k2vuZZVXmx89AV0USOzgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8CM9%2FbtrSJYPAPIx%2F3k2vuZZVXmx89AV0USOzgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;315&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.51.29.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;548&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;먼저 Host Builder를 눌러줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Host Builder를 이용하면 collection을 정의하여 자동으로 collection을 구성할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Host Name을 입력후 Add Subcollection 버튼으로 추가하고 싶은 Subcollection을 추가해 줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서는 간단하게 head와 body만 추가해 보았습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.54.46.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjYpuH/btrSJXC9JnM/2gENFBN4KPUjGLDTFRwVN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjYpuH/btrSJXC9JnM/2gENFBN4KPUjGLDTFRwVN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjYpuH/btrSJXC9JnM/2gENFBN4KPUjGLDTFRwVN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjYpuH%2FbtrSJXC9JnM%2F2gENFBN4KPUjGLDTFRwVN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;195&quot; data-filename=&quot;스크린샷 2022-12-03 오후 10.54.46.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.02.31.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emURzF/btrSKvfqZD7/YHkXs52xCvawSasi4Ph1kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emURzF/btrSKvfqZD7/YHkXs52xCvawSasi4Ph1kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emURzF/btrSKvfqZD7/YHkXs52xCvawSasi4Ph1kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemURzF%2FbtrSKvfqZD7%2FYHkXs52xCvawSasi4Ph1kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.02.31.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;388&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;그럼 다음과 같이 collection이 생성된것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기에 각각 부위별 모델을 넣고 generate 하면 됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.01.41.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTi0no/btrSLZ1x6fD/oKVtV9LtXZ8FHKqnn3ufMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTi0no/btrSLZ1x6fD/oKVtV9LtXZ8FHKqnn3ufMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTi0no/btrSLZ1x6fD/oKVtV9LtXZ8FHKqnn3ufMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTi0no%2FbtrSLZ1x6fD%2FoKVtV9LtXZ8FHKqnn3ufMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;134&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.01.41.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;134&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;이제 FZRandomizer 항목을 열어보겠습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.10.26.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;1076&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSmcl/btrSJEqkiYF/9UUdFsnf4LmBkKgiD6RmR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSmcl/btrSJEqkiYF/9UUdFsnf4LmBkKgiD6RmR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSmcl/btrSJEqkiYF/9UUdFsnf4LmBkKgiD6RmR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSmcl%2FbtrSJEqkiYF%2F9UUdFsnf4LmBkKgiD6RmR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;1076&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.10.26.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;1076&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;- unique 체크박스 표시&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;- GENERATE 버튼&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;- Variants &lt;span&gt;조절&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;몇개를 추출할 것인지 값을 설정해 줍니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Calculate Possibilities 버튼&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Rarity&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;카테고리안의 각각 오브젝트들의 확률을 조절합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Rules&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;규칙을 도입하여 배치할 수 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를들면, 특정오브젝트에는 어떤 특정오브젝트가 꼭 같이 나오도록 혹은 나오지않도록 설정할 수 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Metadata&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이미지와 같이 추출할 Metadata에 대한 설정을 할 수 있습니다&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;- Output&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Output Path를 설정하고 렌더링을 진행합니다&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;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 랜덤조합으로 모델을 추출해보고 렌더링 이미지에 해당 구성요소 정보를 포함하는 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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.37.03.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czT2mf/btrSHYDpIvV/GMPPJAhB7wzMoRiKMYKb9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czT2mf/btrSHYDpIvV/GMPPJAhB7wzMoRiKMYKb9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czT2mf/btrSHYDpIvV/GMPPJAhB7wzMoRiKMYKb9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczT2mf%2FbtrSHYDpIvV%2FGMPPJAhB7wzMoRiKMYKb9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;336&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.37.03.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 간단하게 큐브의 각도를 조절하여 body 2개와 head 3개로 조합으로 만들어 보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.41.17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCiYDT/btrSHJGmCwv/F9crvOVAmGbbv3wrAnK641/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCiYDT/btrSHJGmCwv/F9crvOVAmGbbv3wrAnK641/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCiYDT/btrSHJGmCwv/F9crvOVAmGbbv3wrAnK641/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCiYDT%2FbtrSHJGmCwv%2FF9crvOVAmGbbv3wrAnK641%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;226&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.41.17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 Calculate Possibillities 버튼을 눌러보면 현재 나올수 있는 조합 갯수 2X3 이므로 6개로 표시됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Varuants도 최대치인 6으로 설정하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.40.37.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whJdx/btrSJYoyO0P/bWoLU6rVmJxA7OMZhUh32K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whJdx/btrSJYoyO0P/bWoLU6rVmJxA7OMZhUh32K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whJdx/btrSJYoyO0P/bWoLU6rVmJxA7OMZhUh32K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhJdx%2FbtrSJYoyO0P%2FbWoLU6rVmJxA7OMZhUh32K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;343&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.40.37.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 Metadata 항목에서 Write To JSON을 체크하여 JSON파일을 뽑을수 있도록 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Field 를 추가해 주어야 하는데 저는 name 과 attributes를 추가하였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 name에는 #1, #2, #3 이런식으로 순서번호가 이름으로 들어갈수 있게 하기위해&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인덱스가 들어갈 위치에 __VAR를 추가해주면 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 attributes 라고 추가를 하면 값에 [attributes] 라고 들어가게 되는데 여기엔 조합된 속성 정보가 자동으로 들어가게 됩니다&lt;/p&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;
&lt;pre id=&quot;code_1670078998122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;#1&quot;,
    &quot;attributes&quot;: [
        {
            &quot;trait_type&quot;: &quot;body&quot;,
            &quot;value&quot;: &quot;body2&quot;
        },
        {
            &quot;trait_type&quot;: &quot;head&quot;,
            &quot;value&quot;: &quot;head2&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;Rarity 나 Rules에 대한 자세한 설명은 생략하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 설정이 완료되었다면 GENERATE 버튼을 눌러줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 Variants라는 collection이 생성이되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 키프레임을 움직이면 생성된 모델들을 볼 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.52.34.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2q49F/btrSHV7GhNP/zkTXrtwEk6blZXwnbmbYxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2q49F/btrSHV7GhNP/zkTXrtwEk6blZXwnbmbYxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2q49F/btrSHV7GhNP/zkTXrtwEk6blZXwnbmbYxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2q49F%2FbtrSHV7GhNP%2FzkTXrtwEk6blZXwnbmbYxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;238&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.52.34.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.52.27.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brpWlo/btrSHWFDQP3/NiZLE4URADmcogy5hxJmI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brpWlo/btrSHWFDQP3/NiZLE4URADmcogy5hxJmI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brpWlo/btrSHWFDQP3/NiZLE4URADmcogy5hxJmI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrpWlo%2FbtrSHWFDQP3%2FNiZLE4URADmcogy5hxJmI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.52.27.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;826&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;또한, 설정된 경로에 metadata라는 폴더가 생성되고 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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.58.49.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0mAQ4/btrSJawmbps/KKh00WhX5cwhDCKMEsGgl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0mAQ4/btrSJawmbps/KKh00WhX5cwhDCKMEsGgl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0mAQ4/btrSJawmbps/KKh00WhX5cwhDCKMEsGgl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0mAQ4%2FbtrSJawmbps%2FKKh00WhX5cwhDCKMEsGgl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;304&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.58.49.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Output에서 Path를 설정해 주고 Still Images를 선택합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Render Variants를 눌러주면 렌더링을 시작합니다&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-filename=&quot;스크린샷 2022-12-03 오후 11.58.35.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6p7A/btrSJXb7JK4/QO2O6ffVjC5nKTjR15wtTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6p7A/btrSJXb7JK4/QO2O6ffVjC5nKTjR15wtTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6p7A/btrSJXb7JK4/QO2O6ffVjC5nKTjR15wtTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6p7A%2FbtrSJXb7JK4%2FQO2O6ffVjC5nKTjR15wtTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;255&quot; data-filename=&quot;스크린샷 2022-12-03 오후 11.58.35.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;548&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;</description>
      <category>Web3</category>
      <category>Blender</category>
      <category>FZRandomizer</category>
      <category>generate</category>
      <category>nft</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/80</guid>
      <comments>https://cpp11.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 4 Dec 2022 00:02:21 +0900</pubDate>
    </item>
    <item>
      <title>[Unity]  RequireComponent</title>
      <link>https://cpp11.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RequireComponent는 게임 오브젝트에 꼭 필요한 컴포넌트를 스크립트로 작성하여 추가하는 것 입니다&lt;/p&gt;
&lt;pre id=&quot;code_1668760225826&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[RequireComponent (typeof (Rigidbody))]&lt;/code&gt;&lt;/pre&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;다음은 예제 코드입니다&lt;/p&gt;
&lt;pre id=&quot;code_1668760106115&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

// PlayerScript requires the GameObject to have a Rigidbody component
[RequireComponent (typeof (Rigidbody))]
public class PlayerScript : MonoBehaviour {
	Rigidbody rb;
	
	void Start() {
		rb = GetComponent&amp;lt;Rigidbody&amp;gt;();
	}
	void FixedUpdate()  {
		rb.AddForce(Vector3.up);
	}
}&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;이제 게임 오브젝트에 위 스크립트를 추가하면, Rigidbody 컴포넌트가 자동으로 추가되는 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 게임 오브젝트의 Rigidbody 컴포넌트를 Remove Component 하려고 하면&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-filename=&quot;스크린샷 2022-11-18 오후 5.37.05.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWBODr/btrRzFXI6HR/1P9N3seJLxOjcnjhquKVe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWBODr/btrRzFXI6HR/1P9N3seJLxOjcnjhquKVe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWBODr/btrRzFXI6HR/1P9N3seJLxOjcnjhquKVe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWBODr%2FbtrRzFXI6HR%2F1P9N3seJLxOjcnjhquKVe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;214&quot; data-filename=&quot;스크린샷 2022-11-18 오후 5.37.05.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity</category>
      <category>RequireComponent</category>
      <category>unity</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/79</guid>
      <comments>https://cpp11.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 18 Nov 2022 17:40:04 +0900</pubDate>
    </item>
    <item>
      <title>[Solidity] 함수제어자 modifier</title>
      <link>https://cpp11.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;contract의 소유자만 호출할 수 있는 함수를 만들고 싶다고 가정해봅시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 첫 줄에 require문을 넣어 처리할 수도 있지만 더욱 좋은 방법은 함수제어자를 사용하는 것 입니다&lt;/p&gt;
&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_1668344474630&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수제어자는 위와같이 function 키워드 대신 modifier 키워드를 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 require 등으로 실행조건을 체크하고, 마지막에는 _; 으로 끝나야 합니다&lt;/p&gt;
&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_1668344833370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function withdraw() external onlyOwner {
  owner.transfer(this.balance);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 만든 함수제어자 onlyOwner를 함수에 붙여주었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 withdraw 함수가 호출되면 함수제어자 onlyOwner가 실행되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수제어자 내부의 _; 부분에서 함수로 되돌아와 함수가 실행되게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 함수는 contract의 소유자만이 호출할 수 있는 함수가 되었습니다&lt;/p&gt;
&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>Web3/Solidity</category>
      <category>modifier</category>
      <category>solidity</category>
      <category>함수제어자</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/78</guid>
      <comments>https://cpp11.tistory.com/78#entry78comment</comments>
      <pubDate>Sun, 13 Nov 2022 22:15:54 +0900</pubDate>
    </item>
    <item>
      <title>[Solidity] 상속, 다중상속, 함수 오버라이드(override)</title>
      <link>https://cpp11.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Solidity의 contract는 객체지향언어에서의 class와 닮은 점이 많습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중 상속에 대해서도 매우 유사한 형태를 보입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상속&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속은 다음과 같이 사용하면 됩니다&lt;/p&gt;
&lt;pre id=&quot;code_1668007180013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract Doge {
  function catchphrase() public returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return &quot;Such Moon BabyDoge&quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;contract 이름 뒤에 is 키워드를 이용하여 뒤에 상속받을 부모 contract의 이름을 써주면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 자식 contract는 상속받은 부모 contract의 모든 public 변수와 함수에 접근이 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다중 상속&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중상속은 다음과 같이 사용하면 됩니다&lt;/p&gt;
&lt;pre id=&quot;code_1668007679623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract MomDoge {
  function catchphrase() public returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract DadDoge {
  function catchphrase() public returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract BabyDoge is MomDoge, DadDoge {
  function anotherCatchphrase() public returns (string) {
    return &quot;Such Moon BabyDoge&quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 상속받은 부모 contract가 있다면 뒤에 ','를 붙여 구분하여 다중상속을 할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 오버라이드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속을 받으면 부모의 public함수에 접근이 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 부모의 함수의 이름과 같은 이름과 매개변수를 사용하여 함수를 재정의 하고 싶을 때가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 함수 오버라이드(Override)라고 합니다&lt;/p&gt;
&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_1668008575510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract MomDoge {
  function catchphrase() public virtual returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract BabyDoge is MomDoge {
  function catchphrase() public override returns (string) {
    return &quot;Such Moon BabyDoge&quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 contract의 함수에서는 virtual을 자식 contract의 함수에서는 override를 명시해 주면 됩니다&lt;/p&gt;
&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;다음과 같이 괄호를 사용하여 해당 함수를 가진 contract들을 명시해 주어야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668008860630&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract MomDoge {
  function catchphrase() public virtual returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract DadDoge {
  function catchphrase() public virtual returns (string) {
    return &quot;So Wow CryptoDoge&quot;;
  }
}

contract BabyDoge is MomDoge, DadDoge {
  function catchphrase() public override(MomDoge, DadDoge) returns (string) {
    return &quot;Such Moon BabyDoge&quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web3/Solidity</category>
      <category>override</category>
      <category>solidity</category>
      <category>다중상속</category>
      <category>상속</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/77</guid>
      <comments>https://cpp11.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 10 Nov 2022 00:49:02 +0900</pubDate>
    </item>
    <item>
      <title>[Solidity] error handler (require, assert, revert)</title>
      <link>https://cpp11.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Solidity의 에러 핸들러에는 require, assert, revert 세가지가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 어떤 경우에 사용하는지, 어떻게 사용하는지 알아보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;require&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;require는 특정 조건이 참이 아니라면 에러 메시지를 발생하고 실행을 멈춥니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;require로 에러를 발생시키면 사용하려던 gas를 환불 시켜 줍니다&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_1667838214913&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;require(msg.value % 2 == 0, &quot;Even value required.&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;assert&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;assert는 특정 조건이 참이 아니라면 에러를 발생시켜 실행을 멈춥니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;assert는 gas를 환불 시켜 주지 않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 내부적 코드결함이 있는지 확인하는데 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(오버플로우나 언더플로우 등 치명적인 문제를 찾을 때 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용방법은 다음과 같습니다&lt;/p&gt;
&lt;pre id=&quot;code_1667838576054&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; assert(address(this).balance == balanceBeforeTransfer - msg.value / 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;revert&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;revert는 조건없이 에러를 발생시킬 때 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;require와 마찬가지로 에러를 발생시키면 사용하려던 gas를 환불 시켜 줍니다&lt;/p&gt;
&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_1667838648486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;revert(&quot;Not enough Ether provided.&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;revert를 사용하려면 어쨋든 특정 조건문 안에 넣어야 하는데, 이는 require로 대체가 되기 때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 require가 사용되고 revert는 잘 사용되지 않습니다&lt;/p&gt;</description>
      <category>Web3/Solidity</category>
      <category>assert</category>
      <category>error handler</category>
      <category>require</category>
      <category>revert</category>
      <category>solidity</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/76</guid>
      <comments>https://cpp11.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 8 Nov 2022 01:43:32 +0900</pubDate>
    </item>
    <item>
      <title>[Solidity] view, pure 함수</title>
      <link>https://cpp11.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;contract를 만들때 중요하게 생각해야 하는 것 중 하나가 가스비용 최적화입니다&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;이 때 필요한 것이 view 함수입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view 함수는 function 밖의 변수를 읽기만 할 뿐, 변경할 수 없습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 view 함수를 쓰는 것은 블록체인에 어떤 트랜젝션도 만들지 않는다는 것을 의미 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view 함수는 사용자에 의해 외부에서 호출되었을 경우 가스를 전혀 소모하지 않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(내부에서 다른 함수에 의해 호출되었을 경우 가스를 소모할 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 여기에 접근제어자 중 외부에서만 호출할 수 있게하는 exturnal을 같이 사용한다면&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;/p&gt;
&lt;pre id=&quot;code_1667744090511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function func() exturnal view {
	...
}&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;pure 함수는 view 함수보다 조금 더 빡센(?) 함수입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view 함수가 읽기만 가능하다면, pure 함수는 읽기 조차도 불가능 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web3/Solidity</category>
      <category>Pure</category>
      <category>solidity</category>
      <category>view</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/75</guid>
      <comments>https://cpp11.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 6 Nov 2022 23:25:52 +0900</pubDate>
    </item>
    <item>
      <title>[Solidity] 접근 제어자 (public, private, internal, external)</title>
      <link>https://cpp11.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;접근 제어자는 함수가 언제, 어디서 호출될 수 있는지 제어합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Solidity에서 접근 제어자의 종류는 다음과 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;public&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 contract의 내외부 모두에서, 어디서든지 호출될 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;private&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 contract의 내부의 다른 함수들에 의해서만 호출될 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;internal&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 contract의 내부 혹은, 해당 contract를 상속하는 다른 contract에서도 호출될 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;external&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 오직 contract 외부에서만 호출될 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web3/Solidity</category>
      <category>external</category>
      <category>internal</category>
      <category>private</category>
      <category>public</category>
      <category>solidity</category>
      <category>접근제어자</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/74</guid>
      <comments>https://cpp11.tistory.com/74#entry74comment</comments>
      <pubDate>Sat, 5 Nov 2022 16:05:19 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Mac OS 에서 .DS_Store 파일 제거하기</title>
      <link>https://cpp11.tistory.com/73</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;pre id=&quot;code_1663509679654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dir = &quot;color&quot;
imagePaths = [os.path.join(dir,file_name) for file_name in os.listdir(dir)]&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;그래서 imagePaths 에 불러온 파일들을 프로세싱하려고 보니 다음과 같은 오류가 발생하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PIL.UnidentifiedImageError:&amp;nbsp;cannot&amp;nbsp;identify&amp;nbsp;image&amp;nbsp;file&amp;nbsp;'color/.DS_Store'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;imagePaths 안에 .jpg나 .png같은 이미지 파일이 아닌 .DS_Store 파일이 들어가서 문제가 된 것인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.DS_Store 파일은 mac os 에서 자동으로 생성하는 메타데이터 파일이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에 다음과 같은 코드를 추가하여 .DS_Store 파일은 지워주어 해결하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663510009131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if dir + '/.DS_Store' in imagePaths:
    imagePaths.remove(dir + '/.DS_Store')&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>Language/Python</category>
      <category>.DS_Store</category>
      <category>Mac</category>
      <category>Python</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/73</guid>
      <comments>https://cpp11.tistory.com/73#entry73comment</comments>
      <pubDate>Sun, 18 Sep 2022 23:09:00 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Json 파일 간단하게 Class 변환하기 (Json.NET)</title>
      <link>https://cpp11.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Json.NET을 이용하여 Json 파일을 간단하게 Class 로 변환할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Json.NET 에셋스토어에서 받을 수 있다&lt;/p&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;
&lt;pre id=&quot;code_1613198768094&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;level&quot; : 0,
    &quot;coin&quot; : 0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음에는 이 정보를 파싱할 Class도 만들어 보자&lt;/p&gt;
&lt;pre id=&quot;code_1613198886977&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Serializable]
class Data
{
    int level;
    int coin;
}&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;주의할 점은 Class 에 [&lt;span&gt;Serializable] 를 붙여 직렬화 해 주어야 하고, 변수명을 서로 맞춰 주어야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1613199081052&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TextAsset jsonData = Resources.Load(&quot;Json/Data&quot;) as TextAsset;
_data = JsonUtility.FromJson&amp;lt;GameData&amp;gt;(jsonData.ToString());&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 파일은 Resources 경로에 Json/Data.json 으로 저장하여 간단하게 Resources.Load 를 이용하여 불러와 보았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 사용하면 Json Object를 생성하여 일일히 파싱하는 번거로움을 줄일 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class를 다시 Json으로 변환할때는&amp;nbsp;&lt;span&gt;JsonUtility&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ToJson(_data) 이런식으로 사용할 수 있다&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;</description>
      <category>Unity</category>
      <category>json</category>
      <category>Json.net</category>
      <category>unity</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/72</guid>
      <comments>https://cpp11.tistory.com/72#entry72comment</comments>
      <pubDate>Sat, 13 Feb 2021 15:59:04 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 디바이스 경로에 파일 입출력하기 (Application.persistentDataPath)</title>
      <link>https://cpp11.tistory.com/71</link>
      <description>&lt;p&gt;게임정보를 저장할 때 PlayerPrefabs를 쓰면 쉽고 편리하게 정보를 저장할 수 있지만, 조금 복잡하고 많은 데이터를 저장해야 할 때에는 PlayerPrefabs는 한계가 있습니다&lt;/p&gt;
&lt;p&gt;이럴 때에는 xml 이나 json 파일을 만들어서 디바이스 내부에 파일로 정보를 저장하는 것이 좋습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 파일입출력을 사용하기위해서 다음과 같은 namespace를 추가해 줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1613197774542&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저는 Json파일을 생성하여 저장정보를 저장하겠습니다&lt;/p&gt;
&lt;p&gt;이를 위해서 JsonUtility를 사용하였습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;디바이스의 저장경로는 Application.persistentDataPath 로 얻어오면 됩니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 파일을 쓰는 로직입니다&lt;/p&gt;
&lt;pre id=&quot;code_1613198026733&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;File.WriteAllText(Application.persistentDataPath + &quot;/UserData.json&quot;, JsonUtility.ToJson(_data));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음은 파일을 읽는 로직입니다&lt;/p&gt;
&lt;pre id=&quot;code_1613198096516&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (File.Exists(Application.persistentDataPath + &quot;/UserData.json&quot;))
{
    string json = File.ReadAllText(Application.persistentDataPath + &quot;/UserData.json&quot;);
    _data = JsonUtility.FromJson&amp;lt;Data&amp;gt;(json);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 예제는 최대한 간단하게 입출력만 한 예제이고, 보안을 위해서 파일을 저장할 떄 암호화를 해주면 더욱 좋습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>bugwasd</author>
      <guid isPermaLink="true">https://cpp11.tistory.com/71</guid>
      <comments>https://cpp11.tistory.com/71#entry71comment</comments>
      <pubDate>Sat, 13 Feb 2021 15:36:44 +0900</pubDate>
    </item>
  </channel>
</rss>