<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>심심한 작자 Mi:sAng</title>
    <link>https://misang.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 07:45:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Mi:sAng</managingEditor>
    <image>
      <title>심심한 작자 Mi:sAng</title>
      <url>https://tistory1.daumcdn.net/tistory/4916038/attach/44d13623e0a64bf7a13ff306db606518</url>
      <link>https://misang.tistory.com</link>
    </image>
    <item>
      <title>타일 회전 방법</title>
      <link>https://misang.tistory.com/401</link>
      <description>&lt;h2 data-end=&quot;106&quot; data-start=&quot;72&quot; data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;타일 팔레트에서 회전하기 (타일맵 작업 중)&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;278&quot; data-start=&quot;107&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;139&quot; data-start=&quot;107&quot;&gt;&lt;b&gt;Tile Palette&lt;/b&gt; 창에서 브러시 선택&lt;/li&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;140&quot;&gt;타일 찍기 전에 &lt;b&gt;단축키&lt;/b&gt; 사용:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;278&quot; data-start=&quot;167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;194&quot; data-start=&quot;167&quot;&gt;[ : 시계 반대 방향으로 90도 회전&lt;/li&gt;
&lt;li data-end=&quot;222&quot; data-start=&quot;198&quot;&gt;] : 시계 방향으로 90도 회전&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;226&quot;&gt;X : 좌우 반전 (Flip X)&lt;/li&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;254&quot;&gt;Y : 상하 반전 (Flip Y)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/401</guid>
      <comments>https://misang.tistory.com/401#entry401comment</comments>
      <pubDate>Thu, 28 Aug 2025 05:09:33 +0900</pubDate>
    </item>
    <item>
      <title>타일셋 제작 방법</title>
      <link>https://misang.tistory.com/400</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.타일셋 화질 깨지는 현상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://snow8village.tistory.com/135&quot;&gt;https://snow8village.tistory.com/135&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756322771736&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;에이스프라이트 파일이 깨져보일 때 해결방법(Resize)&quot; data-og-description=&quot;에이스프라이트로 열심히 만들고 저장했는데 너무 작고 또 확대해 보니 깨져 보일 때 해결하는 방법입니다.&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 문제 상황&amp;nbsp;&amp;nbsp;저장을 하고 파일을 열어보니 너무 작게 보이고, 확대해 보니까 &quot; data-og-host=&quot;snow8village.tistory.com&quot; data-og-source-url=&quot;https://snow8village.tistory.com/135&quot; data-og-url=&quot;https://snow8village.tistory.com/135&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/H5d3m/hyZC2j048g/fTo0JCOyhkkl5r3vjfqROk/img.jpg?width=800&amp;amp;height=582&amp;amp;face=293_241_468_416,https://scrap.kakaocdn.net/dn/C82X4/hyZGgt8Wee/zhDIKKi6riKHlKOH6qgbQK/img.jpg?width=800&amp;amp;height=582&amp;amp;face=293_241_468_416,https://scrap.kakaocdn.net/dn/cYehWV/hyZGf24GVP/NvQTIRRvDRcF8XTePpUD2K/img.jpg?width=1200&amp;amp;height=873&amp;amp;face=0_0_1200_873&quot;&gt;&lt;a href=&quot;https://snow8village.tistory.com/135&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://snow8village.tistory.com/135&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/H5d3m/hyZC2j048g/fTo0JCOyhkkl5r3vjfqROk/img.jpg?width=800&amp;amp;height=582&amp;amp;face=293_241_468_416,https://scrap.kakaocdn.net/dn/C82X4/hyZGgt8Wee/zhDIKKi6riKHlKOH6qgbQK/img.jpg?width=800&amp;amp;height=582&amp;amp;face=293_241_468_416,https://scrap.kakaocdn.net/dn/cYehWV/hyZGf24GVP/NvQTIRRvDRcF8XTePpUD2K/img.jpg?width=1200&amp;amp;height=873&amp;amp;face=0_0_1200_873');&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;에이스프라이트 파일이 깨져보일 때 해결방법(Resize)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에이스프라이트로 열심히 만들고 저장했는데 너무 작고 또 확대해 보니 깨져 보일 때 해결하는 방법입니다.&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 문제 상황&amp;nbsp;&amp;nbsp;저장을 하고 파일을 열어보니 너무 작게 보이고, 확대해 보니까&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;snow8village.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.타일셋 출력방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/shorts/sn9QBTZ8CU4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/shorts/sn9QBTZ8CU4&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/shorts/sn9QBTZ8CU4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cGpNht/hyZDaCkUkz/pHzEvck75GR9NmRGccjKuk/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/d2wBES/hyZCYaRzSs/qgZrpDsMsia2aUVGDSkg51/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;How to Export a Tileset in Aseprite (QUICK &amp;amp; EASY)&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/sn9QBTZ8CU4&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.타일맵 스프라이트 슬라이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dIQhKAChg2U&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=dIQhKAChg2U&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=dIQhKAChg2U&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bfySC1/hyZC5OyNvs/V9LKnyquKDr8Tt3mMMqSRk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bOHZSe/hyZDLINwQH/eCDiDxJWfuRlGcnIx356z0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Unity 2D - How to split/slice a spritesheet&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/dIQhKAChg2U&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/400</guid>
      <comments>https://misang.tistory.com/400#entry400comment</comments>
      <pubDate>Thu, 28 Aug 2025 04:28:12 +0900</pubDate>
    </item>
    <item>
      <title>4.픽셀이 깨지는 현상 해결 방법</title>
      <link>https://misang.tistory.com/399</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;픽셀이&amp;nbsp;깨지는&amp;nbsp;현상&amp;nbsp;해결방법&amp;gt; &lt;br /&gt;픽셀퍼펙트 &lt;br /&gt;&lt;br /&gt;1.Window-Package&amp;nbsp;Manager&amp;nbsp;가서 &lt;br /&gt;2d&amp;nbsp;pixel&amp;nbsp;perfect&amp;nbsp;찾으면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;2.hierarchy-Main&amp;nbsp;Camera에&amp;nbsp;pixel&amp;nbsp;perfect&amp;nbsp;camera&amp;nbsp;컴포넌트&amp;nbsp;있으니&amp;nbsp;추가해라 &lt;br /&gt;Assets&amp;nbsp;Pixels&amp;nbsp;per&amp;nbsp;Unit은&amp;nbsp;에셋으로&amp;nbsp;불러온&amp;nbsp;도트&amp;nbsp;이미지가&amp;nbsp;몇&amp;nbsp;픽셀인지&amp;nbsp;쓰고 &lt;br /&gt;해상도는&amp;nbsp;잘&amp;nbsp;맞춰서&amp;nbsp;쓴다.&lt;/p&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/399</guid>
      <comments>https://misang.tistory.com/399#entry399comment</comments>
      <pubDate>Fri, 22 Aug 2025 06:23:14 +0900</pubDate>
    </item>
    <item>
      <title>3.플레이어 캐릭터 설정하기</title>
      <link>https://misang.tistory.com/398</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;플레이어 캐릭터 설정하기&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2D&amp;nbsp;게임&amp;nbsp;기준 &lt;br /&gt;1.GameObject&amp;nbsp;생성&amp;nbsp; &lt;br /&gt;2.오브젝트&amp;nbsp;내부에&amp;nbsp;Sprite&amp;nbsp;Renderer&amp;nbsp;추가,&amp;nbsp;플레이어&amp;nbsp;이미지&amp;nbsp;넣기 &lt;br /&gt;(여기에&amp;nbsp;넣는&amp;nbsp;이미지는&amp;nbsp;Sprite만&amp;nbsp;가능,&amp;nbsp;타일은&amp;nbsp;안됨) &lt;br /&gt;(Sprite&amp;nbsp;Renderer는&amp;nbsp;&quot;2D&amp;nbsp;이미지를&amp;nbsp;화면에&amp;nbsp;그려주는&amp;nbsp;컴포넌트&quot;.) &lt;br /&gt;(따라서&amp;nbsp;Sprite&amp;nbsp;Renderer는&amp;nbsp;Sprite&amp;nbsp;타입만&amp;nbsp;받지,&amp;nbsp;Texture나&amp;nbsp;Tile&amp;nbsp;Asset&amp;nbsp;자체는&amp;nbsp;직접&amp;nbsp;못&amp;nbsp;넣어.) &lt;br /&gt;&lt;br /&gt;3.Rigidbody2D&amp;nbsp;추가&amp;nbsp;:&amp;nbsp;물리&amp;nbsp;연산(중력,&amp;nbsp;이동)적용 &lt;br /&gt;4.Collider2D(BoxCollider2D,&amp;nbsp;CircleCollider2D등)&amp;nbsp;:&amp;nbsp;충돌판정 &lt;br /&gt;5.PlayerController&amp;nbsp;스크립트&amp;nbsp;:&amp;nbsp;이동,점프,공격.&amp;nbsp;같은&amp;nbsp;동작&amp;nbsp;제어 &lt;/p&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/398</guid>
      <comments>https://misang.tistory.com/398#entry398comment</comments>
      <pubDate>Fri, 22 Aug 2025 06:22:47 +0900</pubDate>
    </item>
    <item>
      <title>2.유니티 컴포넌트 정리</title>
      <link>https://misang.tistory.com/397</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[&amp;nbsp;유니티&amp;nbsp;컴포넌트&amp;nbsp;정리&amp;nbsp;] &lt;br /&gt;유니티에서&amp;nbsp;컴포넌트는&amp;nbsp;게임&amp;nbsp;오브젝트(GameObhect)에&amp;nbsp;붙는&amp;nbsp;기능(속성+동작)단위이다. &lt;br /&gt;&amp;ldquo;GameObject는&amp;nbsp;껍데기,&amp;nbsp;Component는&amp;nbsp;실제&amp;nbsp;기능&amp;rdquo;&amp;nbsp;이라고&amp;nbsp;보면&amp;nbsp;이해가&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;기본 &lt;br /&gt;-&amp;nbsp;Transform&amp;nbsp;:&amp;nbsp;위치(Position),&amp;nbsp;회전(Rotation),&amp;nbsp;크기(Scale) &lt;br /&gt;-&amp;nbsp;RectTransform&amp;nbsp;:&amp;nbsp;UI&amp;nbsp;오브젝트&amp;nbsp;전용&amp;nbsp;Transform&amp;nbsp;(Anchors,&amp;nbsp;Pivot,&amp;nbsp;레이아웃&amp;nbsp;지원) &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;렌더링(Rendering) &lt;br /&gt;-&amp;nbsp;Sprite&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;2D&amp;nbsp;이미지&amp;nbsp;표시 &lt;br /&gt;-&amp;nbsp;Mesh&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;3D&amp;nbsp;모델&amp;nbsp;메시&amp;nbsp;표시 &lt;br /&gt;-&amp;nbsp;Skinned&amp;nbsp;Mesh&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;본&amp;nbsp;애니메이션이&amp;nbsp;적용된&amp;nbsp;메시&amp;nbsp;(캐릭터) &lt;br /&gt;-&amp;nbsp;Line&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;직선/곡선&amp;nbsp;라인&amp;nbsp;표시 &lt;br /&gt;-&amp;nbsp;Trail&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;잔상/궤적&amp;nbsp;효과 &lt;br /&gt;-&amp;nbsp;Particle&amp;nbsp;System&amp;nbsp;:&amp;nbsp;파티클&amp;nbsp;효과&amp;nbsp;(불꽃,&amp;nbsp;연기&amp;nbsp;등) &lt;br /&gt;-&amp;nbsp;Canvas&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;UI&amp;nbsp;전용&amp;nbsp;렌더러 &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;물리&amp;nbsp;(Physics) &lt;br /&gt;[3D&amp;nbsp;물리] &lt;br /&gt;-&amp;nbsp;Rigidbody&amp;nbsp;:&amp;nbsp;중력,&amp;nbsp;힘,&amp;nbsp;속도&amp;nbsp;등&amp;nbsp;물리&amp;nbsp;적용 &lt;br /&gt;-&amp;nbsp;Collider&amp;nbsp;계열&amp;nbsp;:&amp;nbsp;Box,&amp;nbsp;Sphere,&amp;nbsp;Capsule,&amp;nbsp;Mesh&amp;nbsp;Collider &lt;br /&gt;-&amp;nbsp;Character&amp;nbsp;Controller&amp;nbsp;:&amp;nbsp;3D&amp;nbsp;캐릭터&amp;nbsp;전용&amp;nbsp;충돌체 &lt;br /&gt;&lt;br /&gt;[2D&amp;nbsp;물리] &lt;br /&gt;-&amp;nbsp;Rigidbody2D &lt;br /&gt;-&amp;nbsp;Collider2D&amp;nbsp;계열&amp;nbsp;:&amp;nbsp;Box,&amp;nbsp;Circle,&amp;nbsp;Capsule,&amp;nbsp;Edge,&amp;nbsp;Polygon&amp;nbsp;Collider2D &lt;br /&gt;-&amp;nbsp;Composite&amp;nbsp;Collider2D&amp;nbsp;:&amp;nbsp;여러&amp;nbsp;콜라이더를&amp;nbsp;합침 &lt;br /&gt;-&amp;nbsp;Effector2D&amp;nbsp;계열&amp;nbsp;:&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Platform&amp;nbsp;Effector2D&amp;nbsp;(일방향&amp;nbsp;발판) &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Buoyancy&amp;nbsp;Effector2D&amp;nbsp;(부력) &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;UI&amp;nbsp;(User&amp;nbsp;Interface) &lt;br /&gt;-&amp;nbsp;Canvas&amp;nbsp;:&amp;nbsp;모든&amp;nbsp;UI는&amp;nbsp;Canvas&amp;nbsp;하위에서&amp;nbsp;표시 &lt;br /&gt;-&amp;nbsp;Canvas&amp;nbsp;Scaler&amp;nbsp;:&amp;nbsp;해상도&amp;nbsp;비율&amp;nbsp;조정 &lt;br /&gt;-&amp;nbsp;Event&amp;nbsp;System&amp;nbsp;:&amp;nbsp;UI&amp;nbsp;입력&amp;nbsp;이벤트&amp;nbsp;처리 &lt;br /&gt;-&amp;nbsp;UI&amp;nbsp;기본&amp;nbsp;요소&amp;nbsp;:&amp;nbsp;Text,&amp;nbsp;TextMeshPro,&amp;nbsp;Image,&amp;nbsp;Button,&amp;nbsp;Toggle,&amp;nbsp;Slider,&amp;nbsp;Dropdown,&amp;nbsp;Scroll&amp;nbsp;Rect,&amp;nbsp;Input&amp;nbsp;Field,&amp;nbsp;Mask,&amp;nbsp;Layout&amp;nbsp;Group&amp;nbsp;계열&amp;nbsp;(Vertical,&amp;nbsp;Horizontal,&amp;nbsp;Grid) &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;오디오(Audio) &lt;br /&gt;-&amp;nbsp;Audio&amp;nbsp;Source&amp;nbsp;:&amp;nbsp;소리&amp;nbsp;재생&amp;nbsp;(BGM,&amp;nbsp;효과음) &lt;br /&gt;-&amp;nbsp;Audio&amp;nbsp;Listener&amp;nbsp;:&amp;nbsp;귀&amp;nbsp;역할&amp;nbsp;(보통&amp;nbsp;카메라에&amp;nbsp;붙음) &lt;br /&gt;-&amp;nbsp;Audio&amp;nbsp;Reverb&amp;nbsp;Zone&amp;nbsp;:&amp;nbsp;반향&amp;nbsp;효과 &lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;타일맵/그리드 &lt;br /&gt;-&amp;nbsp;Grid&amp;nbsp;:&amp;nbsp;타일&amp;nbsp;좌표계 &lt;br /&gt;-&amp;nbsp;Tilemap&amp;nbsp;:&amp;nbsp;타일이&amp;nbsp;실제로&amp;nbsp;배치되는&amp;nbsp;레이어 &lt;br /&gt;-&amp;nbsp;Tilemap&amp;nbsp;Renderer&amp;nbsp;:&amp;nbsp;타일&amp;nbsp;시각화 &lt;br /&gt;-&amp;nbsp;Tilemap&amp;nbsp;Collider&amp;nbsp;2D&amp;nbsp;:&amp;nbsp;타일&amp;nbsp;충돌&amp;nbsp;영역&amp;nbsp;자동&amp;nbsp;생성 &lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;애니메이션(Animation) &lt;br /&gt;-&amp;nbsp;Animator&amp;nbsp;:&amp;nbsp;애니메이션&amp;nbsp;상태머신&amp;nbsp;제어 &lt;br /&gt;-&amp;nbsp;Animation&amp;nbsp;:&amp;nbsp;단순&amp;nbsp;애니메이션&amp;nbsp;재생 &lt;br /&gt;-&amp;nbsp;Animator&amp;nbsp;Override&amp;nbsp;Controller&amp;nbsp;:&amp;nbsp;애니메이션&amp;nbsp;클립&amp;nbsp;교체 &lt;br /&gt;-&amp;nbsp;Playable&amp;nbsp;Director&amp;nbsp;:&amp;nbsp;타임라인&amp;nbsp;애니메이션&amp;nbsp;제어 &lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;조명/카메라 &lt;br /&gt;-&amp;nbsp;Camera&amp;nbsp;:&amp;nbsp;게임&amp;nbsp;화면을&amp;nbsp;찍는&amp;nbsp;눈 &lt;br /&gt;-&amp;nbsp;Light&amp;nbsp;:&amp;nbsp;Directional,&amp;nbsp;Point,&amp;nbsp;Spot,&amp;nbsp;Area&amp;nbsp;Light &lt;br /&gt;-&amp;nbsp;Light&amp;nbsp;Probe&amp;nbsp;Group&amp;nbsp;:&amp;nbsp;빛&amp;nbsp;정보&amp;nbsp;보간 &lt;br /&gt;-&amp;nbsp;Reflection&amp;nbsp;Probe&amp;nbsp;:&amp;nbsp;반사&amp;nbsp;효과 &lt;br /&gt;&lt;br /&gt;9.&amp;nbsp;네비게이션/AI &lt;br /&gt;-&amp;nbsp;NavMesh&amp;nbsp;Agent&amp;nbsp;:&amp;nbsp;AI&amp;nbsp;이동&amp;nbsp;및&amp;nbsp;길찾기 &lt;br /&gt;-&amp;nbsp;NavMesh&amp;nbsp;Obstacle&amp;nbsp;:&amp;nbsp;길찾기&amp;nbsp;방해물 &lt;br /&gt;&lt;br /&gt;10.&amp;nbsp;효과/렌더링&amp;nbsp;심화 &lt;br /&gt;-&amp;nbsp;Projector&amp;nbsp;:&amp;nbsp;특정&amp;nbsp;영역에&amp;nbsp;이미지&amp;nbsp;투사 &lt;br /&gt;-&amp;nbsp;Lens&amp;nbsp;Flare&amp;nbsp;:&amp;nbsp;빛&amp;nbsp;번쩍&amp;nbsp;효과 &lt;br /&gt;-&amp;nbsp;Skybox&amp;nbsp;:&amp;nbsp;하늘&amp;nbsp;배경 &lt;br /&gt;-&amp;nbsp;Post-process&amp;nbsp;Volume&amp;nbsp;:&amp;nbsp;Bloom,&amp;nbsp;Blur&amp;nbsp;같은&amp;nbsp;후처리&amp;nbsp;효과 &lt;br /&gt;&lt;br /&gt;11.&amp;nbsp;네트워크/멀티플레이&amp;nbsp;(구버전) &lt;br /&gt;-&amp;nbsp;Network&amp;nbsp;Identity&amp;nbsp;:&amp;nbsp;네트워크&amp;nbsp;오브젝트&amp;nbsp;식별 &lt;br /&gt;-&amp;nbsp;Network&amp;nbsp;Transform&amp;nbsp;:&amp;nbsp;위치/회전&amp;nbsp;동기화 &lt;br /&gt;-&amp;nbsp;Network&amp;nbsp;Animator&amp;nbsp;:&amp;nbsp;애니메이션&amp;nbsp;동기화 &lt;br /&gt;&lt;br /&gt;12.&amp;nbsp;스크립트 &lt;br /&gt;-&amp;nbsp;MonoBehaviour&amp;nbsp;기반&amp;nbsp;Script&amp;nbsp;:&amp;nbsp;사용자가&amp;nbsp;작성하는&amp;nbsp;C#&amp;nbsp;코드&amp;nbsp;(Start,&amp;nbsp;Update,&amp;nbsp;OnTriggerEnter&amp;nbsp;등&amp;nbsp;생명주기&amp;nbsp;함수&amp;nbsp;사용) &lt;br /&gt;&lt;br /&gt;13.&amp;nbsp;기타&amp;nbsp;유틸리티 &lt;br /&gt;-&amp;nbsp;LOD&amp;nbsp;Group&amp;nbsp;:&amp;nbsp;Level&amp;nbsp;of&amp;nbsp;Detail&amp;nbsp;(멀리&amp;nbsp;있으면&amp;nbsp;저품질&amp;nbsp;모델로&amp;nbsp;교체) &lt;br /&gt;-&amp;nbsp;Occlusion&amp;nbsp;Culling&amp;nbsp;:&amp;nbsp;가려진&amp;nbsp;오브젝트는&amp;nbsp;렌더링&amp;nbsp;안&amp;nbsp;함 &lt;br /&gt;-&amp;nbsp;Rigidbody&amp;nbsp;Constraints&amp;nbsp;:&amp;nbsp;특정&amp;nbsp;축&amp;nbsp;고정 &lt;br /&gt;-&amp;nbsp;Gizmo&amp;nbsp;:&amp;nbsp;편집기에서&amp;nbsp;보조&amp;nbsp;시각화 &lt;br /&gt;&lt;br /&gt;-------------------------------------- &lt;br /&gt;[핵심&amp;nbsp;요약] &lt;br /&gt;-&amp;nbsp;보이는&amp;nbsp;것&amp;nbsp;:&amp;nbsp;Renderer&amp;nbsp;계열 &lt;br /&gt;-&amp;nbsp;움직이는&amp;nbsp;것&amp;nbsp;:&amp;nbsp;Rigidbody &lt;br /&gt;-&amp;nbsp;충돌&amp;nbsp;처리&amp;nbsp;:&amp;nbsp;Collider &lt;br /&gt;-&amp;nbsp;UI&amp;nbsp;:&amp;nbsp;Canvas&amp;nbsp;+&amp;nbsp;UI&amp;nbsp;요소 &lt;br /&gt;-&amp;nbsp;애니메이션&amp;nbsp;:&amp;nbsp;Animator &lt;br /&gt;-&amp;nbsp;AI/길찾기&amp;nbsp;:&amp;nbsp;NavMesh&amp;nbsp;Agent &lt;br /&gt;-&amp;nbsp;효과&amp;nbsp;:&amp;nbsp;Particle,&amp;nbsp;Trail,&amp;nbsp;Line&amp;nbsp;Renderer &lt;br /&gt;-&amp;nbsp;코드&amp;nbsp;:&amp;nbsp;Script &lt;/p&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/397</guid>
      <comments>https://misang.tistory.com/397#entry397comment</comments>
      <pubDate>Fri, 22 Aug 2025 06:22:08 +0900</pubDate>
    </item>
    <item>
      <title>1. 타일 맵을 까는 법</title>
      <link>https://misang.tistory.com/396</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;유니티 : 타일맵 깔기&amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;1.Hierarchy에&amp;nbsp;Tilemap&amp;nbsp;오브젝트를&amp;nbsp;추가한다.&amp;nbsp;(&amp;nbsp;우클릭-Create-2d-Tilemap&amp;nbsp;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;2.Assets&amp;nbsp;폴더에&amp;nbsp;TileMap&amp;nbsp;폴더를&amp;nbsp;추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;3.생성한&amp;nbsp;TileMap폴더에&amp;nbsp;Tile&amp;nbsp;Palette을&amp;nbsp;추가한다(&amp;nbsp;우클릭-Create-2d-Tile&amp;nbsp;Palette)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;4.RuleTile같은 특정한 기능이 있는 타일이 필요한 경우 Assets-TileMap에서 추가한다. (우클릭-Create-2d-Tile)&lt;br /&gt;팔레트는&amp;nbsp;말&amp;nbsp;그대로&amp;nbsp;그림을&amp;nbsp;그리는&amp;nbsp;화가가&amp;nbsp;물감을&amp;nbsp;짜놓는&amp;nbsp;곳이다.&amp;nbsp; &lt;br /&gt;타일을&amp;nbsp;올려두고&amp;nbsp;TileMap&amp;nbsp;오브젝트에&amp;nbsp;이것을&amp;nbsp;써넣을지&amp;nbsp;말지를&amp;nbsp;정하는&amp;nbsp;것이다. &lt;br /&gt;따라서&amp;nbsp;사용할&amp;nbsp;타일이나&amp;nbsp;스프라이트를&amp;nbsp;팔레트에&amp;nbsp;드래그한다. &lt;br /&gt;&lt;br /&gt;*TileMap에서&amp;nbsp;타일&amp;nbsp;2개&amp;nbsp;이상&amp;nbsp;작업할때는&amp;nbsp;FocusOn&amp;nbsp;기능이&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;TileMap을 겹쳐서 사용하는 방법&amp;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;size18&quot;&gt;1.Grid&amp;nbsp;및에&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;Tilemap&amp;nbsp;생성&amp;nbsp; &lt;br /&gt;Hierarchy에 Tilemap 오브젝트를 여러개 추가하여 지면,건물, 호수 등등 으로 나눠서 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2.Order&amp;nbsp;In&amp;nbsp;layer로&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;&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;b&gt;&amp;lt;기능이 있는 Tile&amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;*RuleTile은&amp;nbsp;규칙있는&amp;nbsp;타일 &lt;br /&gt;*Animated&amp;nbsp;Tile은&amp;nbsp;Tile을&amp;nbsp;시간에&amp;nbsp;맞춰&amp;nbsp;교차시켜서&amp;nbsp;애니메이션&amp;nbsp;보여주는&amp;nbsp;것 &lt;br /&gt;*Rigidbody2D,&amp;nbsp;Composite&amp;nbsp;Collider2D,&amp;nbsp;TileMap&amp;nbsp;Collider2D&amp;nbsp;이용해서&amp;nbsp;타일맵의&amp;nbsp;경계를&amp;nbsp;설정해준다. &lt;br /&gt;이때&amp;nbsp;경계는&amp;nbsp;타일을&amp;nbsp;깔고&amp;nbsp;안&amp;nbsp;부분을&amp;nbsp;경계로&amp;nbsp;삼는다.&amp;nbsp;이때&amp;nbsp;TileMap&amp;nbsp;Renderer-Mask&amp;nbsp;Interaction&amp;nbsp;쓴다 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>6_Project/유니티 게임 개발</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/396</guid>
      <comments>https://misang.tistory.com/396#entry396comment</comments>
      <pubDate>Fri, 22 Aug 2025 06:21:28 +0900</pubDate>
    </item>
    <item>
      <title>2.WPF 레이아웃 사용법</title>
      <link>https://misang.tistory.com/325</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Grid의 기능&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 1).Grid라인 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ShowGridLines =&quot;True&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;&lt;b&gt;&amp;nbsp; 2). 행과 열 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -1.행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Grid.RowDefinitions 선언후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; RowDefinition 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -2.열&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Grid.ColumnDefinitions 선언후&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ColumnDefinition 선언&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 3). Grid의 행과 열의 병합&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Grid.RowSpan =&quot;2&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Grid.ColumnSpan =&quot;2&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;&lt;b&gt;&amp;nbsp;4). Grid 내부에 컨트롤 추가 및 Margin&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;&amp;nbsp;5). Grid 내부의 컨트롤의 정렬&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; HorizontalAlignment = &quot;Top&quot;&amp;nbsp; (Top,Bottom, Left, Right 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; VerticalAlignment = &quot;Top&quot; &amp;nbsp; (Top,Bottom, Left, Right 가능)&lt;/p&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxqt52/btsL4WDkzBl/iv1KXb5q6CEkxLJnuPth31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxqt52/btsL4WDkzBl/iv1KXb5q6CEkxLJnuPth31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxqt52/btsL4WDkzBl/iv1KXb5q6CEkxLJnuPth31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxqt52%2FbtsL4WDkzBl%2Fiv1KXb5q6CEkxLJnuPth31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;492&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;492&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;863&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1HHaC/btsL23c3Z2W/YzlXk1oWwkr7AUjJiI6U6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1HHaC/btsL23c3Z2W/YzlXk1oWwkr7AUjJiI6U6K/img.png&quot; data-alt=&quot;ShowGridLines 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1HHaC/btsL23c3Z2W/YzlXk1oWwkr7AUjJiI6U6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1HHaC%2FbtsL23c3Z2W%2FYzlXk1oWwkr7AUjJiI6U6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;308&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ShowGridLines 설정&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;870&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UacWK/btsL4PRPBZM/V4uy0PK0Kg8VTy9JOi4V4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UacWK/btsL4PRPBZM/V4uy0PK0Kg8VTy9JOi4V4K/img.png&quot; data-alt=&quot;Margin을 넣은것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UacWK/btsL4PRPBZM/V4uy0PK0Kg8VTy9JOi4V4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUacWK%2FbtsL4PRPBZM%2FV4uy0PK0Kg8VTy9JOi4V4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;299&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Margin을 넣은것&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;850&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btwESK/btsL4FPt2HY/YtlwfZZDoDp4HVhhj2xqqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btwESK/btsL4FPt2HY/YtlwfZZDoDp4HVhhj2xqqK/img.png&quot; data-alt=&quot;Grid.RowSpan과 ColumnSpan을 사용한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btwESK/btsL4FPt2HY/YtlwfZZDoDp4HVhhj2xqqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtwESK%2FbtsL4FPt2HY%2FYtlwfZZDoDp4HVhhj2xqqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;306&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Grid.RowSpan과 ColumnSpan을 사용한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qy6us/btsL5ttZmtS/vGRBK22gpqHSQ4E0y3dDb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qy6us/btsL5ttZmtS/vGRBK22gpqHSQ4E0y3dDb0/img.png&quot; data-alt=&quot;HorizontalAlignment사용한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qy6us/btsL5ttZmtS/vGRBK22gpqHSQ4E0y3dDb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqy6us%2FbtsL5ttZmtS%2FvGRBK22gpqHSQ4E0y3dDb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;338&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HorizontalAlignment사용한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA65ge/btsL3qsgx6j/KwTjqES2Jwm3iL30IxdKC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA65ge/btsL3qsgx6j/KwTjqES2Jwm3iL30IxdKC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA65ge/btsL3qsgx6j/KwTjqES2Jwm3iL30IxdKC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA65ge%2FbtsL3qsgx6j%2FKwTjqES2Jwm3iL30IxdKC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;716&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;716&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.StackPanel&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -쌓아올리는 느낌의 레이아웃이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -StackPanel안에 또 다른 StackPanel을 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -Orientation은 정렬되는 방향이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그리 많은 내용이 있지는 않다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3nUhU/btsL3PrKXLH/HSwSAfCk184yRy6t7xW4dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3nUhU/btsL3PrKXLH/HSwSAfCk184yRy6t7xW4dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3nUhU/btsL3PrKXLH/HSwSAfCk184yRy6t7xW4dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3nUhU%2FbtsL3PrKXLH%2FHSwSAfCk184yRy6t7xW4dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;460&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;460&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;686&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tctCq/btsL5k43cDW/x2vkAEKKDhU1f3cWzLAR1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tctCq/btsL5k43cDW/x2vkAEKKDhU1f3cWzLAR1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tctCq/btsL5k43cDW/x2vkAEKKDhU1f3cWzLAR1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtctCq%2FbtsL5k43cDW%2Fx2vkAEKKDhU1f3cWzLAR1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;699&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;699&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.WrapPanel&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt; WrapPanel은 창을 늘리거나 줄이면 변한다. &lt;/span&gt;&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;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vF14o/btsL48czemy/9FOpFMTFjDVct7z4alhoO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vF14o/btsL48czemy/9FOpFMTFjDVct7z4alhoO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vF14o/btsL48czemy/9FOpFMTFjDVct7z4alhoO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvF14o%2FbtsL48czemy%2F9FOpFMTFjDVct7z4alhoO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;442&quot; data-origin-width=&quot;121&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAaOp/btsL3yXXRal/Rz6rtZZlyhuPkqbj8ndw3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAaOp/btsL3yXXRal/Rz6rtZZlyhuPkqbj8ndw3K/img.png&quot; data-alt=&quot;1열 StackPanel , 2열 WrapPanel&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAaOp/btsL3yXXRal/Rz6rtZZlyhuPkqbj8ndw3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAaOp%2FbtsL3yXXRal%2FRz6rtZZlyhuPkqbj8ndw3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;445&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1열 StackPanel , 2열 WrapPanel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypCJS/btsL2KEHZ7m/lPTx02ePy8lV7CZu6ljdok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypCJS/btsL2KEHZ7m/lPTx02ePy8lV7CZu6ljdok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypCJS/btsL2KEHZ7m/lPTx02ePy8lV7CZu6ljdok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FypCJS%2FbtsL2KEHZ7m%2FlPTx02ePy8lV7CZu6ljdok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;580&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.DockPanel&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-먼저 입력한 요소가 가장 위로 오도록 배치된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-LastChildFill은 남은 여백은 마지막 요소로 전부 채운다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-DockPanel.Dock=&quot;Bottom&quot; 이 함수는 어디에 배치할 것인지를 정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2d3su/btsL4v7iETU/50TgI4c1xigFYg7q28xHx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2d3su/btsL4v7iETU/50TgI4c1xigFYg7q28xHx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2d3su/btsL4v7iETU/50TgI4c1xigFYg7q28xHx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2d3su%2FbtsL4v7iETU%2F50TgI4c1xigFYg7q28xHx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;388&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;388&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;594&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y5aLe/btsL30mqDsU/Cw2p9Dhw7Sgy33klLwzBpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y5aLe/btsL30mqDsU/Cw2p9Dhw7Sgy33klLwzBpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y5aLe/btsL30mqDsU/Cw2p9Dhw7Sgy33klLwzBpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY5aLe%2FbtsL30mqDsU%2FCw2p9Dhw7Sgy33klLwzBpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;262&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baMTjB/btsL3XpFu01/hPBx1EK0nEaHhdD9RYhn4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baMTjB/btsL3XpFu01/hPBx1EK0nEaHhdD9RYhn4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baMTjB/btsL3XpFu01/hPBx1EK0nEaHhdD9RYhn4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaMTjB%2FbtsL3XpFu01%2FhPBx1EK0nEaHhdD9RYhn4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;400&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAJD5H/btsL4M8PhL8/qbYY9K04815k1zkb6TNfB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAJD5H/btsL4M8PhL8/qbYY9K04815k1zkb6TNfB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAJD5H/btsL4M8PhL8/qbYY9K04815k1zkb6TNfB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAJD5H%2FbtsL4M8PhL8%2FqbYY9K04815k1zkb6TNfB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;264&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.Canvas&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-창을 늘리거나 줄여도 캔버스의 좌우상하 기준으로 정해진 위치에 위치하도록 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;-WPF Canvas 레이아웃은 자식 요소의 절대 위치를 지정하여 레이아웃을 제어하는 레이아웃 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;-도형 그리기에 많이 사용됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;-Canvas 속성은 모서리를 기준으로 위치를 지정합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHImVn/btsL4PdgvB5/PcJHxM50TsSlhCBL4w0da0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHImVn/btsL4PdgvB5/PcJHxM50TsSlhCBL4w0da0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHImVn/btsL4PdgvB5/PcJHxM50TsSlhCBL4w0da0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHImVn%2FbtsL4PdgvB5%2FPcJHxM50TsSlhCBL4w0da0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;327&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;327&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;462&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kN5Z8/btsL4MVhsOs/EAMfXvLtCIET1WmfvVlhR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kN5Z8/btsL4MVhsOs/EAMfXvLtCIET1WmfvVlhR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kN5Z8/btsL4MVhsOs/EAMfXvLtCIET1WmfvVlhR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkN5Z8%2FbtsL4MVhsOs%2FEAMfXvLtCIET1WmfvVlhR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;323&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;323&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;713&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KHbdb/btsL235fhFD/D12uCtXD5TqQkReo12w3r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KHbdb/btsL235fhFD/D12uCtXD5TqQkReo12w3r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KHbdb/btsL235fhFD/D12uCtXD5TqQkReo12w3r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKHbdb%2FbtsL235fhFD%2FD12uCtXD5TqQkReo12w3r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;251&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>3_c#/WPF</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/325</guid>
      <comments>https://misang.tistory.com/325#entry325comment</comments>
      <pubDate>Sat, 1 Feb 2025 15:04:18 +0900</pubDate>
    </item>
    <item>
      <title>1.WPF의 주요 컴포넌트</title>
      <link>https://misang.tistory.com/323</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;//WPF를 구성하는 요소 정도로 이해.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn5PTf/btsL2A9NdH0/at4N4nniPHbtIUEkoMM9uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn5PTf/btsL2A9NdH0/at4N4nniPHbtIUEkoMM9uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn5PTf/btsL2A9NdH0/at4N4nniPHbtIUEkoMM9uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn5PTf%2FbtsL2A9NdH0%2Fat4N4nniPHbtIUEkoMM9uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;326&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//Content는 안에 쓸 텍스트&lt;/p&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;683&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/61Lt9/btsL3oVmewS/8V3v24F5DUiLKlEfOuY6s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/61Lt9/btsL3oVmewS/8V3v24F5DUiLKlEfOuY6s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/61Lt9/btsL3oVmewS/8V3v24F5DUiLKlEfOuY6s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F61Lt9%2FbtsL3oVmewS%2F8V3v24F5DUiLKlEfOuY6s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;487&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NufRk/btsL3qsa9Qh/gHmsezMmb2X53uErUgeQDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NufRk/btsL3qsa9Qh/gHmsezMmb2X53uErUgeQDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NufRk/btsL3qsa9Qh/gHmsezMmb2X53uErUgeQDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNufRk%2FbtsL3qsa9Qh%2FgHmsezMmb2X53uErUgeQDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;550&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lM7n3/btsL5rbNzvZ/6uWNWffKAUbmASOMrbKdOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lM7n3/btsL5rbNzvZ/6uWNWffKAUbmASOMrbKdOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lM7n3/btsL5rbNzvZ/6uWNWffKAUbmASOMrbKdOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlM7n3%2FbtsL5rbNzvZ%2F6uWNWffKAUbmASOMrbKdOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;707&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EZC8m/btsL4pTAQKw/U1sTEL13Uwj0uZS3kI0Ea1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EZC8m/btsL4pTAQKw/U1sTEL13Uwj0uZS3kI0Ea1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EZC8m/btsL4pTAQKw/U1sTEL13Uwj0uZS3kI0Ea1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEZC8m%2FbtsL4pTAQKw%2FU1sTEL13Uwj0uZS3kI0Ea1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;430&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ecHD/btsL4P5i0pW/sQrMN49CLITmBlHF0kbLP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ecHD/btsL4P5i0pW/sQrMN49CLITmBlHF0kbLP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ecHD/btsL4P5i0pW/sQrMN49CLITmBlHF0kbLP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ecHD%2FbtsL4P5i0pW%2FsQrMN49CLITmBlHF0kbLP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;439&quot; data-origin-width=&quot;664&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHVaSd/btsL5soeXqF/vHCtyKGRUiJKuKb753wKj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHVaSd/btsL5soeXqF/vHCtyKGRUiJKuKb753wKj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHVaSd/btsL5soeXqF/vHCtyKGRUiJKuKb753wKj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHVaSd%2FbtsL5soeXqF%2FvHCtyKGRUiJKuKb753wKj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;486&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VkPZF/btsL5jLJcBZ/9GhI797dTV8RKSltCTz210/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VkPZF/btsL5jLJcBZ/9GhI797dTV8RKSltCTz210/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VkPZF/btsL5jLJcBZ/9GhI797dTV8RKSltCTz210/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkPZF%2FbtsL5jLJcBZ%2F9GhI797dTV8RKSltCTz210%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;379&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;379&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;691&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WLsUv/btsL30zN3lk/khoZINAlUCgEsBafUlRQD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WLsUv/btsL30zN3lk/khoZINAlUCgEsBafUlRQD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WLsUv/btsL30zN3lk/khoZINAlUCgEsBafUlRQD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWLsUv%2FbtsL30zN3lk%2FkhoZINAlUCgEsBafUlRQD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;493&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;493&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;720&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNDhdt/btsL4rDQcXh/CxVcGfTR5AIsdJAuXFk7gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNDhdt/btsL4rDQcXh/CxVcGfTR5AIsdJAuXFk7gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNDhdt/btsL4rDQcXh/CxVcGfTR5AIsdJAuXFk7gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNDhdt%2FbtsL4rDQcXh%2FCxVcGfTR5AIsdJAuXFk7gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;472&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*XAML&lt;/b&gt;&lt;br /&gt;&amp;nbsp; -UI 설계하는 언어&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*레이아웃 컨트롤 (위치 지정 )&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 1.grid : 행 열 기반의 정렬&lt;br /&gt;&amp;nbsp; 2.stackpanel : 수직/수평 정렬&lt;br /&gt;&amp;nbsp; 3.wrappanel : 자동 줄 바꿈&lt;br /&gt;&amp;nbsp; 4.dockpanel : 상하좌우 배치&lt;br /&gt;&amp;nbsp; 5.canvas : 절대 위치 배치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*컨트롤 (UI컨트롤)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 1.기본 컨트롤&lt;br /&gt;&amp;nbsp; &amp;nbsp; -버튼/텍스트/이미지/체크박스&lt;br /&gt;&amp;nbsp; 2.데이터 컨트롤&lt;br /&gt;&amp;nbsp; &amp;nbsp; -데이터를 표시하고 상호작용한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; -listbox, combobox, datagrid, treeview&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*데이터&amp;nbsp;바인딩&lt;/b&gt;&lt;br /&gt;&amp;nbsp; -UI 요소와 데이터 소스 연결하는 기능&lt;br /&gt;&amp;nbsp; -2가지 있음 : one-way, two-way&lt;br /&gt;&amp;nbsp; -INotifyPropertyChanged를 사용하여 데이터 변경 감지&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*스타일/리소스&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 디자인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*트리거/애니메이션&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 1.트리거&lt;br /&gt;&amp;nbsp; &amp;nbsp; 뭔가 이벤트가 발생하면 동작하는 조건&lt;br /&gt;&amp;nbsp; 2. 애니메이션&lt;br /&gt;&amp;nbsp; &amp;nbsp; storyborad를 사용해서 애니메이션 구현이 가능하다고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;*명령&amp;nbsp;시스템&lt;/b&gt;&lt;br /&gt;&amp;nbsp; -MVVM패턴에서 버튼 등의 이벤트 처리&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*MVVM&amp;nbsp;패턴&lt;/b&gt;&lt;br /&gt;&amp;nbsp; -WPF에서 UI와 로직을 분리하는 디자인 패턴&lt;/p&gt;</description>
      <category>3_c#/WPF</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/323</guid>
      <comments>https://misang.tistory.com/323#entry323comment</comments>
      <pubDate>Sat, 1 Feb 2025 01:52:33 +0900</pubDate>
    </item>
    <item>
      <title>WPF 공부 순서</title>
      <link>https://misang.tistory.com/320</link>
      <description>&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-filename=&quot;순서1.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7FDRR/btsL4p0lPI5/Of6Zo6EpjqOWpBEWliC7Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7FDRR/btsL4p0lPI5/Of6Zo6EpjqOWpBEWliC7Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7FDRR/btsL4p0lPI5/Of6Zo6EpjqOWpBEWliC7Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7FDRR%2FbtsL4p0lPI5%2FOf6Zo6EpjqOWpBEWliC7Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;531&quot; data-filename=&quot;순서1.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;순서2.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4kx5X/btsL5shtoB2/PxRnWOmpQWYAJNDVAycjT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4kx5X/btsL5shtoB2/PxRnWOmpQWYAJNDVAycjT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4kx5X/btsL5shtoB2/PxRnWOmpQWYAJNDVAycjT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4kx5X%2FbtsL5shtoB2%2FPxRnWOmpQWYAJNDVAycjT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;439&quot; data-filename=&quot;순서2.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;순서3.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwa0zp/btsL4EQtJ7t/AAo2Oau52qe9qRSc6cI2XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwa0zp/btsL4EQtJ7t/AAo2Oau52qe9qRSc6cI2XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwa0zp/btsL4EQtJ7t/AAo2Oau52qe9qRSc6cI2XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwa0zp%2FbtsL4EQtJ7t%2FAAo2Oau52qe9qRSc6cI2XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;393&quot; data-filename=&quot;순서3.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;순서4.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G560N/btsL2ABWOsD/grPoKYm7KfiErvt3caFHF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G560N/btsL2ABWOsD/grPoKYm7KfiErvt3caFHF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G560N/btsL2ABWOsD/grPoKYm7KfiErvt3caFHF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG560N%2FbtsL2ABWOsD%2FgrPoKYm7KfiErvt3caFHF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;480&quot; data-filename=&quot;순서4.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;순서5.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ZJiU/btsL3ShDQhx/1ppSm6r7cZNPS14Q10jLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ZJiU/btsL3ShDQhx/1ppSm6r7cZNPS14Q10jLK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ZJiU/btsL3ShDQhx/1ppSm6r7cZNPS14Q10jLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ZJiU%2FbtsL3ShDQhx%2F1ppSm6r7cZNPS14Q10jLK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;646&quot; data-filename=&quot;순서5.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>3_c#/WPF</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/320</guid>
      <comments>https://misang.tistory.com/320#entry320comment</comments>
      <pubDate>Sat, 1 Feb 2025 01:39:56 +0900</pubDate>
    </item>
    <item>
      <title>ZIGNER Main Code 250116</title>
      <link>https://misang.tistory.com/313</link>
      <description>&lt;pre id=&quot;code_1737039415602&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//패치 내용
//250115 : MPU9250 기능 추가
//250116 : 배터리 잔여용량 체크 기능, 서보제어 기능, 데이터 분리 기능 
//서보동작이 정밀하지 못하니 수정 요망

#include &quot;Wire.h&quot;
#include &quot;I2Cdev.h&quot;
#include &quot;MPU9250.h&quot;
#include &amp;lt;Servo.h&amp;gt;
#include &amp;lt;SoftwareSerial.h&amp;gt; 


Servo ESC;     // create servo object to control the ESC
SoftwareSerial HC12(2, 3); // 아두이노 2번을 HC-12 TX Pin에 연결, 3번을 HC-12 RX Pin에 연결.
MPU9250 accelgyro;
I2Cdev   I2C_M;
Servo servo1;
Servo servo2;
Servo servo3;
Servo camServo;


//1. Setup 변수
int setPin=13; // SET 단자 D13
int batteryPin=0; //배터리 측정 단자 A0
int servo1Pin =6;
int servo2Pin =9;
int servo3Pin =10;
int camServoPin =11;

bool safetySeq=false;
bool safetyCom=false;
bool safetyBet=false;
bool safetyJoyCom=false;
bool safetySv=false;
bool safetyMt=false;
bool safetyCam=false;
bool safetyJoy=false;
bool flyRdy =false;

//2. MPU9250 변수
uint8_t buffer_m[6];

int16_t ax, ay, az;//Accelation
int16_t gx, gy, gz;//Gyro
int16_t mx, my, mz;//Compass

float heading; //N극에서 몇 도 회전해 있는가를 구함  
float tiltheading;//The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:

float Axyz[3];//Accelation
float Gxyz[3];//Gyro
float Mxyz[3];//Compass

#define sample_num_mdate  5000  //sample 데이터 수집할 횟수

volatile float mx_sample[3]; //샘플 넣을 배열. mx_sample[]은 0:min, 1:max, 2:sample 이다.
volatile float my_sample[3]; //샘플 넣을 배열. my_sample[]은 0:min, 1:max, 2:sample 이다.
volatile float mz_sample[3]; //샘플 넣을 배열. mz_sample[]은 0:min, 1:max, 2:sample 이다.

static float mx_centre = 0; //Calibration 값 (설정값 아니다. 아래서 구할 것이다.) Mxyz_init_calibrated ()에서 구한다.
static float my_centre = 0; //Calibration 값 (설정값 아니다. 아래서 구할 것이다.) Mxyz_init_calibrated ()에서 구한다.
static float mz_centre = 0; //Calibration 값 (설정값 아니다. 아래서 구할 것이다.) Mxyz_init_calibrated ()에서 구한다.

volatile int mx_max = 0;  //샘플 데이터 중에서 최대값
volatile int my_max = 0;  //샘플 데이터 중에서 최대값
volatile int mz_max = 0;  //샘플 데이터 중에서 최대값

volatile int mx_min = 0;  //샘플 데이터 중에서 최소값
volatile int my_min = 0;  //샘플 데이터 중에서 최소값
volatile int mz_min = 0;  //샘플 데이터 중에서 최소값

float temperature;
float pressure;
float atm;
float altitude;

//3. MPU9250 함수

void getHeading(void);  //N극에서 몇 도 회전해 있는가를 구함  
void getTiltHeading(void); //The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:
void Mxyz_init_calibrated();  //Calibration 값 구하고 시리얼 출력하는 함수
void get_calibration_Data();  //calibration값 (mx_centre)구하는 함수
void get_one_sample_date_mxyz(); //Compass 데이터 1번 받고 샘플로 삼는다.
void getAccel_Data(void); //Accel 데이터 받기
void getGyro_Data(void);//Gyro 데이터 받기
void getCompass_Data(void);//Compass 데이터 받기
void getCompassDate_calibrated (); //Compass Calibrated 데이터 받기

//4. Control 변수
int motorSpeed=0;;// 80~150에서 동작한다.
int servo1Stat=2;//1:상, 2:중 3:하
int servo2Stat=2;//1:상, 2:중 3:하
int servo3Stat=2;//1:상, 2:중 3:하
int camServoStat=0; //0~180도 가능


void setup() {
  //0.
  pinMode(setPin,OUTPUT);
  digitalWrite(setPin,HIGH);
  delay(100);

  Wire.begin();
  Serial.begin(115200);                        // 통신속도 115200 bps
  HC12.begin(115200);   // 시리얼포트 &amp;harr; HC12 

  servo1.attach(6);
  servo2.attach(9);
  servo3.attach(10);
  camServo.attach(11);


  //1.자이로 센서 캘리브레이션 세팅
  Serial.println(&quot;[ZIGNER] Initializing I2C devices...&quot;);
  HC12.println(&quot;[ZIGNER] Initializing I2C devices...&quot;);

  accelgyro.initialize();

  Serial.println(&quot;[ZIGNER] Testing device connections...&quot;);
  HC12.println(&quot;[ZIGNER] Testing device connections...&quot;);

  Serial.print(&quot;[ZIGNER] &quot;);
  Serial.println(accelgyro.testConnection() ? &quot;MPU9250 connection successful&quot; : &quot;MPU9250 connection failed&quot;);
  HC12.print(&quot;[ZIGNER] &quot; );
  HC12.println(accelgyro.testConnection() ? &quot;MPU9250 connection successful&quot; : &quot;MPU9250 connection failed&quot;);
  delay(1000);

  Serial.println(&quot;     &quot;);
  HC12.println(&quot;     &quot;);

  //2.MPU9250 Calibration
  Serial.println(&quot;[ZIGNER] Initializing Calibration...&quot;);
  HC12.println(&quot;[ZIGNER] Initializing Calibration...&quot;);
  Mxyz_init_calibrated ();  //초기에 Calibration 값 구하고 동작해야한다.

  //3.ESC Attach
  Serial.println(&quot;[ZIGNER] ESC Attach...&quot;);
  HC12.println(&quot;[ZIGNER] ESC Attach...&quot;);
  ESC.attach(5); 
  ESC.write(70);
  
  Serial.println(&quot;[ZIGNER] COM SET HIGH...&quot;);
  HC12.println(&quot;[ZIGNER] COM SET HIGH...&quot;);
  digitalWrite(setPin,HIGH);
  delay(3000);

  //4. Setup Done
  Serial.println(&quot;[ZIGNER] Setup Done&quot;);
  Serial.println(&quot;[ZIGNER] COM OPEN&quot;);
  HC12.println(&quot;[ZIGNER] Setup Done&quot;);
  HC12.println(&quot;[ZIGNER] COM OPEN&quot;);
}

void loop() {
  //큰 틀 
  //Safety Squence
  // if(!safetySeq){ //safety Seq 시작
  //   if(!safetyCom){//통신체크

  //   }
  //   else if(!safetyBet){//배터리 체크

  //   }
  //   else if (!safetyJoyCom){//조이스틱 연결체크

  //   } 
  //   else if (!safetySv){//서보체크

  //   }
  //   else if(!safetyMt){//모터체크

  //   }
  //   else if(!safetyCam){//카메라 서보 체크
    
  //   }
  //   else if(!safetyJoy){//조이스틱 체크

  //   }

  // }
  
  //Flying Sequence

  if(!flyRdy){//OK+FLY 받으면 조작 시작

    //1.MPU9250 데이터 읽기

    getAccel_Data();
    getGyro_Data();
    getCompassDate_calibrated(); // compass data has been calibrated here
    getHeading();               //before we use this function we should run 'getCompassDate_calibrated()' frist, so that we can get calibrated data ,then we can get correct angle .
    getTiltHeading();

    // Serial.println(&quot;calibration parameter: &quot;);
    // Serial.print(mx_centre);
    // Serial.print(&quot;         &quot;);
    // Serial.print(my_centre);
    // Serial.print(&quot;         &quot;);
    // Serial.println(mz_centre);
    // Serial.println(&quot;     &quot;);

    // Serial.println(&quot;Acceleration(g) of X,Y,Z:&quot;);
    // Serial.print(Axyz[0]);
    // Serial.print(&quot;,&quot;);
    // Serial.print(Axyz[1]);
    // Serial.print(&quot;,&quot;);
    // Serial.println(Axyz[2]);
    // Serial.println(&quot;Gyro(degress/s) of X,Y,Z:&quot;);
    // Serial.print(Gxyz[0]);
    // Serial.print(&quot;,&quot;);
    // Serial.print(Gxyz[1]);
    // Serial.print(&quot;,&quot;);
    // Serial.println(Gxyz[2]);
    // Serial.println(&quot;Compass Value of X,Y,Z:&quot;);
    // Serial.print(Mxyz[0]);
    // Serial.print(&quot;,&quot;);
    // Serial.print(Mxyz[1]);
    // Serial.print(&quot;,&quot;);
    // Serial.println(Mxyz[2]);
    // Serial.println(&quot;The clockwise angle between the magnetic north and X-Axis:&quot;);
    // Serial.print(heading);
    // Serial.println(&quot; &quot;);
    // Serial.println(&quot;The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:&quot;);
    // Serial.println(tiltheading);
    // Serial.println(&quot;   &quot;);
    // Serial.println();
 
    //2.배터리값 읽기
    float batteryVal=analogRead(batteryPin);
    batteryVal = map(batteryVal,0,1023,0,5);
    batteryVal = batteryVal*3;


    //3.데이터 프로토콜
    //ZIGNER 프로토콜 : Zax,ay,az,gx,gy,gz,E 
    //ZIGNER 프로토콜 : Gmx,my,mz,배터리(V),heading,tiltheading,E
    String dataProtocol=&quot;Z,&quot;;
    dataProtocol=dataProtocol+String(Axyz[0])+&quot;,&quot;;
    dataProtocol=dataProtocol+String(Axyz[1])+&quot;,&quot;;
    dataProtocol=dataProtocol+String(Axyz[2])+&quot;,&quot;;
    dataProtocol=dataProtocol+String(Gxyz[0])+&quot;,&quot;;
    dataProtocol=dataProtocol+String(Gxyz[1])+&quot;,&quot;;
    dataProtocol=dataProtocol+String(Gxyz[2])+&quot;,E&quot;;

    String dataProtocol2=&quot;G,&quot;;
    dataProtocol2=dataProtocol2+String(Mxyz[0])+&quot;,&quot;;
    dataProtocol2=dataProtocol2+String(Mxyz[1])+&quot;,&quot;;
    dataProtocol2=dataProtocol2+String(Mxyz[2])+&quot;,&quot;;
    dataProtocol2=dataProtocol2+String(batteryVal)+&quot;,&quot;; //배터리
    dataProtocol2=dataProtocol2+String(heading)+&quot;,&quot;;
    dataProtocol2=dataProtocol2+String(tiltheading)+&quot;,E&quot;;//End 표시
    delay(20);



    //4.PC에서 데이터 받고 데이터 보내기
    while (HC12.available()) {     //HC12모듈이 받은 데이터가 있을 경우 시리얼모니터로 출력

      //-1.PC에서 값 받기
      String input = HC12.readString();
      Serial.print(&quot;[PC] &quot;);
      Serial.println(input);

      //-2.조이스틱 값인 경우
      if(input.charAt(0)=='P'){ //조이스틱 값 프로토콜 
      //P모터값,서보1,서보2,서보3(1,2,3),카메라서보1(0~180),E
        Serial.print(&quot;[PC] &quot;);
        Serial.println(input);
        //-1.MPU값을 보낸다.

        Serial.println(&quot;Data [ZIGNER] &amp;gt;&amp;gt; [PC]&quot;);
        HC12.println(dataProtocol);
        Serial.println(dataProtocol);
        HC12.println(dataProtocol2);
        Serial.println(dataProtocol2);
        
        //-2.조이스틱 값을 분리한다.
        dataSeparate(input);

        //-3.모터와 서보를 동작한다.
        ESC.write(motorSpeed);
        Serial.print(&quot;[Motor Speed] &quot;);
        Serial.println(motorSpeed);
        HC12.print(&quot;[Motor Speed] &quot;);
        HC12.println(motorSpeed);

        moveWing(servo1Stat, servo2Stat, servo3Stat);
        Serial.print(&quot;[Servo Stat] &quot;);
        Serial.print(&quot;servo1:&quot;);
        Serial.print(servo1Stat);
        Serial.print(&quot;, servo2:&quot;);
        Serial.print(servo2Stat);
        Serial.print(&quot;, servo3:&quot;);
        Serial.println(servo3Stat);
        HC12.print(&quot;[Servo Stat]&quot;);
        HC12.print(servo1Stat);
        HC12.print(servo2Stat);
        HC12.println(servo3Stat);

        moveCam(camServoStat);
        Serial.print(&quot;[Cam Servo Angle] &quot;);
        Serial.println(camServoStat);
        HC12.print(&quot;[Cam Servo Angle] &quot;);
        HC12.println(camServoStat);
        delay(200);
      }
      //-3.COM SET HIGH 명령어
      else if(input ==&quot;OPEN+COM&quot;){//통신 SET HIGH 설정 명령
        digitalWrite(setPin,HIGH);
        HC12.println(&quot;[ZIGNER] SET+HIGH&quot;);
        Serial.print(&quot;[PC] &quot;);
        Serial.println(input);
        delay(20);
      }
      //-4. 통신 답변 바람 명령어
      else if(input ==&quot;OK+COM&quot;){ //통신 답신바라는 명령
        HC12.println(&quot;[ZIGNER] COM+OK&quot;);
        Serial.print(&quot;[PC] &quot;);
        Serial.println(input);
        delay(20);
      }

      
    } 


  //5.무인기 내부 시리얼 모니터
  // 시리얼모니터로 수신(입력)데이터가 있을 경우 HC12를 통해 데이터를 발송
  // while (Serial.available()) { 
  //   String input = Serial.readString();
  //   Serial.print(&quot;[ZIGNER] : &quot;);
  //   Serial.println(input);
  //   if(input ==&quot;SET+HIGH&quot;){
  //     digitalWrite(setPin,HIGH);
  //     delay(20);
  //   }
  //   else if(input ==&quot;SET+LOW&quot;){
  //     digitalWrite(setPin,LOW);
  //     delay(20);
  //   }
  //   else{
  //     HC12.println(input);
  //   }
  // } 

  }

}
void moveWing(int sv1,int sv2, int sv3){
  switch(sv1){
    case 1:
      servo1.write(0);
    break;

    case 2:
      servo1.write(90);
    break;

    case 3:
      servo1.write(180);
  }
  switch(sv2){
    case 1:
      servo2.write(0);
    break;

    case 2:
      servo2.write(90);
    break;

    case 3:
      servo2.write(180);
    break;
  }
  switch(sv3){
    case 1:
      servo3.write(0);
    break;

    case 2:
      servo3.write(90);
    break;

    case 3:
      servo3.write(180);
    break;
  }


}
void moveCam(int num){
  camServo.write(num);
}

void dataSeparate(String input2){
  // int motorSpeed=0;;// 80~150에서 동작한다.  
  // int servo1Stat=2;//1:상, 2:중 3:하
  // int servo2Stat=2;//1:상, 2:중 3:하
  // int servo3Stat=2;//1:상, 2:중 3:하
  // int camServoStat=0; //0~180도 가능
  //P180,2,2,2,100,EP,180,2,2,2,100,E

  // 첫 번째 P와 첫 번째 E 사이의 문자열 추출
  int startIndex = input2.indexOf('P');
  int endIndex = input2.indexOf('E', startIndex);

  if (startIndex != -1 &amp;amp;&amp;amp; endIndex != -1) {
    String segment = input2.substring(startIndex + 1, endIndex); // P와 E 사이 추출
    String tokens[10];
    int tokenIndex = 0;

    while (segment.length() &amp;gt; 0) {
      int index = segment.indexOf(',');

      if (index == -1) { // 더 이상 ','가 없는 경우
        tokens[tokenIndex++] = segment;
        break;
      } else {
        tokens[tokenIndex++] = segment.substring(0, index);
        segment = segment.substring(index + 1);
      }
    }

    // 결과 출력
    Serial.println(&quot;Parsed tokens between first P and first E:&quot;);
    for (int i = 0; i &amp;lt; tokenIndex; i++) {
      Serial.print(&quot;Token &quot;);
      Serial.print(i + 1);
      Serial.print(&quot;: &quot;);
      Serial.println(tokens[i]);
    }

    motorSpeed=tokens[1].toInt();// 80~150에서 동작한다.
    servo1Stat=tokens[2].toInt();//1:상, 2:중 3:하
    servo2Stat=tokens[3].toInt();;//1:상, 2:중 3:하
    servo3Stat=tokens[4].toInt();;//1:상, 2:중 3:하
    camServoStat=tokens[5].toInt();//0~180도 가능
    Serial.println(&quot;[Separated Data]&quot;);
    Serial.print(&quot; Motor:&quot;);
    Serial.print(motorSpeed);
    Serial.print(&quot;, Servo1:&quot;);
    Serial.print(servo1Stat);
    Serial.print(&quot;, Servo2:&quot;);
    Serial.print(servo2Stat);
    Serial.print(&quot;, Servo3:&quot;);
    Serial.print(servo3Stat);
    Serial.print(&quot;, CamServo:&quot;);
    Serial.println(camServoStat);
  } 
  else {
    Serial.println(&quot;[Error]: Could not find both P and E in the [Control Data].&quot;);
  }

}


void getHeading(void) //N극에서 몇 도 회전해 있는가를 구함    
{//before we use this function we should run 'getCompassDate_calibrated()' frist, 
//so that we can get calibrated data ,then we can get correct angle .
    heading = 180 * atan2(Mxyz[1], Mxyz[0]) / PI;
    if (heading &amp;lt; 0) heading += 360;
}
void getTiltHeading(void) //The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:
{
    float pitch = asin(-Axyz[0]);
    float roll = asin(Axyz[1] / cos(pitch));

    float xh = Mxyz[0] * cos(pitch) + Mxyz[2] * sin(pitch);
    float yh = Mxyz[0] * sin(roll) * sin(pitch) + Mxyz[1] * cos(roll) - Mxyz[2] * sin(roll) * cos(pitch);
    float zh = -Mxyz[0] * cos(roll) * sin(pitch) + Mxyz[1] * sin(roll) + Mxyz[2] * cos(roll) * cos(pitch);
    tiltheading = 180 * atan2(yh, xh) / PI;
    if (yh &amp;lt; 0)    tiltheading += 360;
}
void Mxyz_init_calibrated () //Calibration 값 구하고 시리얼 출력하는 함수
{

    Serial.println(F(&quot;Before using 9DOF,we need to calibrate the compass frist,It will takes about 2 minutes.&quot;));
    Serial.print(&quot;  &quot;);
    Serial.println(F(&quot;During  calibratting ,you should rotate and turn the 9DOF all the time within 2 minutes.&quot;));
    Serial.print(&quot;  &quot;);
    Serial.println(F(&quot;If you are ready ,please sent a command data 'ready' to start sample and calibrate.&quot;));
    HC12.println(F(&quot;[ZIGNER] Before using 9DOF,we need to calibrate the compass frist,It will takes about 2 minutes.&quot;));
    HC12.println(&quot;[ZIGNER]  &quot;);
    HC12.println(F(&quot;[ZIGNER] During  calibratting ,you should rotate and turn the 9DOF all the time within 2 minutes.&quot;));
    HC12.println(&quot;[ZIGNER]  &quot;);
    HC12.println(F(&quot;[ZIGNER] If you are ready ,please sent a command data 'ready' to start sample and calibrate.&quot;));
    String str=&quot;&quot;;
    while(str!=&quot;ready&quot;){
      if(HC12.available()){
        str = HC12.readString();
        Serial.print(&quot;[PC] &quot;);
        Serial.print(str);
        Serial.println(&quot;&quot;);
      }

      if(Serial.find(&quot;ready&quot;)){
        break;
      }
      
    }
   
    //while (!Serial.find(&quot;ready&quot;));
    Serial.println(&quot;  &quot;);
    Serial.println(&quot;[ZIGNER] ready&quot;);
    Serial.println(&quot;[ZIGNER] Sample starting......&quot;);
    Serial.println(&quot;[ZIGNER] waiting ......&quot;);

    HC12.println(&quot;  &quot;);
    HC12.println(&quot;[ZIGNER] ready&quot;);
    HC12.println(&quot;[ZIGNER] Sample starting......&quot;);
    HC12.println(&quot;[ZIGNER] waiting ......&quot;);


    get_calibration_Data ();

    Serial.println(&quot;     &quot;);
    Serial.println(&quot;compass calibration parameter &quot;);
    Serial.print(mx_centre);
    Serial.print(&quot;     &quot;);
    Serial.print(my_centre);
    Serial.print(&quot;     &quot;);
    Serial.println(mz_centre);
    Serial.println(&quot;    &quot;);

    HC12.println(&quot;[ZIGNER]     &quot;);
    HC12.println(&quot;[ZIGNER] compass calibration parameter &quot;);
    HC12.print(mx_centre);
    HC12.print(&quot;     &quot;);
    HC12.print(my_centre);
    HC12.print(&quot;     &quot;);
    HC12.println(mz_centre);
    HC12.println(&quot;    &quot;);

}
void get_calibration_Data () //calibration값 (mx_centre)구하는 함수
{   HC12.print(&quot;[5%]&quot;);
    for (int i = 0; i &amp;lt; sample_num_mdate; i++)
    {   
        if(i%100 ==0){HC12.print(&quot;#&quot;);}
        get_one_sample_date_mxyz();//샘플로 Compass Data받고 
        //샘플을 sample_num_mdate 만큼 받아서 최대값과 최소값을 구한다.
        //mx_sample[]은 0:min, 1:max, 2:sample 이다.
        if (mx_sample[2] &amp;gt;= mx_sample[1])mx_sample[1] = mx_sample[2];
        if (my_sample[2] &amp;gt;= my_sample[1])my_sample[1] = my_sample[2]; //find max value
        if (mz_sample[2] &amp;gt;= mz_sample[1])mz_sample[1] = mz_sample[2];

        if (mx_sample[2] &amp;lt;= mx_sample[0])mx_sample[0] = mx_sample[2];
        if (my_sample[2] &amp;lt;= my_sample[0])my_sample[0] = my_sample[2]; //find min value
        if (mz_sample[2] &amp;lt;= mz_sample[0])mz_sample[0] = mz_sample[2];
    }
    mx_max = mx_sample[1];
    my_max = my_sample[1];
    mz_max = mz_sample[1];

    mx_min = mx_sample[0];
    my_min = my_sample[0];
    mz_min = mz_sample[0];
    
    mx_centre = (mx_max + mx_min) / 2; //최대값과 최소값으로 중앙값 구함
    my_centre = (my_max + my_min) / 2;
    mz_centre = (mz_max + mz_min) / 2;
    HC12.println(&quot;&quot;);
}
void get_one_sample_date_mxyz()//Compass 데이터 1번 받고 샘플로 삼는다.
{
    getCompass_Data();
    mx_sample[2] = Mxyz[0];
    my_sample[2] = Mxyz[1];
    mz_sample[2] = Mxyz[2];
}
void getAccel_Data(void) //Accel 데이터 받기
{
    accelgyro.getMotion9(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz, &amp;amp;mx, &amp;amp;my, &amp;amp;mz);
    Axyz[0] = (double) ax / 16384;
    Axyz[1] = (double) ay / 16384;
    Axyz[2] = (double) az / 16384;
}
void getGyro_Data(void) //Gyro 데이터 받기
{
    accelgyro.getMotion9(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz, &amp;amp;mx, &amp;amp;my, &amp;amp;mz);

    Gxyz[0] = (double) gx * 250 / 32768;
    Gxyz[1] = (double) gy * 250 / 32768;
    Gxyz[2] = (double) gz * 250 / 32768;
}
void getCompass_Data(void) //Compass 데이터 받기
{
    I2C_M.writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); //enable the magnetometer
    delay(10);
    I2C_M.readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer_m);

    mx = ((int16_t)(buffer_m[1]) &amp;lt;&amp;lt; 8) | buffer_m[0] ;
    my = ((int16_t)(buffer_m[3]) &amp;lt;&amp;lt; 8) | buffer_m[2] ;
    mz = ((int16_t)(buffer_m[5]) &amp;lt;&amp;lt; 8) | buffer_m[4] ;

    Mxyz[0] = (double) mx * 1200 / 4096;
    Mxyz[1] = (double) my * 1200 / 4096;
    Mxyz[2] = (double) mz * 1200 / 4096;
}
void getCompassDate_calibrated () //Compass Calibrated 데이터 받기
{
    getCompass_Data();
    Mxyz[0] = Mxyz[0] - mx_centre;
    Mxyz[1] = Mxyz[1] - my_centre;
    Mxyz[2] = Mxyz[2] - mz_centre;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>6_Project/Zigner</category>
      <author>Mi:sAng</author>
      <guid isPermaLink="true">https://misang.tistory.com/313</guid>
      <comments>https://misang.tistory.com/313#entry313comment</comments>
      <pubDate>Thu, 16 Jan 2025 23:57:17 +0900</pubDate>
    </item>
  </channel>
</rss>