<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>EasyCastleUNITY</title>
    <link>https://easycastleunity.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 26 Aug 2026 22:38:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>EasyCastleT</managingEditor>
    <image>
      <title>EasyCastleUNITY</title>
      <url>https://tistory1.daumcdn.net/tistory/6498563/attach/b23dd905aa1141a3b7e7c41e4bcc8c08</url>
      <link>https://easycastleunity.tistory.com</link>
    </image>
    <item>
      <title>Amazon S3 with Unity R&amp;amp;D 4 - 유니티를 통해 S3 저장소에서 파일 받아오기 (AccessKey 이용)</title>
      <link>https://easycastleunity.tistory.com/228</link>
      <description>&lt;figure id=&quot;og_1750123365645&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;Amazon S3 with Unity R&amp;amp;D 3 - IAM Access Key 설정&quot; data-og-description=&quot;Amazon S3 with Unity R&amp;amp;D 2 - S3 사용법Amazon S3 with Unity R&amp;amp;D 1회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수&quot; data-og-host=&quot;easycastleunity.tistory.com&quot; data-og-source-url=&quot;https://easycastleunity.tistory.com/227&quot; data-og-url=&quot;https://easycastleunity.tistory.com/227&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/caeRJ8/hyY8NG4RL3/Mn1cVscNiyxe7vksdcI2d0/img.png?width=800&amp;amp;height=268&amp;amp;face=0_0_800_268,https://scrap.kakaocdn.net/dn/C0L56/hyY72Evtmc/W9jpQz8lA05E1T3avPPJG0/img.png?width=800&amp;amp;height=268&amp;amp;face=0_0_800_268,https://scrap.kakaocdn.net/dn/ctq2Fs/hyY8Kp6IAk/XZgDBgHoZ8x4LUZwizpRm1/img.png?width=3279&amp;amp;height=1770&amp;amp;face=0_0_3279_1770&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/227&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://easycastleunity.tistory.com/227&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/caeRJ8/hyY8NG4RL3/Mn1cVscNiyxe7vksdcI2d0/img.png?width=800&amp;amp;height=268&amp;amp;face=0_0_800_268,https://scrap.kakaocdn.net/dn/C0L56/hyY72Evtmc/W9jpQz8lA05E1T3avPPJG0/img.png?width=800&amp;amp;height=268&amp;amp;face=0_0_800_268,https://scrap.kakaocdn.net/dn/ctq2Fs/hyY8Kp6IAk/XZgDBgHoZ8x4LUZwizpRm1/img.png?width=3279&amp;amp;height=1770&amp;amp;face=0_0_3279_1770');&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;Amazon S3 with Unity R&amp;amp;D 3 - IAM Access Key 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3 with Unity R&amp;amp;D 2 - S3 사용법Amazon S3 with Unity R&amp;amp;D 1회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;easycastleunity.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;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;이전 포스트들을 통해, S3 사용법, AccessKey 발급, 유니티 기본 세팅에 대해 알아보았다.&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;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;테스트 사전 준비&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 여러분의 버킷에 사용할 파일을 간단하게 하나 올려주기 바란다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 버킷 제일 위에 testVideo.mp4 라는 파일을 올려 테스트 해보았다.&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;2470&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnSG4h/btsOEOJlILB/jAHA3g8R4EeeN8N9QE4QDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnSG4h/btsOEOJlILB/jAHA3g8R4EeeN8N9QE4QDk/img.png&quot; data-alt=&quot;Bucket에 올린 testVideo.mp4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnSG4h/btsOEOJlILB/jAHA3g8R4EeeN8N9QE4QDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnSG4h%2FbtsOEOJlILB%2FjAHA3g8R4EeeN8N9QE4QDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2470&quot; height=&quot;528&quot; data-origin-width=&quot;2470&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bucket에 올린 testVideo.mp4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;S3 파일 받아오기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 S3에서 파일을 받아오기 위한 간단한 스크립트를 작성해 보았다.&lt;/p&gt;
&lt;pre id=&quot;code_1750125441023&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;

public class S3DownloadTest : MonoBehaviour
{
    #region Variable
    [Header(&quot;S3 Setting&quot;)] 
    [SerializeField] string bucketName; //your-bucket-name 
    [SerializeField] string fileKey; //file location in bucket - ex : VideoClips/testVideo.mp4
    [Header(&quot;AWS Certification Info&quot;)]
    [SerializeField] string accessKey; // your access key
    [SerializeField] string secretKey; // your secret key 
    RegionEndpoint regionEndpoint = RegionEndpoint.APNortheast2; // seoul 

    private string localFilePath; // save local file path

    private IAmazonS3 s3Client; // client for s3 
    #endregion Variable
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    async void Start()
    {
        s3Client = new AmazonS3Client(accessKey,secretKey,regionEndpoint);
        localFilePath = Path.Combine(Application.persistentDataPath, &quot;downloaded_testVideo.mp4&quot;);
        await DownloadFromS3();
    }

    private async Task DownloadFromS3()
    {
        try
        {
            var request = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = fileKey
            };

            using(var response = await s3Client.GetObjectAsync(request))
            using(var responseStream = response.ResponseStream)
            using(var fileStream = File.Create(localFilePath))
            {
                await responseStream.CopyToAsync(fileStream);
                Debug.Log(&quot;&amp;lt;color=cyan&amp;gt;다운로드 성공&amp;lt;/color&amp;gt;&quot;); 
            }
        }
        catch (AmazonS3Exception e) 
        {
            Debug.LogError($&quot;S3 다운로드 실패: {e.Message}&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;코드 전문&amp;gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수들에 대한 설명은 주석으로 하고 있으니 생략하고, 중요한 부분들을 봐보겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;DownloadFromS3&lt;/b&gt; 함수이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750125918414&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; private async Task DownloadFromS3()
    {
        try
        {
            var request = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = fileKey
            };

            using(var response = await s3Client.GetObjectAsync(request))
            using(var responseStream = response.ResponseStream)
            using(var fileStream = File.Create(localFilePath))
            {
                await responseStream.CopyToAsync(fileStream);
                Debug.Log(&quot;&amp;lt;color=cyan&amp;gt;다운로드 성공&amp;lt;/color&amp;gt;&quot;); 
            }
        }
        catch (AmazonS3Exception e) 
        {
            Debug.LogError($&quot;S3 다운로드 실패: {e.Message}&quot;);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 통신을 통해 받아오는 것이기에 try - catch로 구현했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;try 문을 보면, request에 &lt;b&gt;GetObjectRequest&lt;/b&gt;를 할당해주었다. 이 &lt;b&gt;GetObjectRequest&lt;/b&gt;에서 버킷이름, 버킷 내 파일 위치를 각각 Bucket Name, Key라는 객체 변수안에 저장해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 알 수 있듯, 파일을 S3에서 받아오려면 받아오려는 파일이 정확히 S3 Bucket안에서 어느 위치에 있는지 개발자가 알고 있어야 사용할 수 있다.&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;만든 request 객체를 사용해 미리 만들어둔&amp;nbsp; s3Client의 GetObjectAsync 함수를 호출한다. 이건 통신이기에 통신 결과가 날아오기 전까지 기다리도록 await 으로 구현했다. 그 날아온 통신 결과값을 response (type : GetObjectResponse) 라는 변수에 저장한다.&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;날아온 통신 결과 중, 다운 받은 파일의 데이터 스트림을 가지고 있는 response.ResponseStream을 responseStream이라는 변수에 저장하고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c# System에서 제공하는 File.Create를 통해 지정해준 위치에 fileSteam을 하나 생성하고, 해당 fileStream에 날아온 데이터 스트림 복사해 저장해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 일련의 과정을 통해 다운 받은 파일이 저장된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Start를 봐보자&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750126739302&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async void Start()
    {
        s3Client = new AmazonS3Client(accessKey,secretKey,regionEndpoint);
        localFilePath = Path.Combine(Application.persistentDataPath, &quot;downloaded_testVideo.mp4&quot;);
        await DownloadFromS3();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력해둔 액세스 키와 비밀 액세스 키, Region 정보를 통해 s3Client를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localFilePath에 어디에 파일을 저장할 지 위치를 지정해주고, DownloadFromS3 함수를 실행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스크립트를 씬에 있는 빈 게임 오브젝트에 넣어서 아래 사진을 참고하여 변수에 정보를 할당해주면 테스트 환경이 구성된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpsrVG/btsODIKggBG/9u2HqWKXvoKnTmNks7OvH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpsrVG/btsODIKggBG/9u2HqWKXvoKnTmNks7OvH1/img.png&quot; data-alt=&quot;환경 세팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpsrVG/btsODIKggBG/9u2HqWKXvoKnTmNks7OvH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpsrVG%2FbtsODIKggBG%2F9u2HqWKXvoKnTmNks7OvH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;612&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경 세팅&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 맞게 환경을 구성해서 테스트를 진행해 보았다. 아래는 실행결과 영상이다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;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;이렇게 유니티에서 S3 파일을 다운로드 하는 방법에 대해 알아보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 사용하려면 확장자나, 여러 문제들을 해결할 필요가 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;주의사항 : 이 방법은 테스트 환경에는 적합하지만, 실 서비스에서 사용하려고 하면 안된다. 이 방법은 빌드 파일 내에 키가 저장되는 방식이기에, 빌드 디컴파일러 등을 통해 빌드 파일을 해체하는 순간, 그대로 Key들이 유출되게 된다.&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 테스트 환경에서 유니티에서 s3를 통해 파일을 받아올 수 있는지 테스트 하기 위해서만 사용하기를 권장한다. 실 서비스에서 사용하려고 하면, 보안 측면에서의 위험이 매우 높다. 그렇기에 다음 포스트에서는 Key들이 빌드 파일에 없도록 구현하는 방법에 대해 다루어 보려고 한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 R&amp;amp;D</category>
      <category>Amazon S3</category>
      <category>AWS</category>
      <category>Unity</category>
      <category>아마존</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/228</guid>
      <comments>https://easycastleunity.tistory.com/228#entry228comment</comments>
      <pubDate>Tue, 17 Jun 2025 11:38:49 +0900</pubDate>
    </item>
    <item>
      <title>Amazon S3 with Unity R&amp;amp;D 3 - IAM Access Key 설정</title>
      <link>https://easycastleunity.tistory.com/227</link>
      <description>&lt;figure id=&quot;og_1750061918056&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;Amazon S3 with Unity R&amp;amp;D 2 - S3 사용법&quot; data-og-description=&quot;Amazon S3 with Unity R&amp;amp;D 1회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수준에서 위협이 높다. 그렇기에, &quot; data-og-host=&quot;easycastleunity.tistory.com&quot; data-og-source-url=&quot;https://easycastleunity.tistory.com/226&quot; data-og-url=&quot;https://easycastleunity.tistory.com/226&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cezt57/hyY8WKCesA/1PAGVSX5w2s3Lr32jW8wTk/img.png?width=800&amp;amp;height=431&amp;amp;face=0_0_800_431,https://scrap.kakaocdn.net/dn/ghvTe/hyY8NmBiQ6/xPKGZQM9TC4GpRIKhSV3dK/img.png?width=800&amp;amp;height=431&amp;amp;face=0_0_800_431,https://scrap.kakaocdn.net/dn/bcQZUo/hyY76mrKCm/nt7g2PVCggOfNM33VvSwe0/img.png?width=2458&amp;amp;height=1502&amp;amp;face=0_0_2458_1502&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/226&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://easycastleunity.tistory.com/226&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cezt57/hyY8WKCesA/1PAGVSX5w2s3Lr32jW8wTk/img.png?width=800&amp;amp;height=431&amp;amp;face=0_0_800_431,https://scrap.kakaocdn.net/dn/ghvTe/hyY8NmBiQ6/xPKGZQM9TC4GpRIKhSV3dK/img.png?width=800&amp;amp;height=431&amp;amp;face=0_0_800_431,https://scrap.kakaocdn.net/dn/bcQZUo/hyY76mrKCm/nt7g2PVCggOfNM33VvSwe0/img.png?width=2458&amp;amp;height=1502&amp;amp;face=0_0_2458_1502');&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;Amazon S3 with Unity R&amp;amp;D 2 - S3 사용법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3 with Unity R&amp;amp;D 1회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수준에서 위협이 높다. 그렇기에,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;easycastleunity.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;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;이전 포스트에서 S3를 퍼블릭으로 하는 것이 아닌, 모든 퍼블릭 Access를 막았기에, 생성한 S3를 사용하려면 자격 증명을 위한 보안키들이 필요하다. 이 보안 키를 발급하는 방법에 대해 알아보려고 한다.&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;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;* 최중요 주의 사항 - 발급 받은 키들은 결코 유출되면 안된다. 유출되는 순간 바로 S3에 접근할 수 있기에, 퍼블릭으로 만든 Bucket과 차이가 없어진다. 유출을 감지하는 순간, 바로 Bucket과 보안 키들을 가지는 사용자를 삭제하는 것이 최선이다.&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 유니티에서 사용하든 모바일 앱에서 사용하든 웹에서 사용하든, 절대 외부에 유출될 가능성이 없도록 구현하는 것이 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용자 생성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이전 포스트에 시작 처럼 AWS Console 창으로 들어간다.&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;3279&quot; data-origin-height=&quot;1770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; data-alt=&quot;AWS Console 홈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctwfcO%2FbtsODqI2gJs%2FYHEKLeOmJ5uyoAwsXlAgs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3279&quot; height=&quot;1770&quot; data-origin-width=&quot;3279&quot; data-origin-height=&quot;1770&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS Console 홈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 콘솔에서 검색하여 &lt;b&gt;IAM 대시보드&lt;/b&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;3814&quot; data-origin-height=&quot;1281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw6aC6/btsODoEBqG8/loEHDFtDT53jMCLmAShZ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw6aC6/btsODoEBqG8/loEHDFtDT53jMCLmAShZ10/img.png&quot; data-alt=&quot;IAM 대시보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw6aC6/btsODoEBqG8/loEHDFtDT53jMCLmAShZ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw6aC6%2FbtsODoEBqG8%2FloEHDFtDT53jMCLmAShZ10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3814&quot; height=&quot;1281&quot; data-origin-width=&quot;3814&quot; data-origin-height=&quot;1281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IAM 대시보드&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;3387&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vkk55/btsOEalkzlb/5p5Xj0mQBUJNDWkEQ9F6SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vkk55/btsOEalkzlb/5p5Xj0mQBUJNDWkEQ9F6SK/img.png&quot; data-alt=&quot;사용자 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vkk55/btsOEalkzlb/5p5Xj0mQBUJNDWkEQ9F6SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkk55%2FbtsOEalkzlb%2F5p5Xj0mQBUJNDWkEQ9F6SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3387&quot; height=&quot;582&quot; data-origin-width=&quot;3387&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사용자 페이지 우상단에 있는 &lt;b&gt;사용자 생성&lt;/b&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;2488&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be7Brl/btsOB9vcSIz/7O2QpCdyt0tq1W71Tkh1r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be7Brl/btsOB9vcSIz/7O2QpCdyt0tq1W71Tkh1r0/img.png&quot; data-alt=&quot;사용자 생성 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be7Brl/btsOB9vcSIz/7O2QpCdyt0tq1W71Tkh1r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe7Brl%2FbtsOB9vcSIz%2F7O2QpCdyt0tq1W71Tkh1r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2488&quot; height=&quot;644&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 생성 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 사용자 이름을 지정해주고 다음 버튼을 누른다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 버튼을 누르면 2단계로 넘어가 권한 설정 창으로 넘어간다.&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;2061&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckAC6P/btsODFsSDYv/DX27t80KBREm1JI41kzsy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckAC6P/btsODFsSDYv/DX27t80KBREm1JI41kzsy1/img.png&quot; data-alt=&quot;권한 설정 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckAC6P/btsODFsSDYv/DX27t80KBREm1JI41kzsy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckAC6P%2FbtsODFsSDYv%2FDX27t80KBREm1JI41kzsy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2061&quot; height=&quot;855&quot; data-origin-width=&quot;2061&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한 설정 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 여러가지 방법을 통해 권한을 설정 할 수 있는데, 만약 사용자 그룹을 만들어 두었다면 &lt;b&gt;그룹에 사용자를 추가&lt;/b&gt;하여 사용자에게 권한을 설정할 수 있고, &lt;b&gt;권한 복사&lt;/b&gt;는 이전에 만들어둔 사용자의 권한을 복사하여 만들어 주며, &lt;b&gt;직접 정책 연결&lt;/b&gt;을 누르면 부여할 수 있는 정책들이 나오며 직접 선택하여 부여할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 사용자 그룹도 없고, 아예 처음 만드는 경우라고 가정하고 만들어 보겠다.&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;2468&quot; data-origin-height=&quot;1041&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvCRpI/btsODZRSipW/uQTjxsIptRXtIQpKqqKfXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvCRpI/btsODZRSipW/uQTjxsIptRXtIQpKqqKfXK/img.png&quot; data-alt=&quot;직접 정책 연결 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvCRpI/btsODZRSipW/uQTjxsIptRXtIQpKqqKfXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvCRpI%2FbtsODZRSipW%2FuQTjxsIptRXtIQpKqqKfXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2468&quot; height=&quot;1041&quot; data-origin-width=&quot;2468&quot; data-origin-height=&quot;1041&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직접 정책 연결 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사용자에게 부여할 수 있는 정책이 나오며 여기서 필요한 정책을 선택하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 역할만 실행할 것이기에 필자는 &lt;b&gt;AmazonS3ReadOnlyAccess&lt;/b&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;2104&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBWyzs/btsOElf64ZQ/JNo9SbyaajFfs3gElbdegK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBWyzs/btsOElf64ZQ/JNo9SbyaajFfs3gElbdegK/img.png&quot; data-alt=&quot;S3ReadOnlyAccess 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBWyzs/btsOElf64ZQ/JNo9SbyaajFfs3gElbdegK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBWyzs%2FbtsOElf64ZQ%2FJNo9SbyaajFfs3gElbdegK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2104&quot; height=&quot;930&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;S3ReadOnlyAccess 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 정책을 다 골랐으면, 다음 버튼을 눌러보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검토 및 생성 페이지가 열리며 만드는 사용자가 가진 권한이나 이름등을 요약하여 보여준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2095&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccjlCD/btsOEjbx2Vd/k2KUhSudJKvJlTAlHq5xX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccjlCD/btsOEjbx2Vd/k2KUhSudJKvJlTAlHq5xX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccjlCD/btsOEjbx2Vd/k2KUhSudJKvJlTAlHq5xX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccjlCD%2FbtsOEjbx2Vd%2Fk2KUhSudJKvJlTAlHq5xX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2095&quot; height=&quot;958&quot; data-origin-width=&quot;2095&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 페이지에서 확인을 끝냈으면 사용자 생성 버튼을 눌러주자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성이 끝나고 왼쪽창에서 사용자를 클릭하면 만들어진 사용자를 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;액세스 키 만들기&amp;nbsp;&lt;/b&gt;&lt;/h3&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;2489&quot; data-origin-height=&quot;1205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdOThD/btsOEQtnOl2/Ro4nNsgLiCXJcIe8Rbrkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdOThD/btsOEQtnOl2/Ro4nNsgLiCXJcIe8Rbrkm0/img.png&quot; data-alt=&quot;테스트 사용자 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdOThD/btsOEQtnOl2/Ro4nNsgLiCXJcIe8Rbrkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdOThD%2FbtsOEQtnOl2%2FRo4nNsgLiCXJcIe8Rbrkm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2489&quot; height=&quot;1205&quot; data-origin-width=&quot;2489&quot; data-origin-height=&quot;1205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트 사용자 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단에 있는 액세스 키 만들기를 눌러 액세스 키를 만들어 보자&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBbtIN/btsODL0FI7P/voSPyVeTmDIP8mklU41i4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBbtIN/btsODL0FI7P/voSPyVeTmDIP8mklU41i4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBbtIN/btsODL0FI7P/voSPyVeTmDIP8mklU41i4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBbtIN%2FbtsODL0FI7P%2FvoSPyVeTmDIP8mklU41i4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1016&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1016&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;2083&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJFVkJ/btsOEMxKzKU/2B5OycV2ziPDCGo9pHklgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJFVkJ/btsOEMxKzKU/2B5OycV2ziPDCGo9pHklgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJFVkJ/btsOEMxKzKU/2B5OycV2ziPDCGo9pHklgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJFVkJ%2FbtsOEMxKzKU%2F2B5OycV2ziPDCGo9pHklgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;461&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 2단계인 설명 태그 설정으로 넘어오는데, 선택 사항이기에 아무것도 입력하지 않고 넘어갈 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액세스 키 만들기를 눌러 다음으로 넘어가자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2463&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rezdr/btsOBEPuEaT/kZx6hUePBFxtgRAZbpeLO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rezdr/btsOBEPuEaT/kZx6hUePBFxtgRAZbpeLO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rezdr/btsOBEPuEaT/kZx6hUePBFxtgRAZbpeLO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frezdr%2FbtsOBEPuEaT%2FkZx6hUePBFxtgRAZbpeLO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2463&quot; height=&quot;938&quot; data-origin-width=&quot;2463&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 액세스 키와 비밀 액세스키가 생성된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;주의점 : 액세스 키는 다시 확인할 수 있지만, 비밀 액세스 키는 다시 확인 불가능. 이 화면에서 csv파일을 다운 받든, 확인하여 별도 파일로 저장해둘 필요가 있다. 만약 저장해둔 비밀 액세스 키를 분실하면 더 이상 해당 액세스키는 사용이 불가능하다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/i&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;이 키들을 통해 Unity에서 사용자 증명을 생성하고, 해당 사용자 증명을 통해 s3에 접근할 수 있게된다.&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;p data-ke-size=&quot;size16&quot;&gt;이렇게 IAM에서 사용자 및 AccessKey를 만드는 방법에 대해 알아보았다. 몇번이고 언급하는 것이지만, AccessKey는 결코 유출되면 안되며, Git등에 해당 Key들을 커밋하면 안 된다.&amp;nbsp; (일어난 유출 사례 중에서 Git으로 일어나는 경우가 매우 많다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유출이 되면, 하루만에 4000만원이 청구되는 현실을 맞닦드릴지도 모른다. (필자는 아직 경험해보지 않았지만, 조금만 찾아도 나오는게 키 유출로 돈이 줄줄 새는 경험담이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스트에서는 이번에 만든 AccessKey와 이전에 만든 S3를 통해 유니티에서 동영상을 다운로드 하는 방법에 대해 알아볼 것이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 R&amp;amp;D</category>
      <category>Amazon S3</category>
      <category>AWS</category>
      <category>Unity</category>
      <category>아마존</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/227</guid>
      <comments>https://easycastleunity.tistory.com/227#entry227comment</comments>
      <pubDate>Mon, 16 Jun 2025 18:42:40 +0900</pubDate>
    </item>
    <item>
      <title>Amazon S3 with Unity R&amp;amp;D 2 - S3 사용법</title>
      <link>https://easycastleunity.tistory.com/226</link>
      <description>&lt;figure id=&quot;og_1750049047344&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;Amazon S3 with Unity R&amp;amp;D 1&quot; data-og-description=&quot;회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수준에서 위협이 높다. 그렇기에, 실 서비스 용 저장&quot; data-og-host=&quot;easycastleunity.tistory.com&quot; data-og-source-url=&quot;https://easycastleunity.tistory.com/225&quot; data-og-url=&quot;https://easycastleunity.tistory.com/225&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc1PYK/hyY8KXFtQ7/KBIPboqumEQCyF7RkNoX21/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/4rSte/hyY8Sg3z2b/4K4X6nYxf0pqHKJpPI6IEk/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/IJRfk/hyY8UeTjKI/YkxK5QKH0akzFSXq5IwnK1/img.png?width=1515&amp;amp;height=887&amp;amp;face=0_0_1515_887&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/225&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://easycastleunity.tistory.com/225&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc1PYK/hyY8KXFtQ7/KBIPboqumEQCyF7RkNoX21/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/4rSte/hyY8Sg3z2b/4K4X6nYxf0pqHKJpPI6IEk/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/IJRfk/hyY8UeTjKI/YkxK5QKH0akzFSXq5IwnK1/img.png?width=1515&amp;amp;height=887&amp;amp;face=0_0_1515_887');&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;Amazon S3 with Unity R&amp;amp;D 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다. 회사 전용 개발 서버가 있지만, http 여서 보안 수준에서 위협이 높다. 그렇기에, 실 서비스 용 저장&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;easycastleunity.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;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;처음으로는 S3에게 직접 연결하여 영상을 다운로드 하는 방법을 시험해 보았다.&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;전제 조건으로 AWS Console에 접속하여 아래 콘솔창 화면을 키고 따라와 주기 바란다.&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;3279&quot; data-origin-height=&quot;1770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; data-alt=&quot;AWS Console 홈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctwfcO/btsODqI2gJs/YHEKLeOmJ5uyoAwsXlAgs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctwfcO%2FbtsODqI2gJs%2FYHEKLeOmJ5uyoAwsXlAgs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3279&quot; height=&quot;1770&quot; data-origin-width=&quot;3279&quot; data-origin-height=&quot;1770&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS Console 홈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;버킷 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;먼저 테스트를 위해 S3 서비스에 접근하여 Bucket을 만들어보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 서비스에 접속하면 우상단에 아래 사진과 같은 &lt;b&gt;버킷 만들기 버튼&lt;/b&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;187&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GRBWl/btsODnr0tHZ/sreB1k1FoOW6dJwAyRSPK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GRBWl/btsODnr0tHZ/sreB1k1FoOW6dJwAyRSPK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GRBWl/btsODnr0tHZ/sreB1k1FoOW6dJwAyRSPK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGRBWl%2FbtsODnr0tHZ%2FsreB1k1FoOW6dJwAyRSPK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;187&quot; height=&quot;53&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 버튼을 눌러, 버킷을 만드는 창으로 이동한다.&amp;nbsp; 해당 창은 아래 사진과 같다.&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;2458&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRu8Bi/btsODXzAvX5/fwDK1PR6Rsd7ARzayskmcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRu8Bi/btsODXzAvX5/fwDK1PR6Rsd7ARzayskmcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRu8Bi/btsODXzAvX5/fwDK1PR6Rsd7ARzayskmcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRu8Bi%2FbtsODXzAvX5%2FfwDK1PR6Rsd7ARzayskmcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2458&quot; height=&quot;1502&quot; data-origin-width=&quot;2458&quot; data-origin-height=&quot;1502&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;2457&quot; data-origin-height=&quot;1409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UOvdH/btsOEjvAZIs/NHcTone7kGiqQRf8p5JHJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UOvdH/btsOEjvAZIs/NHcTone7kGiqQRf8p5JHJ1/img.png&quot; data-alt=&quot;&amp;amp;lt;Bucket 생성 페이지&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UOvdH/btsOEjvAZIs/NHcTone7kGiqQRf8p5JHJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUOvdH%2FbtsOEjvAZIs%2FNHcTone7kGiqQRf8p5JHJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2457&quot; height=&quot;1409&quot; data-origin-width=&quot;2457&quot; data-origin-height=&quot;1409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Bucket 생성 페이지&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 구성에서, Bucket 이름을 설정할 수 있다. 직접 유니티에 입력해야 되는 이름이니 관리하기 쉬운 이름으로 만드는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(명명 규칙이 있으니 이에 맞추어서 생성해보자. ex :&amp;nbsp; mycompany-myteam-mybucket)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 버킷 생성 시 가장 주의해야 될 부분은 바로 &lt;b&gt;이 버킷의 퍼블릭 액세스 차단 설정&lt;/b&gt; 칸이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여기서 모든 퍼블릭 액세스 차단을 활성화 하지 않고 만들게 되면, 말 그대로 public으로 버킷이 만들어 지게 된다.&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;그럼 모든 AWS 사용자가 버킷 이름만 알게 되면, 이 버킷의 동영상이나 파일등을 마음대로 올리는 것이 가능해지게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 사용에 대한 요금은 당연히 만든 사용자가 부담하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 기본적으로 AWS 에서는 퍼블릭 액세스 자체를 차단하는 것을 권고하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 설정들은 사용 방법에 따라 따로 설정해주는게 좋지만, 여기서는 기본 설정으로 만들어 보겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 적절하게 끝냈으면, 우하단에 &lt;b&gt;버킷 만들기 버튼&lt;/b&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;2483&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwf52i/btsOBj5Fsvg/KrxrKUNa0v4DE9KFWpjMMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwf52i/btsOBj5Fsvg/KrxrKUNa0v4DE9KFWpjMMk/img.png&quot; data-alt=&quot;Bucket 관리 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwf52i/btsOBj5Fsvg/KrxrKUNa0v4DE9KFWpjMMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwf52i%2FbtsOBj5Fsvg%2FKrxrKUNa0v4DE9KFWpjMMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2483&quot; height=&quot;593&quot; data-origin-width=&quot;2483&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bucket 관리 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷을 만들면 위와 같은 창이 뜨게 된다. 예시 이미지에서는 이름이 공란으로 보이지만, 보안을 위해 삭제한 것이기에 각자에게는 본인이 만들 때 입력한 이름이 파란색으로 보이고 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;버킷에 파일 올리기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷에 파일을 올려보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란색으로 쓰여 있는 버킷 이름을 눌러 버킷 안 쪽으로 들어가 보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래 사진과 같은 창이 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFrOjS/btsOBC4ZvgE/g2d8Ms7BxicX8zK8T7hBBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFrOjS/btsOBC4ZvgE/g2d8Ms7BxicX8zK8T7hBBK/img.png&quot; data-alt=&quot;아무것도 없는 초기에 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFrOjS/btsOBC4ZvgE/g2d8Ms7BxicX8zK8T7hBBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFrOjS%2FbtsOBC4ZvgE%2Fg2d8Ms7BxicX8zK8T7hBBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2486&quot; height=&quot;614&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아무것도 없는 초기에 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더를 만드는 방법은 간단하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우상단에 있는 폴더 만들기 버튼을 눌러 폴더를 만들면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누르면 아래와 같은 창으로 이동한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2451&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpoPgW/btsODEOa66x/I5JAeJLUSHTfuNIDLp88Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpoPgW/btsODEOa66x/I5JAeJLUSHTfuNIDLp88Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpoPgW/btsODEOa66x/I5JAeJLUSHTfuNIDLp88Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpoPgW%2FbtsODEOa66x%2FI5JAeJLUSHTfuNIDLp88Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2451&quot; height=&quot;1124&quot; data-origin-width=&quot;2451&quot; data-origin-height=&quot;1124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 폴더 이름을 입력하고 우하단에 있는 폴더 만들기 창을 누르면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들게 되면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2458&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q791m/btsOBSfVq1O/DYS9kGTMGR5JNeZkQujAKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q791m/btsOBSfVq1O/DYS9kGTMGR5JNeZkQujAKk/img.png&quot; data-alt=&quot;검은색 상자 부분은 버킷이름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q791m/btsOBSfVq1O/DYS9kGTMGR5JNeZkQujAKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq791m%2FbtsOBSfVq1O%2FDYS9kGTMGR5JNeZkQujAKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2458&quot; height=&quot;453&quot; data-origin-width=&quot;2458&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;검은색 상자 부분은 버킷이름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 폴더가 생성된다. 생성된 폴더 안으로 들어가는 것은 파란 이름 부분을 누르면 아래로 들어간다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 파일을 올려보자. 선행 조건으로 본인이 올리고 싶은 위치에 페이지를 열어 놔야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 올리는 방법은 2개 있다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;우상단에 있는 &lt;b&gt;업로드&amp;nbsp;&lt;/b&gt;버튼을 눌러, 파일 위치에 접근하여 업로드 하는 방식&lt;/li&gt;
&lt;li&gt;업로드할 파일을 보고 있는 페이지에 드래그 앤 드롭하는 방식&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 2개이고, 본인이 사용하고 싶은 방법을 자유롭게 선택하여 올리면 된다.&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;2486&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NR6op/btsOCEOT8JH/MRW5E59tcksHWPpGR0L1vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NR6op/btsOCEOT8JH/MRW5E59tcksHWPpGR0L1vK/img.png&quot; data-alt=&quot;대상 공란은 원래, 버캣 이름이 쓰여 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NR6op/btsOCEOT8JH/MRW5E59tcksHWPpGR0L1vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNR6op%2FbtsOCEOT8JH%2FMRW5E59tcksHWPpGR0L1vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2486&quot; height=&quot;1114&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대상 공란은 원래, 버캣 이름이 쓰여 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올릴 파일에 이름, 파일 유형, 크기등을 정리해서 보여준다. 여기서 확인을 마친 이후에 우하단에 있는 업로드 버튼을 누르면된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드 버튼을 눌러 성공적으로 파일이 올라가면 아래와 같은 페이지가 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg9Jwe/btsOBDv7Lva/3orYgHmeuoi6SK9TKXrKY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg9Jwe/btsOBDv7Lva/3orYgHmeuoi6SK9TKXrKY1/img.png&quot; data-alt=&quot;업로드 성공 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg9Jwe/btsOBDv7Lva/3orYgHmeuoi6SK9TKXrKY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg9Jwe%2FbtsOBDv7Lva%2F3orYgHmeuoi6SK9TKXrKY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2504&quot; height=&quot;882&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;업로드 성공 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 창이 나오면 정상적으로 업로드 된 것이고, 닫기 버튼을 눌러 나가면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Bucket 관리 페이지에서 파일이 정상적으로 올라간 것을 확인할 수 있다.&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;2476&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4GLXS/btsODU4jLDk/vQk3K5M8l2gP0xBVNG9Ej1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4GLXS/btsODU4jLDk/vQk3K5M8l2gP0xBVNG9Ej1/img.png&quot; data-alt=&quot;파일 정상적으로 업로드 됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4GLXS/btsODU4jLDk/vQk3K5M8l2gP0xBVNG9Ej1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4GLXS%2FbtsODU4jLDk%2FvQk3K5M8l2gP0xBVNG9Ej1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2476&quot; height=&quot;512&quot; data-origin-width=&quot;2476&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 정상적으로 업로드 됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;버킷에 올린 파일 삭제&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하다 보면, 분명 잘못 업로드 하는 경우가 있을 것이다. 이를 위해 파일 삭제에 대해 알아보자면 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올라간 파일 객체를 선택하면, 여러 버튼들이 활성화 되는데 그 중에서 삭제 버튼을 누르면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2465&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzwD6v/btsODiR94Ur/jxUBAXGV8tio2uG09CY7W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzwD6v/btsODiR94Ur/jxUBAXGV8tio2uG09CY7W1/img.png&quot; data-alt=&quot;객체를 선택하여 활성화된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzwD6v/btsODiR94Ur/jxUBAXGV8tio2uG09CY7W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzwD6v%2FbtsODiR94Ur%2FjxUBAXGV8tio2uG09CY7W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2465&quot; height=&quot;532&quot; data-origin-width=&quot;2465&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;객체를 선택하여 활성화된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 버튼을 누르면 아래 같은 페이지로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2455&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rOqEx/btsODkh67Vz/5JBlwUWBZovEfcLYyQUGrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rOqEx/btsODkh67Vz/5JBlwUWBZovEfcLYyQUGrK/img.png&quot; data-alt=&quot;삭제 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rOqEx/btsODkh67Vz/5JBlwUWBZovEfcLYyQUGrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrOqEx%2FbtsODkh67Vz%2F5JBlwUWBZovEfcLYyQUGrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2455&quot; height=&quot;829&quot; data-origin-width=&quot;2455&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삭제 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 파일이 삭제될 파일로 지정되었는지 보여지고, 삭제를 위해서는 입력칸에 &lt;b&gt;영구 삭제&lt;/b&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;2477&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o5CuF/btsODUJ0zhG/vfkGwpJZPnDP9IeSFimgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o5CuF/btsODUJ0zhG/vfkGwpJZPnDP9IeSFimgK0/img.png&quot; data-alt=&quot;삭제 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o5CuF/btsODUJ0zhG/vfkGwpJZPnDP9IeSFimgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo5CuF%2FbtsODUJ0zhG%2FvfkGwpJZPnDP9IeSFimgK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2477&quot; height=&quot;898&quot; data-origin-width=&quot;2477&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삭제 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대략적인 s3 사용법에 대해 설명해보았다.&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;다음 포스트에서는 Unity에서 사용하기 위해 IAM 설정을 하는 방법에 대해 알아 볼 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 R&amp;amp;D</category>
      <category>Amazon S3</category>
      <category>AWS</category>
      <category>Unity</category>
      <category>아마존</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/226</guid>
      <comments>https://easycastleunity.tistory.com/226#entry226comment</comments>
      <pubDate>Mon, 16 Jun 2025 13:44:31 +0900</pubDate>
    </item>
    <item>
      <title>Amazon S3 with Unity R&amp;amp;D 1 - 유니티 기본 세팅</title>
      <link>https://easycastleunity.tistory.com/225</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 VR 앱을 개발하고 있는데, 기타 동영상 등을 저장할 저장소에 필요성이 대두되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 전용 개발 서버가 있지만, http 여서 보안 수준에서 위협이 높다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에, 실 서비스 용 저장소를 만들어, 관리하기로 회의에서 결정되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 실 서비스 용 저장소에, 유력 후보로서 대두된 것이 Amazon S3이기에 이 Amazon S3를 사용하는 방법에 대해 R&amp;amp;D를 진행해보고자 한다.&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;이전에는 Unity 전용 SDK를 제공했지만, 더 이상 업데이트가 지원되지 않으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS SDK for .NET.&amp;nbsp;&lt;/b&gt;에 포함되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 AWS SDK for .NET.을 통해 구현하는 방법에 대해 R&amp;amp;D를 진행해보겠다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;계정 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 계정이 없는 경우, 아래 링크로 가서 생성해준다.&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1749522828532&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;company&quot; data-og-title=&quot;클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services&quot; data-og-description=&quot;Amazon Bedrock은 주요 AI 기업의 고성능 FM 옵션을 평가하고 선택하는 데 도움을 주는 완전관리형 서비스입니다. 기반 인프라를 관리하지 않고도 생성형 AI 애플리케이션을 구축할 수 있습니다. Amazon&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/&quot; data-og-url=&quot;https://aws.amazon.com/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cc6YsU/hyY5h9F1M8/1DRcG2aRgvWrUSxglIhuVk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/slTsQ/hyY5d0wnEQ/40u2J5685qBVzlYkpeDHc1/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109,https://scrap.kakaocdn.net/dn/bDHtCZ/hyY35BADHO/PNZ452qYbFDNaGa1aS7le0/img.png?width=2339&amp;amp;height=746&amp;amp;face=0_0_2339_746&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cc6YsU/hyY5h9F1M8/1DRcG2aRgvWrUSxglIhuVk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/slTsQ/hyY5d0wnEQ/40u2J5685qBVzlYkpeDHc1/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109,https://scrap.kakaocdn.net/dn/bDHtCZ/hyY35BADHO/PNZ452qYbFDNaGa1aS7le0/img.png?width=2339&amp;amp;height=746&amp;amp;face=0_0_2339_746');&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;클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon Bedrock은 주요 AI 기업의 고성능 FM 옵션을 평가하고 선택하는 데 도움을 주는 완전관리형 서비스입니다. 기반 인프라를 관리하지 않고도 생성형 AI 애플리케이션을 구축할 수 있습니다. Amazon&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유니티 세팅 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 프로젝트를 하나 생성해준다.&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;1515&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjNl4/btsOuxQix2U/DL8cMf54IRRyCpmz1bKQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjNl4/btsOuxQix2U/DL8cMf54IRRyCpmz1bKQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjNl4/btsOuxQix2U/DL8cMf54IRRyCpmz1bKQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjNl4%2FbtsOuxQix2U%2FDL8cMf54IRRyCpmz1bKQ9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1515&quot; height=&quot;887&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 Unity6 (6000.0.28f1)을 사용하여 테스트를 진행했다.&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;프로젝트가 다 만들어지면 아래 링크에 있는 GitHub로 가, Nuget for Unity를 다운받아 준다.&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1749542073137&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - GlitchEnzo/NuGetForUnity: A NuGet Package Manager for Unity&quot; data-og-description=&quot;A NuGet Package Manager for Unity. Contribute to GlitchEnzo/NuGetForUnity development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/GlitchEnzo/NuGetForUnity&quot; data-og-url=&quot;https://github.com/GlitchEnzo/NuGetForUnity&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0bNSQ/hyY8TMSPFQ/mwzvLUIiDMph1cPU5hUee1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_151_1057_241,https://scrap.kakaocdn.net/dn/bwNGXS/hyY8KoR6Ca/afzb9ZvjMpZMIh6Peq75M1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_151_1057_241&quot;&gt;&lt;a href=&quot;https://github.com/GlitchEnzo/NuGetForUnity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/GlitchEnzo/NuGetForUnity&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0bNSQ/hyY8TMSPFQ/mwzvLUIiDMph1cPU5hUee1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_151_1057_241,https://scrap.kakaocdn.net/dn/bwNGXS/hyY8KoR6Ca/afzb9ZvjMpZMIh6Peq75M1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_151_1057_241');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - GlitchEnzo/NuGetForUnity: A NuGet Package Manager for Unity&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A NuGet Package Manager for Unity. Contribute to GlitchEnzo/NuGetForUnity development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Release 창으로 들어가서 가장 최신 버전을 받아주면 된다. 필자가 받은 버전은 &lt;b&gt;NuGetForUnity.4.4.0 &lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;받은 unityPackage를 프로젝트에 Import 해준다. Import 과정은 모두 다 알 것이라고 생각하기에 생략한다.&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;NuGetForUnity가 다 Import 되었다면, 유니티 프로젝트 상단 창에 NuGet이라는 버튼이 새로 생긴다.&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;1580&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oaPkP/btsOwe9uVE5/eWcaEc1pUGjkxvp9XVpZV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oaPkP/btsOwe9uVE5/eWcaEc1pUGjkxvp9XVpZV1/img.png&quot; data-alt=&quot;NuGet 버튼 새로 생김&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oaPkP/btsOwe9uVE5/eWcaEc1pUGjkxvp9XVpZV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoaPkP%2FbtsOwe9uVE5%2FeWcaEc1pUGjkxvp9XVpZV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1580&quot; height=&quot;211&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NuGet 버튼 새로 생김&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 버튼을 누르면 드롭다운 메뉴가 펼쳐지는데, 그 중 가장 위에 있는 &lt;b&gt;Manage Nuget Packages&amp;nbsp;&lt;/b&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;1261&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccbQpS/btsOurhNged/ckNtBJDbx9w2hrMJKYZQ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccbQpS/btsOurhNged/ckNtBJDbx9w2hrMJKYZQ91/img.png&quot; data-alt=&quot;NuGet 매니저&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccbQpS/btsOurhNged/ckNtBJDbx9w2hrMJKYZQ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccbQpS%2FbtsOurhNged%2FckNtBJDbx9w2hrMJKYZQ91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;916&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NuGet 매니저&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 창에서 Online 상태로 두고, aws를 검색한다. 그럼 아래 사진과 같은 결과가 나오는데, 본인이 필요한 SDK를 검색하여 설치해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 S3를 사용해보고자 하기에 Core와 S3 SDK를 설치해주었다.&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;1274&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RBAM4/btsOv2Ig2Id/R35sPvu94OvQHktXlejck0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RBAM4/btsOv2Ig2Id/R35sPvu94OvQHktXlejck0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RBAM4/btsOv2Ig2Id/R35sPvu94OvQHktXlejck0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRBAM4%2FbtsOv2Ig2Id%2FR35sPvu94OvQHktXlejck0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;925&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Install을 해주면 AWS 설치는 완료된다.&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;다음 포스트에서는 대략적인 S3 사용법에 대해 작성해 보겠다.&lt;/p&gt;</description>
      <category>기타 R&amp;amp;D</category>
      <category>Amazon S3</category>
      <category>AWS</category>
      <category>Unity</category>
      <category>아마존</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/225</guid>
      <comments>https://easycastleunity.tistory.com/225#entry225comment</comments>
      <pubDate>Tue, 10 Jun 2025 11:35:38 +0900</pubDate>
    </item>
    <item>
      <title>유니티에서의 Meta Body Tracking</title>
      <link>https://easycastleunity.tistory.com/224</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Meta XR SDK의 71버전을 기준으로 작성합니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732584045386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Meta Developers&quot; data-og-description=&quot;&quot; data-og-host=&quot;developers.meta.com&quot; data-og-source-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&quot; data-og-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Meta Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.meta.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;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;통합 Body Tracking&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;학습 목적 &lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 페이지의 학습을 완료한 후 개발자는 아래의 사항을 수행할 수 있어야 합니다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;1. Body Tracking을 지원할 수 있는 프로젝트를 구성할 수 있다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 :&lt;/b&gt; 이 단계를 따르기 전에 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Movement SDK 시작하기&lt;/a&gt; 의 필수 구성요소를 확인하세요.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Body Tracking 추가&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VR에 맞게 프로젝트를 구성한 후 아래 단계를 따라라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Scene에 &lt;b&gt;OVRCameraRig&amp;nbsp;&lt;/b&gt;프리팹이 있는지 확인하라. 해당 프리팹은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;Packages/com.meta.xr.sdk.core/Prefabs/OvrCameraRig.prefab&amp;nbsp;&lt;/i&gt;에 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. OVRCameraRig 객체에서 &lt;b&gt;OVRManager&amp;nbsp;&lt;/b&gt;컴포넌트로 이동한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&lt;b&gt; Target Devices&lt;/b&gt;를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&lt;b&gt; Quest Features &amp;gt; General&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 스크롤 다운한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 만약 여러분이 Hand Tracking을 원한다면, &lt;b&gt;Hand Tracking Support&amp;nbsp;&lt;/b&gt;를 하기 위해&amp;nbsp;&lt;b&gt;Controllers and Hands&amp;nbsp;&lt;/b&gt;를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.&lt;b&gt; General &lt;/b&gt;아래에, Body Tracking Support를 선택하였는지 확인. 이 보기가 보이지 않는다면&amp;nbsp;&lt;b&gt;General&amp;nbsp;&lt;/b&gt;을 클릭&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IOBT를 사용하려면&amp;nbsp;&lt;b&gt;Movement Tracking&amp;nbsp;&lt;/b&gt;섹션에서 Body Tracking Fidelity 에 High를 선택한다. IOBT는 API의 요구 사항이 아닌 제안된 충실도 모드이다. 자세한 내용은 &lt;a href=&quot;#Troubleshooting&quot;&gt;Troubleshooting Body Tracking&lt;/a&gt;을 참고&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Full Body&lt;/b&gt;를&amp;nbsp;사용하려면 &amp;nbsp;&lt;b&gt;Movement Tracking&amp;nbsp;&lt;/b&gt;섹션에서&amp;nbsp;&lt;b&gt;Body Tracking Joint Set&amp;nbsp;&lt;/b&gt;을 선택&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Eye와 Face Tracking을 원한다면 6번과 동일한 설정을 적용한다.&amp;nbsp;&lt;b&gt;OVRManager&lt;/b&gt;는 필요한 추적 기술에 대해 선택해야 하는&amp;nbsp;&lt;b&gt;Permission Request On Startup&amp;nbsp;&lt;/b&gt;이 있다는 점에 유의해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 프로젝트가 Face, Eye Tracking이나 Hand Tracking&amp;nbsp;에 의존하는 경우 HMD에서 이러한 기능이 활성화되어 있는지 확인하세요. 이는 일반적으로 장치 설정의 일부이지만 &lt;b&gt;Settings &amp;gt; Movement Tracking&amp;nbsp;&lt;/b&gt;을 클릭하여 설정을 확인하거나 변경할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Project Setup Tool에서 진단한 모든 문제를 해결한다. Unity의 메뉴에서&amp;nbsp;&lt;b&gt;Edit &amp;gt; Project Settings &amp;gt; Meta XR&amp;nbsp;&lt;/b&gt;로 이동하여 Project Setup Tool에 액세스한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 플랫폼을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 문제가 있다면&amp;nbsp;&lt;b&gt;Fix All&amp;nbsp;&lt;/b&gt;을 선택한다. 자세한 내용은 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-upst-overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Use &lt;/a&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-upst-overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Project Setup Tool&lt;/a&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;Body Tracking을 하기 위한 캐릭터 세팅&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;학습 목적&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 섹션을 완료한 이후 개발자는 아래의 사항들을 할 줄 알아야 한다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Unity의 Mecanim Rig 관계를 이해한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;캐릭터 모델에 Body Tracking을 적용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;변형 논리(deformation logic)를 적용하여 캐릭터 Mesh에 맞추어 Bone을 조정하여 움직임이 자연스럽게 보이도록 할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&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;이 섹션에서는 캐릭터 에셋을 가져오는 방법, Unity Mecanim Humanoid로 리깅하는 방법, 그리고 Body Tracking을 활성화하는 방법에 대해 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meta는 84개의 Bone으로 구성된 독자적인 Body Tracking Skeleton을 사용한다. (부록 A 참조) 이 Skeleton은 캐릭터 리그가 아닌 human skeleton에 해당된다. Unity 내에서 Body Tracking API는 Unity GameObject에 연결된 Component들로 실행되는 일련의 스크립트를 통해 액세스한다.&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;Body Tracking Support가 활성화된 경우,&amp;nbsp;&lt;b&gt;OVRBody&amp;nbsp;&lt;/b&gt;스크립트는 Tracking 공간에서 업데이트된 Body Pose(위치 및 회전) 데이터를 폴링한다. 이 Pose 데이터는 직접 해석하여 사용할 수 있고, figure에 표시된 것처럼 Unity Mecanim Humanoid에 매핑할 수도 있다. Unity가 Skeleton의 각 Bone에 사용하는 명명 규칙은 Meta Body Tracking Skeleton과 동일하지 않으므로 Tracking Skeleton에서 Unity Mecanim Humanoid로 매핑해야 한다.&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;Mecanim Humanoid를 가지는 rig와 Character 가져오기&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터와 Mecanim Humanoid로서의 리그를 가져오기 위해 아래와 같은 단계를 따라라.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Unity Project에 커스텀 캐릭터를 asset의 형태로 가져온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. third-party&lt;b&gt; model asset (target rig)&lt;/b&gt;를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Unity Inspector 탭에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Rig&lt;/b&gt;&lt;span&gt;&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;544&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpYSRz/btsKX1MleYh/US1KKmVRqKiNnMQ6Ncxqw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpYSRz/btsKX1MleYh/US1KKmVRqKiNnMQ6Ncxqw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpYSRz/btsKX1MleYh/US1KKmVRqKiNnMQ6Ncxqw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpYSRz%2FbtsKX1MleYh%2FUS1KKmVRqKiNnMQ6Ncxqw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;156&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;Animation Type&amp;nbsp;&lt;/b&gt;옆에 있는&amp;nbsp;&lt;b&gt;Humanoid&amp;nbsp;&lt;/b&gt;를 클릭한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&amp;nbsp;&lt;b&gt;Apply&amp;nbsp;&lt;/b&gt;를 클릭한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이제 &lt;b&gt;Configure&amp;nbsp;&lt;/b&gt;버튼을 볼 수 있다. 이 버튼을 클릭하여 캐릭터의 시뮬레이션된 Bone 대부분이 Unity의 &lt;b&gt;&lt;i&gt;HumanBodyBones&amp;nbsp;&lt;/i&gt;&lt;/b&gt;에 매핑되었는지 확인한다. 턱이나 눈과 같은 특정 Bone들은 다리, 척추, 팔의 Bone에 비해 Body를 애니메이션화 하는데 필요하지 않을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. (선택사항) Scene에 가져올 때 캐릭터가 너무 작거나 너무 크게 보이면 Asset의 Model 탭에서 Scale Factor를 다른 값으로 수정한 다음 Apply를 클릭한다. Body Tracking이 Joints Transform을 수정할 때 Scene에서 캐릭터의 배율을 변경하면 만족스럽지 못한 결과가 발생한 가능성이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은 &lt;a href=&quot;https://docs.unity3d.com/Manual/class-Avatar.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Unity 설명서&lt;/a&gt;를 참조. 아래의 사진은 일반적인 Humanoid이다.&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;690&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cf7OC/btsKWoopAXM/KpNO1MgFsYEkkxKsNM9Q9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cf7OC/btsKWoopAXM/KpNO1MgFsYEkkxKsNM9Q9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cf7OC/btsKWoopAXM/KpNO1MgFsYEkkxKsNM9Q9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCf7OC%2FbtsKWoopAXM%2FKpNO1MgFsYEkkxKsNM9Q9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;859&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;859&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;8.&amp;nbsp;&lt;b&gt;Muscles &amp;amp; Settings&amp;nbsp;&lt;/b&gt;로 가서 마지막까지 스크롤하여&amp;nbsp;&lt;b&gt;Translation DoF&amp;nbsp;&lt;/b&gt;가 활성화되어 있는지 확인하자. 활성화되어 있지 않으면 활성하한 다음 그 아래에 있는&amp;nbsp;&lt;b&gt;Apply&amp;nbsp;&lt;/b&gt;버튼을 클릭하세요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clGQLf/btsKV3dDQ1n/2DwyntIky5Spl2XvowcGD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clGQLf/btsKV3dDQ1n/2DwyntIky5Spl2XvowcGD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clGQLf/btsKV3dDQ1n/2DwyntIky5Spl2XvowcGD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclGQLf%2FbtsKV3dDQ1n%2F2DwyntIky5Spl2XvowcGD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;1210&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;1210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 타겟 캐릭터는 Humanoid로 가져왔고, 각각의 Bone은&amp;nbsp;&lt;b&gt;HumanBodyBone&amp;nbsp;&lt;/b&gt;스크립트의 enum 값과 연결되어 있다.&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;h3 data-ke-size=&quot;size23&quot;&gt;캐릭터에 대한 Tracking 활성화&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 단계는 Service에서 Body Tracking Pose를 읽고 캐릭터에 적용하는 스크립트인 컴포넌트를 캐릭터에 추가하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 캐릭터의 모델이나 프리팹을 Scene으로 드래그한다. 모델에는 아바타가 할당된 애니메이터 Component가 있어야한다. 그렇지 않은 경우, 이전 섹션의 단계를 따르고 애니메이션 유형을 Humanoid로 변경한다.&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;2. 모델을 마우스 우클릭한 다음&amp;nbsp;&lt;b&gt;Movement Samples &amp;gt; Body Tracking &amp;gt; Animation Rigging Retargeting(upper body)(constraints)&lt;/b&gt;를 선택한다. Full Body 캐릭터의 경우, &lt;b&gt;Movement Samples &amp;gt; Body Tracking &amp;gt; Animation Rigging Retargeting(full body)(contraints)&lt;/b&gt;를 사용한다. 제약조건이 있는 옵션은 다음을 추가하여 캐릭터의 모양을 개선한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;Rig &lt;/b&gt;아래에 있는 FullBodyDeformationConstraint (Animation Rigging)을 사용하여 캐릭터 비율을 유지한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이전 단계에서 추가한 컴포넌트에서 다음 옵션을 확인한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Generative Legs의 경우, 캐릭터의&amp;nbsp;&lt;b&gt;Provided Skeleton Type&lt;/b&gt;이 OVRBody에서&amp;nbsp;&lt;b&gt;Full Body&amp;nbsp;&lt;/b&gt;로 설정되어 있는지 확인해야 한다. 또한 OVRManager의&amp;nbsp;&lt;b&gt;Body Tracking Joint Set&amp;nbsp;&lt;/b&gt;은 모든 캐릭터에서 전체 신체 관절을 표현하기 위해&amp;nbsp;&lt;b&gt;Movement Tracking&amp;nbsp;&lt;/b&gt;섹션에서&amp;nbsp;&lt;b&gt;Full Body&amp;nbsp;&lt;/b&gt;로 설정되어 있어야 한다. IOBT의 경우, OVRManager의 &lt;b&gt;Movement Tracking&amp;nbsp;&lt;/b&gt;섹션에서 &lt;b&gt;Body Tracking Fidelity&amp;nbsp;&lt;/b&gt;가 High로 설정되어 있는지 확인해아 한다. IOBT는 API의 요구사항이 아닌 권장 충실도 모드입니다. 자세한 내용은 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking/#troubleshooting-body-tracking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Troubleshooting Body Tracking&lt;/a&gt;에서 확인&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이전 단계에서 추가한 Retargeting Layer에 다음 사항이 있는지 확인한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;Skeleton Type&lt;/b&gt;이 &lt;b&gt;Full Body&lt;/b&gt;로 설정&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tracking By Proxy&lt;/b&gt;가 체크되어 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Blend Left Hand, Blend Right Hand, Correct Bones, Correct Left Hand, Correct Right Hand&lt;/b&gt; 리타겟팅 프로세서는 &lt;b&gt;Retargeting Processors&lt;/b&gt; array에 위치하고 할당된다. 이것들은 &lt;i&gt;Packages/com.meta.movement/Shared/RetargetingProcessors&lt;/i&gt; 에서 찾을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blend Hand Processor들은 추적된 위치로 편향하여 손이 몸 앞에 있을 때 정확한 위치를 유지하려고 노력한다. 그러나 손이 머리 위나 몸의 옆이나 뒤로 움직일 때 프로세서는 캐릭터 Humanoid Constraints를 유지하는 쪽으로 편향된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐릭터 외관 개선&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity Mecanim Humanoid는 Bone에서 Bone으로 움직임을 전송할 수 있는 명명 규칙을 제공하지만 캐릭터가 여러 가지 이유로 움직이려고 할 때 문제가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 Rig는 Mesh의 앞이나 뒤쪽에 위치할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Rig의 비율이 일반적인 인간의 비율과 일치하지 않을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;추적되는 사람은 등장인물과 비율이 상당히 다를 수 있다. (ex: 어깨가 넓은 경우)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 움직임이 자연스럽게 보이도록 캐릭터를 조정해야 하는 경우가 많다. Meta는 캐릭터가 움직이는 동안 더 자연스럽게 보이도록 하는 변형 제약 조건(&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;deformation constraints)&lt;/span&gt;을 제공했다. 아래의 gif는 파란색 로봇 예제를 자연스럽게 보이도록 하기 위해 따른 순서를 보여준다. 따라야 할 정확한 단계는 창작 의도에 따라 달라진다. 예를 들어, 캐릭터가 굽은 자세로 걷게 하거나 좋은 자세를 취하게 하기를 원할 수 있다. gif는 원래 비율을 유지하면서 파란색 로봇으로 리타겟팅 하는 방법을 나타내고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPNDOI/btsKXG9yGwt/x3LYPxlPirJR8MpBuZP6uk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPNDOI/btsKXG9yGwt/x3LYPxlPirJR8MpBuZP6uk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPNDOI/btsKXG9yGwt/x3LYPxlPirJR8MpBuZP6uk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cPNDOI/btsKXG9yGwt/x3LYPxlPirJR8MpBuZP6uk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;334&quot; height=&quot;334&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;&lt;b&gt;Base Retargeting (기본 리타겟팅) : &lt;/b&gt;이 단계에서는 캐릭터와 Body Tracking에서 수신한 데이터 간의 비율 차이를 고려하지 않고 리타게팅된 캐릭터에 Body Tracking 정보를 적용한다. 여기에서는 캐릭터의 Mesh에 Skinning된 Mecanim Humanoid의 Bone 변형을 수정하여 회전과 위치에 영향을 미치는 작업이 포함된다.&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;277&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1OP3W/btsKWbCWmbr/pxJC7J9OU5AnUnOWqw0rrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1OP3W/btsKWbCWmbr/pxJC7J9OU5AnUnOWqw0rrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1OP3W/btsKWbCWmbr/pxJC7J9OU5AnUnOWqw0rrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1OP3W%2FbtsKWbCWmbr%2FpxJC7J9OU5AnUnOWqw0rrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;236&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;b&gt;Adjust(조정) :&amp;nbsp;&lt;/b&gt;캐릭터는 캐릭터가 조작된 방식에 따라 Tracking 결과에 적용되는 추가 회전 조정이 필요할 수 있다. 조정을 수정하려면 &quot;Adjust&quot; 배열을 수정해야 한다. &quot;Adjust&quot; 배열은 캐릭터에 대한 Tracking 활성화 섹션의 2단계에서 설명한 원클릭으로 캐릭터에 추가된 Retargeting Layer 스크립트의 일부이다. 기본적으로 원클릭 설정은 자동으로 계산되는 척추와 어깨에 대한 조정을 추가한다. 이러한 회전의 축이나 값으로 인해 적용 시 모델이 이상하다면 조정을 수정하거나 제거해야 한다.&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;472&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BCFe4/btsKWiIrj3y/qqzXUJCcsRT6K0zKLlGBK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BCFe4/btsKWiIrj3y/qqzXUJCcsRT6K0zKLlGBK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BCFe4/btsKWiIrj3y/qqzXUJCcsRT6K0zKLlGBK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBCFe4%2FbtsKWiIrj3y%2FqqzXUJCcsRT6K0zKLlGBK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;785&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;&lt;b&gt;Base Deformation&amp;nbsp;&lt;/b&gt;(기본 변형) : 이 단계에서는 많은 Skeleton에 공통적인 몇 가지 기본 제약을 추가한다. 변형 제약 스크립트는 원클릭 설정이 적용된 캐릭터의 Rig 구조에 추가되었다. 원클릭을 적용한 캐릭터의 Rig GameObject 아래에 있는 프로젝트 탐색기에서 이를 볼 수 있어야 한다. 아래의 이미지에서 FullBodyDeformationConstraint 는 원클릭으로 추가되었다.&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;277&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KoFvG/btsKWbpsY6E/4HaJIclmCBkp4KIUNEpAgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KoFvG/btsKWbpsY6E/4HaJIclmCBkp4KIUNEpAgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KoFvG/btsKWbpsY6E/4HaJIclmCBkp4KIUNEpAgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKoFvG%2FbtsKWbpsY6E%2F4HaJIclmCBkp4KIUNEpAgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;225&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deformation Settings(변형 설정)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변형 설정을 사용하려면 Body Tracking으로 구동되는 캐릭터의 Skeleton과 앞서 설명한 Body Tracking Skeleton 사이에서 균형을 맞추어야 한다. 여기에는 창작 의도에 대한 이해가 필요하다. 예를 들어, 캘기터는 구부정하게 서 있는 사람을 Tracking하는 Tracking Skeleton과 함께 구부정하게 서 있는 늙은 마법사를 나타낼 수 있다. 이 상황에서는 추적된 사람에서 멀어지고( &lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;away from the tracked person&lt;/span&gt; ) 캐릭터 Skeleton 쪽으로 기울어지게 하여 세번째 사람이 자세가 좋은 사람이 걷는 것이 아닌 구부정한 마법사가 걷는 모습을 볼 수 있도록 해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;Spine&amp;nbsp;Translation&amp;nbsp;Correction&amp;nbsp;Type(척추 변환 수정 유형) :&amp;nbsp;&lt;/b&gt;이 설정은 엉덩이와 머리 위치의 관계가 추적된 인간 위치와 매우 다를 수 있기 때문에 필요하다. 다리에 비해 몸통이 큰 캐릭터를 생각해 보자. 머리 위치가 정확하기를 원하고 머리 위치에 따라 캐릭터의 비율을 조정해야 할까? 이렇게 하면 &quot;Accurate Head&quot; 를 선택하면 머리 위치에 따라 캐릭터의 크기가 조정되어 엉덩이가 올바른 위치에 있지 않을 수 있다. 반면에 캐릭터의 엉덩이 위치가 더 중요하면 &quot;Accurate Hips&quot; 를 선택하면 머리 위치가 실제 머리보다 높아질 수 있다. 둘 다 원하는 경우 추적된 위치와 일치하도록 몸통 비율 중 일부가 손상된다. 이 설명에 대한 한 가지 주의 사항은 전신(Full Body)을 사용할 때 항상 올바른 발 위치를 사용한 다음 머리/엉덩이 위치에 따라 조정해야 한다는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gz12x/btsKWjUYBeT/zEXvc31SbM750cBNllFbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gz12x/btsKWjUYBeT/zEXvc31SbM750cBNllFbY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gz12x/btsKWjUYBeT/zEXvc31SbM750cBNllFbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGz12x%2FbtsKWjUYBeT%2FzEXvc31SbM750cBNllFbY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;557&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;b&gt;Spine Alignment (척추 정렬):&amp;nbsp;&lt;/b&gt;이 설정을 사용하면 척추의 실제 추적 위치와 척추를 엉덩이 위에 수직으로 정렬하는 것 사이의 균형을 맞출 수 있다. 많은 캐릭터는 엉덩이 위에 완벽하게 곧은 척추가 정렬되어 있다고 가정하도록 제작되었다. 가중치 1은 SpineLower/SpineUpper/Chest Bone을 엉덩이에 정렬하고 ,가중치 0은 SpineLower/SpineUpper/Chest Bone을 추적된 척추 위치에 정렬한다. 이것은 Rest Pose의 시작 위치에 적용된다. 모든 값이 1로 설정되어 있어도 캐릭터는 여전히 구부릴 수 있지만 캐릭터의 Rest Pose(직선일 가능성 있음)와 유사한 척추로 구부릴 수 있음을 의미한다. Unity Mecanim Humanoid는 매핑되지 않은 Bone(Unity Skeleton에 Bone이 많은 경우) 을 자동으로 보간하고 Bone이 적은 경우 정확하지 않을 수 있지만 최소한 아래쪽 척추가 매핑되어 있으면 작동해야 한다. Bone이 적은 경우, 이건 동작해야 한다. 추적 품질은 낮추는 대신 원래 Spine Bone 로컬 위치를 적용하려면 &quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;Original Spine Positions Weight&lt;/i&gt;&lt;/span&gt;&quot; 의 가중치를 늘려야 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daVBp0/btsKW9j75G2/4DwfNbWhOZAw6UhxHiSK2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daVBp0/btsKW9j75G2/4DwfNbWhOZAw6UhxHiSK2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daVBp0/btsKW9j75G2/4DwfNbWhOZAw6UhxHiSK2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaVBp0%2FbtsKW9j75G2%2F4DwfNbWhOZAw6UhxHiSK2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;565&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;Shoulder Interpolation(어깨 보간)&amp;nbsp;&lt;/b&gt;: 추적하는 사람의 어깨 너비가 캐릭터와 크게 다를 경우, 정확한 어깨 위치를 유지하는 것과 캐릭터의 모양과 보여지는 모양새 사이에서 균형을 맞추어야 한다. 예를 들어, 추적하는 사람의 어깨가 넓고 스타일 적으로 우앙한 발레리나를 표현하려는 경우, 어깨의 정확한 위치 지정보다 캐릭터를 유지하는 쪽으로 오차를 두는 것이 좋습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/75Bqx/btsKWchApuT/V0ZAtBaOLHTCTUhnhGKMn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/75Bqx/btsKWchApuT/V0ZAtBaOLHTCTUhnhGKMn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/75Bqx/btsKWchApuT/V0ZAtBaOLHTCTUhnhGKMn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F75Bqx%2FbtsKWchApuT%2FV0ZAtBaOLHTCTUhnhGKMn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;565&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가중치 1은 추적된 어깨 위치를 무시하고 어깨를 원래 가슴에 대한 로컬 위치에 배치한다. 가중치 0은 어깨를 추적된 위치에 배치한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Retargeting Layer&lt;/i&gt;에서 ArmatureCorlectBones의 리타겟팅 프로세서에는 제한된 근육 공간 회전이 잘못된 경우 업데이트할 수 있는 &lt;b&gt;Shoulder Correction Weight Late Update&lt;/b&gt;가 있습니다. 가중치 1은 근육 공간에 의해 제한 되지 않고 리타게팅된 어깨 회전을 사용하는 반면, 가중치 0은 근육 공간에 의 제한된 어깨 회전을 사용한다.&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;811&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxa5ao/btsKWN2voEC/oEiDRH0TGil9Pk9COHjMJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxa5ao/btsKWN2voEC/oEiDRH0TGil9Pk9COHjMJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxa5ao/btsKWN2voEC/oEiDRH0TGil9Pk9COHjMJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxa5ao%2FbtsKWN2voEC%2FoEiDRH0TGil9Pk9COHjMJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;667&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;팔과 손 보간&lt;/b&gt; : 팔을 배치하는 데도 비슷한 트레이드 오프가 있다. 가중치 1은 캐릭터의 비율을 사용하여 팔(위팔과 아래팔 Bone)을 배치한다. 가중치 0은 팔을 추적된 위치에 배치한다. 손 가중치도 같다. 예를 들오, 추적된 사람에 비해 캐릭터의 팔이 정말 짧은 경우 다음 가중치를 사용하여 조정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dalEPi/btsKWXD63ul/9TD25jG5hhbukLvumZExCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dalEPi/btsKWXD63ul/9TD25jG5hhbukLvumZExCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dalEPi/btsKWXD63ul/9TD25jG5hhbukLvumZExCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdalEPi%2FbtsKWXD63ul%2F9TD25jG5hhbukLvumZExCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;565&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;b&gt;다리 정렬&amp;nbsp;&lt;/b&gt;: 다리 가중치를 사용하여 추적된 위치(가중치 0)과 비율이 적용되고 정렬된 후의 위치(가중치 1)사이에 다리를 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JjkLl/btsKYiApduv/0NVk9Ln2Jxjmoxd7ha0Zv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JjkLl/btsKYiApduv/0NVk9Ln2Jxjmoxd7ha0Zv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JjkLl/btsKYiApduv/0NVk9Ln2Jxjmoxd7ha0Zv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJjkLl%2FbtsKYiApduv%2F0NVk9Ln2Jxjmoxd7ha0Zv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;565&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;&lt;b&gt;발 정렬 :&amp;nbsp;&lt;/b&gt;Tracking Skeleton은 발 아치가 약간 있다. 이로 인해 캐릭터의 발가락이 위로 들어올려질 수 있다. 발 정렬 가중치에 대한 가중치 1은 추적된 수직회전을 무시하고 발을 발가락 쪽으로 회전한다. 가중치 0은 추적된 발 회전을 변경하지 않는다. 비율을 적용할 때 발가락 위치가 잘못되어 보이면 발가락 가중치를 조정할 수 있다. 발가락 가중치에 대한 가중치 1은 발가락을 발에 대한 로컬 위치에 배치한다. 발가락 가중치에 대한 가중치 0은 발가락을 추적된 위치에 배치한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2VnqX/btsKYf4KDbx/aRW7gmzQM8UxZD4ZGJcoYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2VnqX/btsKYf4KDbx/aRW7gmzQM8UxZD4ZGJcoYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2VnqX/btsKYf4KDbx/aRW7gmzQM8UxZD4ZGJcoYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2VnqX%2FbtsKYf4KDbx%2FaRW7gmzQM8UxZD4ZGJcoYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;565&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Retargeting Processor(리타겟팅 프로세서)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리타겟팅 프로세서는 LateUpdate 단계에서 데이터를 저장하고 명령을 실행하여 Unity의 Humanoid 근육 공간의 제약을 넘어서는 최종 리타게팅 출력을 조정하는 Scriptable Object이다.&amp;nbsp; 여기에는 손가락의 위치 및 회전 수정과 잠재적으로 캐릭터의 다른 Bone이 포함된다. 이러한 프로세서는 기본 RetargetingProcessor.cs 스크립트를 상속한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;Blend Hands Processor :&lt;/b&gt; 이 프로세서는 추적된 손 데이터를 기반으로 머리 시야 내에 들어올 때 손의 최적 배치를 결정한다. 보이는 손에 대해 IK 타겟을 정확하게 설정하고 가려진 손에 대해 팔 회전을 유지함으로써 이 접근 방식은 리타겟팅된 바디 추적을 통해 현실적인 손 위치와 보존된 팔 움직임을 모두 보장한다. 가중치 1은 이 프로세서가 IK프로세서 가중치를 적극적으로 수정하고, 가중치 0은 IK 프로세서 가중치를 수정하지 않음을 의미한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Correct Bones Processor :&amp;nbsp;&lt;/b&gt;이 프로세서는 애니메이션 리깅 스택에 있는 Pose Capture constraints 의 정보를 사용하여 근육 공간에 의해 제한되지 않도록 Humanoid의 모든 Bone의 위치와 회전을 업데이트한다. 가중치 1은 근육 공간에 의해 제한되지 않는 애니메이션 리깅의 위치 및 회전 오프셋을 적용하고, 가중치 0은 업데이트를 적용하지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Correct Hands Processor :&amp;nbsp;&lt;/b&gt;이 프로세서는 IK 알고리즘을 사용하여 팔의 회전을 조작하여 손이 지정된 IK 대상의 위치에 도달하도록 업데이트한다. 가중치 1은 선택한 IK 알고리즘을 완전히 실행하고, 가중치 0은 팔과 손의 위치에 수정 사항이 적용되지 않습니다.&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Remaining Touch-ups :&amp;nbsp;&lt;/b&gt;모델이 여전히 제대로 보이지 않으면 부록 C - 고급 Body Contrasints에 설명된 고급 조정을 시도할 수 있다. 캐릭터가 캐릭터를 좌석에 고정하고 VR 환경이 평평하지 않은 경우 (ex: 계단) 추적을 무시하려는 경우에도 유용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자와 일치하도록 캐릭터 키 조정&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서 선택한 옵션에 따라 캐릭터가 사용자의 키에 따라 변형될 수 있다. 따라서 관절 주변 영역이 Mesh에 충분히 영향을 미쳐 키가 다른 사용자를 허용하도록 하여 캐릭터가 다양한 키에 적응할 수 있도록 해야 한다. 부록 C의 &lt;u&gt;캐릭터 키 구성&lt;/u&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;캐릭터에 애니메이션 추가하기&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 섹션을 완료한 후 개발자는 다음 사항들을 알아야 한다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;Body Tracking이 키 프레임 애니메이션과 호환된다는 것을 이해한다.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;이러한 지식을 적용하여 키 프레임 애니메이션을 가져오고 애니메이션을 전체 리그 또는 리그의 일부 (ex: 다리) 에만 적용할 수 있다&lt;/i&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서는 Body Tracking을 사용하여 키 프레임 애니메이션을 가져와 전체 리그나 리그의 일부 &lt;i&gt;(ex: 다리)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;span&gt;에만 적용하는 방법을 자세히 설명한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;캐릭터에 키 프레임 애니메이션을 추가하고 싶은 다양한 시나리오가 있다. 예를 들어, 애니메이션은 컨트롤러를 사용하여 캐릭터를 구동할 때 Body Tracking 상태에서 &quot;애니메이션 실행&quot; 상태로 변경하는 데 사용할 수 있다. (Body Tracking과 함께 Locomotion 컨트롤러를 사용하는 방법에 대한 자세한 내용은 다음 섹션을 참조)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MovementRetargeting.unity Scene에는 파도 애니메이션을 사용하여 신체 일부를 움직이는 예가 나와 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;캐릭터에 애니메이션을 추가하려면:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 추가하고 싶은 애니메이션을 다운로드하거나 직접 만든다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 캐릭터에 아바타가 할당된 Animator 컴포넌트가 있는지 확인한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. 애니메이션을 재생할 시기를 제어하고 Animator의 Controller 필드에 할당할 Animator Controller를 추가한다. 메타가 제공한 예제 씬의 WaveAnimController에서 이것에 대한 예시가 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4. 애니메이션이 작동하는 데 사용할 세 개의 마스크를 정의한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Animation Mask :&lt;/b&gt; 이것은 애니메이션이 적용되는 마스크이다. Meta의 예시에서 JustRightArm이 이것이다. 이 마스크는 애니메이션 컨트롤러의 WaveAnimation 레이어의 속성으로 구성된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Retargeting Mask :&amp;nbsp;&lt;/b&gt;리타겟팅일 적용되는 마스크이다. Meta의 예시에서 ExcludeRightArm이며, &lt;b&gt;&lt;i&gt;RetargetingConstraint&lt;/i&gt;&lt;/b&gt;의 &lt;b&gt;&lt;i&gt;AvatarMaskComp&lt;/i&gt;&lt;/b&gt; 필드에 적용된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Full Body Mask :&amp;nbsp;&lt;/b&gt; 애니메이션이 꺼지면 이 마스크는 리타겟팅이 캐릭터의 몸 전체에 다시 영향을 미칠 수 있음을 나타낸다. 이건 캐릭터의 Rig에 있는 &lt;b&gt;&lt;i&gt;RetargetingConstraint&lt;/i&gt;&lt;/b&gt;의&lt;b&gt;&lt;i&gt; AvatarMaskComp&lt;/i&gt;&lt;/b&gt;에 적용되어야 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바디 트래킹은 설정하는 원클릭 스크립트에는 Animator 구성 요소가 필요하며 Humanoid 애니메이션과 함께 사용할 수 있다. 기존 프로젝트로 가져오는 경우 캐릭터에 이미 애니메이션과 애니메이션 컨트롤러가 있을 수 있다. 아래는 리타겟팅과 통합되는 방법에 대한 참고 사항이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Animation Masks :&amp;nbsp;&lt;/b&gt;애니메이션이 같은 관절에서 재생되는 동안 리타겟팅이 영향을 미치지 않아야 하는 신체부위에 대한 애니메이션 마스크를 정의한다. 애니메이션이 재생을 멈추면 다른 마스크를 사용하여 리타겟팅이 모든 관절에 영향을 미칠 수 있도록 한다. 우리는 리타겟팅 샘플에서 웨이브 애니메이션을 구현하고 재생 중인 애니메이션에 해당하는 마스크를 사용한다. 캐릭터에 애니메이션 추가를 참조하세요.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Animator states :&amp;nbsp;&amp;nbsp;&lt;/b&gt;애니메이션 컨트롤러에서 애니메이션으로의 전환을 허용하는 상태를 정의할 수 있다. 예를 들어, 컨트롤러가 캐릭터에서 애니메이션을 재생하지 않고 대신 Body Tracking 이 캐릭터에 영향을 미치는 Idle 상태에서 결정할 수 있다. 그런 다음 애니메이션 상태 (ex: 걷기, 달리기) 로 전환할 때 애니메이션을 재생하도록 허용하고 마스킹을 사용하여 애니메이션과 관련된 관절에서 리타겟팅을 방지한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 :&amp;nbsp;&lt;/b&gt;런타임에 캐릭터에 리타겟팅을 추가할 수 있는&lt;a href=&quot;https://github.com/oculus-samples/Unity-Movement/blob/main/Runtime/Scripts/Utils/AddComponentsRuntime.cs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; AddComponetsRuntime.cs&lt;/a&gt; 스크립트가 있다. 해당 스크립트의&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;메서드 SetUpCharacterForRetargeting 및 SetUpCharacterForAnimationRiggingRetargeting 을 참조&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;Locomotion 컨트롤러 추가&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 섹션을 완료한 후 개발자는 다음을 수행할 수 있어야 한다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;컨트롤러 기반 애니메이션과 Body Tracking의 필요성을 이해한다.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Body Tracking과 함께 컨트롤러 기반 애니메이션을 허용하는 이동 컨트롤러를 구현할 수 있다.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서는 Body Tracking과 함께 컨트롤러 기반 애니메이션을 허용하는 이동 컨트롤러를 구현하는 방법에 대해 알아본다.&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;Body Tracking을 통한 이동에 유용한 디자인 패턴은 가상 세계에서 컨트롤러 기반 입력을 사용하여 탐색한 다음 특정 컨텍스트나 위치 내에서 Body Tracking을 사용하는 것이다. 컨트롤러 기반 탐색 중에 캐릭터는 일반적으로 가상 세계에서 캐릭터의 속도(ex: 걷기, 조깅, 달리기)에 따라 애니메이션화 된다. 플레이어 컨트롤러를 구현하는 데는 다양한 옵션이 있으며 온라인에서 튜토리얼을 쉽게 이용할 수 있습니다. 그러나 컨트롤러 기반 애니메이션과 Body Tracking을 혼합하기 위해서는 솔루션이 다음과 같은 문제를 해결해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지면과 물체의 상호작용이 원활히 작동하도록 충돌체를 배치한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;PlayerController를 가상 세계에서 올바르게 이동하고 카메라를 1P 시점에 맞춰 유지한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;컨트롤러 구동 애니메이션을 재정의하여 Body Tracking을 허용하는 시기를 결정한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용을 살펴보기 전이 몇 가지 핵심 개념을 이해하는 것이 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;World / Absolute space vs Local / Tracking space : 사용자가 절대 공간에서 점프하거나 움직일 때 (메타가 제공한 샘플에서는 왼쪽 조이스틱 사용) PlayerController의 움직임. 이 움직임은 게임 세계를 통해 local body-tracked tarcked space (OvrCameraRig) 의 위치를 이동한다. 사용자가 현실 세계에서 움직일 때 XR 하드웨어는 그 움직임을 감지하고 사용자의 Body는 추적 공간 내에서 움직인다. 추적 공간을 회전할 수 있으며 (메타가 제공한 샘플에서는 오른쪽 컨트롤러 조이스틱에서 좌우로), 추적 공간의 원점을 중심으로 하는 것이 아니라 추적 공간에서 플레이어의 위치를 중심으로 회전한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;PlayerController - 사용자가 캐릭터를 움직이기 위해 제어하는 GameObject이다. PlayerController는 UserInput 벡터가 조작될 때 애니메이션 캐릭터를 이동(또는 순간이동) 한다. Motion은 Rigidbody 컴포넌트의 속도와 함께 Unity의 물리 시스템에 의해 관리된다. 이동 중 지면과의 충돌도 충돌체를 사용하여 구현된 Unity의 물리 시스템을 사용한다. Sphere Collider는 사용자의 실제 지상 위치 추정에 따라 움직인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zczdJ/btsKW592E8Q/OwxoetLxS5K8VL8W3RVzGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zczdJ/btsKW592E8Q/OwxoetLxS5K8VL8W3RVzGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zczdJ/btsKW592E8Q/OwxoetLxS5K8VL8W3RVzGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzczdJ%2FbtsKW592E8Q%2FOwxoetLxS5K8VL8W3RVzGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;173&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;173&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity 입력에는 입력을 수신하기 위한 Legacy Input API가 있다. (ex: Input.GetAxis..) 이는 MovementLocomotion 샘플의 UnityInputBinding 컴포넌트&amp;nbsp;&lt;b&gt;(PlayerController 객체 &amp;gt; Controls 개체)&amp;nbsp;&lt;/b&gt;에서 수평 및 수직 입력을 수신하는 데 활용되지만 다른 형태의 입력도 쉽게 사용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Meta Quest Controller의 입력은 Meta의 OVRInput API에서 읽을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타는 원리를 설명하기 위해 기본 XR 운동 컨트롤러를 구현하는 샘플을 제공했다. 운동 컨트롤러를 설정하는 기본 단계는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 컨트롤러의 변환 (위치 및 회전) 역할을 할 게임 오브젝트를 만든다. 캐릭터를 움직이기 위해 입력과 물리를 처리하는 스크립트가 있어야한다. Meta에서 제공하는 스크립트는 MovementSDKLocomotion이라고 하며 물리를 위한 Rigidbody가 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp; 컨트롤러를&amp;nbsp;따라야&amp;nbsp;하는&amp;nbsp;캐릭터의&amp;nbsp;스킨&amp;nbsp;메쉬(사용자에게&amp;nbsp;보이는&amp;nbsp;몸체)를&amp;nbsp;추가합니다.&amp;nbsp;메시&amp;nbsp;본체를&amp;nbsp;컨트롤러에&amp;nbsp;연결하는&amp;nbsp;가장&amp;nbsp;간단한&amp;nbsp;방법은&amp;nbsp;메시&amp;nbsp;개체를&amp;nbsp;컨트롤러(1단계에서&amp;nbsp;만든&amp;nbsp;개체)의&amp;nbsp;하위&amp;nbsp;개체로&amp;nbsp;설정하는&amp;nbsp;것입니다.&amp;nbsp;이전&amp;nbsp;섹션에서는&amp;nbsp;신체&amp;nbsp;추적을&amp;nbsp;사용하여&amp;nbsp;메시의&amp;nbsp;애니메이터를&amp;nbsp;조작하는&amp;nbsp;방법을&amp;nbsp;설명했습니다.&amp;nbsp;우리의&amp;nbsp;예에서는&amp;nbsp;캐릭터&amp;nbsp;메시가&amp;nbsp;컨트롤러의&amp;nbsp;계층&amp;nbsp;구조에&amp;nbsp;없더라도&amp;nbsp;컨트롤러로&amp;nbsp;이동하는&amp;nbsp;TransformsFollowMe라는&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;3. 캐릭터 컨트롤러가 움직일 때 움직임 애니메이션을 트리거하는 기능을 추가합니다. 샘플에서는 예상되는 이동 및 점프 애니메이션과 함께 작동하도록 설계된 AnimationHooks 스크립트를 사용하여 애니메이션을 트리거합니다. 참고: 예제 스크립트는 Auto Assign From Children이 true로 설정된 경우 AnimationHooks 구성 요소가 있는 객체의 하위인 메시 애니메이터에 애니메이션 트리거를 전달합니다. 이동 애니메이션 적용의 일부로 RetargetingAnimationConstraint 구성 요소(신체 추적 포즈를 캐릭터 애니메이터에 적용)는 애니메이션 중에 적어도 부분적으로 덮어써야 합니다. 그렇지 않으면 신체 추적이 의도한 이동 애니메이션을 재정의합니다. 이를 올바르게 수행하려면 RetargetingLayer의 Rig 하위 개체에 특수 리그 제약 조건 개체를 추가해야 합니다 :&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;1108&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEKSPI/btsKYe50hlm/VwsuGGJmHMo7oiQYzkW1gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEKSPI/btsKYe50hlm/VwsuGGJmHMo7oiQYzkW1gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEKSPI/btsKYe50hlm/VwsuGGJmHMo7oiQYzkW1gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEKSPI%2FbtsKYe50hlm%2FVwsuGGJmHMo7oiQYzkW1gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;717&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rig의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;요소로&amp;nbsp;CaptureAnimationConstraint를&amp;nbsp;추가합니다.&amp;nbsp;이를&amp;nbsp;수행하려면&amp;nbsp;프리팹의&amp;nbsp;포장을&amp;nbsp;풀어야&amp;nbsp;할&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;RigConstraint는&amp;nbsp;RetargetingConstraint에&amp;nbsp;의해&amp;nbsp;신체&amp;nbsp;추적이&amp;nbsp;적용되기&amp;nbsp;전에&amp;nbsp;애니메이션&amp;nbsp;신체&amp;nbsp;포즈(AnimationHooks에&amp;nbsp;의해&amp;nbsp;트리거됨)를&amp;nbsp;기억합니다.&lt;/li&gt;
&lt;li&gt;Rig 객체의 새로운 마지막 하위 객체에 PlaybackAnimationConstraint를 추가합니다. 이 스크립트는 RigConstraint 스택 앞의 CaptureAnimationConstraint에 의해 저장된 신체 포즈를 부분적으로 다시 적용합니다. 이러한 애니메이션을 다리에 적용하려면 하체를 표시하는 AvatarMask를 제공합니다(Meta Movement 패키지의 &quot;LowerBodyMask&quot; 참조). 이 신체 포즈 애플리케이션의 강도는 PlaybackAnimationConstraint의 Weight 속성에 의해 제어됩니다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;가중치를 0으로 설정하면 이동 애니메이션이 완전히 숨겨지고 신체 추적이 애니메이터에 적용된 채로 유지됩니다. 가중치를 1로 설정하면 마스크된 영역에 이동 애니메이션이 적용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/49gM8/btsKX4JksAz/cC8NRyjqAKjMHROND6TqY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/49gM8/btsKX4JksAz/cC8NRyjqAKjMHROND6TqY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/49gM8/btsKX4JksAz/cC8NRyjqAKjMHROND6TqY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F49gM8%2FbtsKX4JksAz%2FcC8NRyjqAKjMHROND6TqY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;248&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PlaybackAnimationConstraint의&amp;nbsp;가중치&amp;nbsp;속성에&amp;nbsp;대한&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;자동으로&amp;nbsp;트리거하는&amp;nbsp;작업은&amp;nbsp;진행률&amp;nbsp;값을&amp;nbsp;가중치&amp;nbsp;속성에&amp;nbsp;제공하는&amp;nbsp;StateTransition&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;사용하여&amp;nbsp;스크립트에서&amp;nbsp;수행됩니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wpkSS/btsKV3yhoGC/0fKnKo8RhYE358GGkFZW61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wpkSS/btsKV3yhoGC/0fKnKo8RhYE358GGkFZW61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wpkSS/btsKV3yhoGC/0fKnKo8RhYE358GGkFZW61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwpkSS%2FbtsKV3yhoGC%2F0fKnKo8RhYE358GGkFZW61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;547&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;전환은&amp;nbsp;PlayerController&amp;nbsp;개체에&amp;nbsp;있는&amp;nbsp;MovementSDKLocomotion의&amp;nbsp;OnStartMove&amp;nbsp;및&amp;nbsp;OnStopMove&amp;nbsp;콜백에&amp;nbsp;의해&amp;nbsp;스크립트에서&amp;nbsp;트리거됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9W5aQ/btsKVJGL65O/GQ1iXHgK0eFFkLhPSD8kC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9W5aQ/btsKVJGL65O/GQ1iXHgK0eFFkLhPSD8kC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9W5aQ/btsKVJGL65O/GQ1iXHgK0eFFkLhPSD8kC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9W5aQ%2FbtsKVJGL65O%2FGQ1iXHgK0eFFkLhPSD8kC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;155&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;155&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;781&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqgEU0/btsKYEXGMtH/Kf7JkELwuoT7nBPvwCHTk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqgEU0/btsKYEXGMtH/Kf7JkELwuoT7nBPvwCHTk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqgEU0/btsKYEXGMtH/Kf7JkELwuoT7nBPvwCHTk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqgEU0%2FbtsKYEXGMtH%2FKf7JkELwuoT7nBPvwCHTk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;152&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&amp;nbsp;그리고&amp;nbsp;PlayerController의&amp;nbsp;Jump&amp;nbsp;객체에서&amp;nbsp;JumpingRigidbody의&amp;nbsp;OnJump&amp;nbsp;및&amp;nbsp;OnJumpFinished&amp;nbsp;콜백을&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;776&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b43DG6/btsKXjf0DRY/HqAHVnlUOdVDA7DNHaXpKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b43DG6/btsKXjf0DRY/HqAHVnlUOdVDA7DNHaXpKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b43DG6/btsKXjf0DRY/HqAHVnlUOdVDA7DNHaXpKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb43DG6%2FbtsKXjf0DRY%2FHqAHVnlUOdVDA7DNHaXpKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;165&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;165&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;767&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BjYFx/btsKYqFecGC/yKBUTnctuoQr2XK6C9ZpM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BjYFx/btsKYqFecGC/yKBUTnctuoQr2XK6C9ZpM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BjYFx/btsKYqFecGC/yKBUTnctuoQr2XK6C9ZpM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBjYFx%2FbtsKYqFecGC%2FyKBUTnctuoQr2XK6C9ZpM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;155&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Locomotion&quot; 및 &quot;Jump&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;운동을 제한하고 물리 객체와 충돌하려면 Collider(또는 여러 Collider)를 추가하세요. 우리의 솔루션은 :&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신체의 대부분을 포함하는 상체 Collider,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;발을 지면 위에 유지하고 캐릭터와 지면의 충돌을 컨트롤러에 알리는 Collider
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실제&amp;nbsp;모션을&amp;nbsp;등록하고&amp;nbsp;이에&amp;nbsp;따라&amp;nbsp;플레이어&amp;nbsp;컨트롤러의&amp;nbsp;충돌체를&amp;nbsp;이동하는&amp;nbsp;스크립트를&amp;nbsp;추가합니다.&amp;nbsp;사용자는&amp;nbsp;XR&amp;nbsp;장치를&amp;nbsp;착용하면&amp;nbsp;움직일&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;앱에서&amp;nbsp;캐릭터가&amp;nbsp;움직여야&amp;nbsp;합니다.&amp;nbsp;우리의&amp;nbsp;예에는&amp;nbsp;실제&amp;nbsp;동작과&amp;nbsp;일치하도록&amp;nbsp;충돌체&amp;nbsp;위치를&amp;nbsp;업데이트하는&amp;nbsp;스크립트인&amp;nbsp;SphereColliderStaysBelowHips가&amp;nbsp;있습니다.&amp;nbsp;참고:&amp;nbsp;예제&amp;nbsp;스크립트는&amp;nbsp;FixUpdate&amp;nbsp;대신&amp;nbsp;업데이트에서&amp;nbsp;충돌체&amp;nbsp;위치를&amp;nbsp;업데이트합니다.&amp;nbsp;이는&amp;nbsp;사용자가&amp;nbsp;움직임을&amp;nbsp;거의&amp;nbsp;즉각적으로&amp;nbsp;알아차리지만(메스꺼움&amp;nbsp;방지에&amp;nbsp;더&amp;nbsp;좋음)&amp;nbsp;이러한&amp;nbsp;변경&amp;nbsp;사항이&amp;nbsp;물리&amp;nbsp;시스템과&amp;nbsp;동기화되지&amp;nbsp;않아&amp;nbsp;특수한&amp;nbsp;경우에&amp;nbsp;충돌&amp;nbsp;문제가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;의미합니다.&lt;/li&gt;
&lt;li&gt;특정&amp;nbsp;입력을&amp;nbsp;PlayerController&amp;nbsp;스크립트로&amp;nbsp;라우팅하는&amp;nbsp;스크립트를&amp;nbsp;추가합니다.&amp;nbsp;우리의&amp;nbsp;예에는&amp;nbsp;각각&amp;nbsp;OVRInput&amp;nbsp;및&amp;nbsp;UnityInput에서&amp;nbsp;입력을&amp;nbsp;읽는&amp;nbsp;OVRInputBinding&amp;nbsp;및&amp;nbsp;UnityInputBinding이라는&amp;nbsp;스크립트가&amp;nbsp;있습니다.&amp;nbsp;이러한&amp;nbsp;스크립트에는&amp;nbsp;MovementSDKLocomotion의&amp;nbsp;메서드&amp;nbsp;및&amp;nbsp;속성에&amp;nbsp;입력을&amp;nbsp;전달하는&amp;nbsp;UnityEvent&amp;nbsp;콜백이&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;OVRCameraRig가&amp;nbsp;움직일&amp;nbsp;때&amp;nbsp;캐릭터&amp;nbsp;컨트롤러의&amp;nbsp;위치를&amp;nbsp;​​따르는지&amp;nbsp;확인하세요.&amp;nbsp;OVRCameraRig는&amp;nbsp;사용자의&amp;nbsp;실제&amp;nbsp;'구체화'이며,&amp;nbsp;어디를&amp;nbsp;가든지&amp;nbsp;사용자가&amp;nbsp;자신이&amp;nbsp;있는&amp;nbsp;것처럼&amp;nbsp;느낄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;우리의&amp;nbsp;예제에는&amp;nbsp;OVRCameraRig가&amp;nbsp;컨트롤러의&amp;nbsp;계층&amp;nbsp;구조에&amp;nbsp;없더라도&amp;nbsp;컨트롤러를&amp;nbsp;따르도록&amp;nbsp;이동하는&amp;nbsp;TransformsFollowMe&amp;nbsp;스크립트가&amp;nbsp;있습니다.&amp;nbsp;이론적으로는&amp;nbsp;간단히&amp;nbsp;OVRCameraRig를&amp;nbsp;컨트롤러&amp;nbsp;계층에&amp;nbsp;배치하는&amp;nbsp;것이&amp;nbsp;가능해야&amp;nbsp;합니다(1단계의&amp;nbsp;컨트롤러&amp;nbsp;개체의&amp;nbsp;하위&amp;nbsp;항목).&amp;nbsp;그러나&amp;nbsp;OVRCameraRig가&amp;nbsp;루트&amp;nbsp;개체가&amp;nbsp;될&amp;nbsp;것으로&amp;nbsp;예상하는&amp;nbsp;다양한&amp;nbsp;도구&amp;nbsp;및&amp;nbsp;알고리즘에서는&amp;nbsp;해당&amp;nbsp;동작이&amp;nbsp;항상&amp;nbsp;허용되는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;또한&amp;nbsp;OVRCameraRig를&amp;nbsp;컨트롤러와&amp;nbsp;분리하면&amp;nbsp;컨트롤러가&amp;nbsp;사용자&amp;nbsp;없이도&amp;nbsp;'몸에서&amp;nbsp;분리된'&amp;nbsp;방식으로&amp;nbsp;더&amp;nbsp;쉽게&amp;nbsp;움직일&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;이동이나&amp;nbsp;튜토리얼에&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Fitness를 위한 Body Tracking 사용&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Movement SDK에는 BodyPoseAlignmentDetection이라는 컴포넌트를 사용하여 신체 자세를 기록하고 비교하는 방법을 보여주는 MovementBodyTrackingForFitness라는 샘플이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션을 마치면 개발자는 아래의 사항들을 할 줄 알아야 합니다 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 원하는 운동(예: 스쿼트)에 필요한 자세와 일치하는지 여부를 사용자가 판단할 수 있는 감지기(detector)를 구현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러분의 Scene에서의 body poses 비교&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서는 다음을 수행하는 방법을 보여줍니다 :&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Unity 에디터에서 Body Poses&lt;span&gt;&amp;nbsp;&lt;/span&gt;시각화&lt;/li&gt;
&lt;li&gt;런타임 시 Body Poses&lt;span&gt;&amp;nbsp;&lt;/span&gt;보기&lt;/li&gt;
&lt;li&gt;Unity Preview 중 Body Poses&lt;span&gt;&amp;nbsp;&lt;/span&gt;내보내기&lt;/li&gt;
&lt;li&gt;Body Poses&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;가져오기&lt;/li&gt;
&lt;li&gt;두 Body Poses가 얼마나 밀접하게 정렬되어 있는지 확인하세요.&lt;/li&gt;
&lt;li&gt;비교를&amp;nbsp;기반으로&amp;nbsp;호출할&amp;nbsp;사용자&amp;nbsp;정의&amp;nbsp;작업&amp;nbsp;설정&lt;/li&gt;
&lt;li&gt;에디터를 사용하여 Body Poses&lt;span&gt;&amp;nbsp;&lt;/span&gt;조정&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Unity 에디터에서 Body Poses 시각화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 에디터에서 새로운 GameObject를 만들고 이름을 &quot;BodyPose&quot; 로 지정한 다음, BodyPoseController 컴포넌트를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TU7EC/btsKXsRzTwX/fEfGYU8rUJw0xwqNmKbyak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TU7EC/btsKXsRzTwX/fEfGYU8rUJw0xwqNmKbyak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TU7EC/btsKXsRzTwX/fEfGYU8rUJw0xwqNmKbyak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTU7EC%2FbtsKXsRzTwX%2FfEfGYU8rUJw0xwqNmKbyak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;512&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;512&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;512&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tjc7T/btsKYJR9ckJ/flb9k1SiLxv7eCEdgwXgB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tjc7T/btsKYJR9ckJ/flb9k1SiLxv7eCEdgwXgB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tjc7T/btsKYJR9ckJ/flb9k1SiLxv7eCEdgwXgB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftjc7T%2FbtsKYJR9ckJ%2Fflb9k1SiLxv7eCEdgwXgB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;369&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. BodyPose GameObject에 BodyPoseBoneTransforms 라는 컴포넌트를 추가한다. 그 후 &quot;Refresh Transform&quot; 버튼을 누른다.&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;h3 data-ke-size=&quot;size23&quot;&gt;런타임 시 Body Poses 보기&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BodyPoseController의 BodyPose는 런타임에 표시되지 않는 Bones Pose 배열로 구성된다. BodyPoseBoneTransforms에 의해 생성된 변환도 추가 작업 없이는 표시되지 않는다 :&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;BodyPose 오브젝트에 BodyPoseBoneVisuals라는 컴포넌트를 추가한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&quot;Refresh Bone Visuals&quot; 버튼을 누르면 런타임 시 지속되는 각 Bone에 대한 Bone 시각 객체가 자동으로 생성된다. 그러면 기본 Bone Visual Prefab도 생성된다. 이제 런타임에도 볼 수 있다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bdj4g/btsKXi2xFK4/rAd4kREBOzzTsDgzcyaIk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bdj4g/btsKXi2xFK4/rAd4kREBOzzTsDgzcyaIk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bdj4g/btsKXi2xFK4/rAd4kREBOzzTsDgzcyaIk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBdj4g%2FbtsKXi2xFK4%2FrAd4kREBOzzTsDgzcyaIk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;150&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;img src=&quot;https://blog.kakaocdn.net/dn/rUjBO/btsKW8MA2c2/bOzi7LbWEQPoF3DHy2VR2k/img.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 Bone Visual Prefab을 다른 것으로 변경하고 Skeleton을 새로 고칠 수 있습니다. 예를 들어,&amp;nbsp; Bone Visual Prefab의 참조를 &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;/&lt;/span&gt;Packages/Meta\ Movement/Samples/Prefabs/BodyTrackingForFitness/에 있는 프리팹으로 변경한 다음 &quot;Clear Bone Visuals&quot; 버튼과 &quot;Refresh Bone Visual&quot; 버튼을 차례로 눌러 Skeleton을 새로 고칩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Unity Editor를 사용하여 Skeleton Pose를 편집할 때 Bone을 표시하기 위해 생성된 Bone Visual Prefab의 복제본이 아니라 Bone 변환의 변환을 변경하고 있는지 확인하세요!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Unity Preview 중 Body Poses&amp;nbsp; 내보내기&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;BodyPose&quot; 오브젝트에 OVRBodyPose 컴포넌트를 추가합니다. 이 컴포넌트는 헤드셋에서 Body Tracking Data를 읽고 이를 BodyPoseController로 변환합니다. OVRBodyPose는 기본적으로 전신으로 설정되어 있지만 상체만 (다리 없음) 으로 설정할 수도 있습니다.&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;492&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baTQdp/btsKWjOEp1P/E69Zn9iJ3d9tE0irHpI6c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baTQdp/btsKWjOEp1P/E69Zn9iJ3d9tE0irHpI6c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baTQdp/btsKWjOEp1P/E69Zn9iJ3d9tE0irHpI6c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaTQdp%2FbtsKWjOEp1P%2FE69Zn9iJ3d9tE0irHpI6c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;145&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Quest 장치마다 신체 추적 데이터를 다르게 읽을 수 있습니다. 예를 들어, Quest3에서는 Quest2에서는 사용할 수 없는 기능인 IOBT(Inside Out Body Tracking)를 통해 전신 추적 데이터를 자동으로 강화할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. BodyPoseController 컴포넌트의 Source Data Object 필드에 OVRBodyPose를 드래그하여 넣으세요.&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;512&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjJdK/btsKYqZRf9C/fiSxFAWje50XlVI7p5DcNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjJdK/btsKYqZRf9C/fiSxFAWje50XlVI7p5DcNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjJdK/btsKYqZRf9C/fiSxFAWje50XlVI7p5DcNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjJdK%2FbtsKYqZRf9C%2FfiSxFAWje50XlVI7p5DcNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;136&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 런타임 시 또는 Link를 사용하여 Unity Preview를 하는 중에 Bone Pose를 구동하는 Body Tracking이 가능합니다.&amp;nbsp; BodyPoseController 컴포넌트의 &quot;Export Asset&quot; 버튼은 Unity의 Preview mode 중에 동작이 가능합니다. 이는 OVRBodyPose에서 읽은 실제 신체 추적 데이터에서 Body Pose를 내보낼 수 있음을 의미합니다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;BodyPose&quot; 오브젝트를 선택한 다음 헤드셋이 연결되고 Link에 연결된 상태에서 재생 버튼을 눌러 Unity Preview를 시작합니다. BodyPoseController의 &quot;Export Asset&quot; 버튼을 사용하여 현재 Bone Pose를 내보낸다. 내보낸 데이터는 /Assets/BodyPoses/ 폴더의 타임스탬프와 같이 asset 파일의 형태로 저장된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JsK8u/btsKYfc3fae/UoKtvXDfSWLvTYQGo23HS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JsK8u/btsKYfc3fae/UoKtvXDfSWLvTYQGo23HS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JsK8u/btsKYfc3fae/UoKtvXDfSWLvTYQGo23HS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJsK8u%2FbtsKYfc3fae%2FUoKtvXDfSWLvTYQGo23HS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;183&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고 : &quot;Export Asset&quot; 은 런타임시 APK에서 액세스할 수 없는 Unity Editor 기능입니다. APK 런타임이 아닌 Unity Preview 중에 BodyPose를 내보낼 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Body Pose 에셋의 기본 타임스탬프 이름을 포즈를 설명하는 이름으로 변경하는 것이 좋습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Link를 통해 Body Tracking이 작동하려면 Meta Quest Link 앱에서 개발자 런타임 기능을 활성화 해야 합니다. 이는 설정 -&amp;gt; 베타 -&amp;gt; 개발자 런타임 기능을 통해 확인할 수 있습니다. Link를 통해 다른 Quest 기능이 제대로 작동하려면 해당 사용자 인터페이스의 추가 토글이 필요할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0RXjx/btsKYi8Hvyf/YtoSivJ9kwacv9mBbBrQ20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0RXjx/btsKYi8Hvyf/YtoSivJ9kwacv9mBbBrQ20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0RXjx/btsKYi8Hvyf/YtoSivJ9kwacv9mBbBrQ20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0RXjx%2FbtsKYi8Hvyf%2FYtoSivJ9kwacv9mBbBrQ20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;189&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Body Poses 가져오기&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Unity Editor에서(preview 중이 아닌 동안), 생성된 Body Pose 에셋 파일을 BodyPoseController의 Source Data Object 필드로 드래그 합니다. &quot;Refresh T- Pose&quot; 를 클릭한 다음 &quot;Refresh Source Data&quot; 를 클릭하여 두 포즈 간의 Skeleton Swap을 확인하세요&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vKp96/btsKXA3cdPk/qj2spthl8to4AfhbpHUc41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vKp96/btsKXA3cdPk/qj2spthl8to4AfhbpHUc41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vKp96/btsKXA3cdPk/qj2spthl8to4AfhbpHUc41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvKp96%2FbtsKXA3cdPk%2Fqj2spthl8to4AfhbpHUc41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;362&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Source Data Object 필드는 IBodyPose 오브젝트로 채워질 수 있습니다. 즉, BodyPoseController는 다른 BodyPoseController(포즈 복제), BoduPoseBoneTransforms(권장되지 않음), 또는 OVRBodyPose의 데이터를 참조할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두&amp;nbsp;Body&amp;nbsp;Poses가&amp;nbsp;얼마나&amp;nbsp;밀접하게&amp;nbsp;정렬되어&amp;nbsp;있는지&amp;nbsp;확인하세요.&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;BodyPose&quot;에 BodyPoseAlignmentDetector 컴포넌트를 추가하세요,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Pose A 필드의 경우, 생성된 Body Pose 파일을 /Assets/BodyPoses/ 폴더에서 끌어서 넣습니다. Pose B 필드의 경우 이 오브젝트 자체를 끌어다 놓고 명확서 팝업에서 BodyPoseController 컴포넌트를 선택합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&quot;Bone Visuals To Color&quot; 안에 BodyPose 오브젝트를 드래그 앤 드롭합니다. 그러면 Bone Pose가 얼마나 일치하는지에 따라 Skeleton Visuals가 다시 칠해지게 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIyjIY/btsKW7NPpSZ/KetA4ltWZ1jp9ChNpajluK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIyjIY/btsKW7NPpSZ/KetA4ltWZ1jp9ChNpajluK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIyjIY/btsKW7NPpSZ/KetA4ltWZ1jp9ChNpajluK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIyjIY%2FbtsKW7NPpSZ%2FKetA4ltWZ1jp9ChNpajluK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;295&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;BodyTrackingForFitness&amp;nbsp;&lt;/b&gt;씬은 BodyPoseAlignment Detector를 사용하여 운동 자세를 계산하는 앱 컨셉입니다. 예를 들어 이 앱을 사용하여 사용자가 스쿼트 자세를 취하고 있는지 여부를 감지할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비교를&amp;nbsp;기반으로&amp;nbsp;호출할&amp;nbsp;사용자&amp;nbsp;정의&amp;nbsp;작업&amp;nbsp;설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. BodyPose Alignment Detector 는 다양한 목적으로 확장할 수 있는 유연한 인터페이스를 제공합니다. Pose Events 콜백에는 &quot;Pose A&quot; 가 &quot;Pose B&quot; 와 얼마나 잘 정렬되는지에 따라 사용자 정의 작업을 자동으로 트리거 할 수 있습니다. 이러한 액션은 &lt;a href=&quot;https://docs.unity3d.com/ScriptReference/Events.UnityEvent.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Unity Event&lt;/a&gt;와 같은 로직이나 효과를 트리거 할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OnComliance 는 모든 뼈대 포즈가 comply 될 때마다 한 번씩 트리거 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;OnDeficiency 는 하나 이상의 Bone이 더 이상 comply 되지 않을 때마다 한 번씩 트리거 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;OnCompliantBoneCount 는 complying 하는 Bone의 수가 변경될 때마다 트리거 됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;alignment(정렬) 또는 compliance(준수)는 Alignment Wiggle Room &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;configuration entries&lt;/span&gt; 에 의해 정의됩니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Maximum Angle Delta 필드는 두 뼈가 호환되는 것으로 간주 되기 위해 얼마나 밀접하게 정렬되어야 하는지를 결정합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Width 필드는 compliant(준수)와 deficient(결함) 사이의 여백을 결정합니다. 예를 들어 Left Arm Upper가 30도, Width 4도 정렬되어 있어야 하는 경우, Left Upper Arm이 28도 이내로 정렬되면 Complince가 트리거 되고 32도를 초과하면 Compliance에서 벗어납니다. 이러한 중첩은 flickering Compliance를 방지합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4SSY/btsKYxdvkvG/Cx1cTcylvYoMbag6MFJ6hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4SSY/btsKYxdvkvG/Cx1cTcylvYoMbag6MFJ6hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4SSY/btsKYxdvkvG/Cx1cTcylvYoMbag6MFJ6hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4SSY%2FbtsKYxdvkvG%2FCx1cTcylvYoMbag6MFJ6hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;106&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Compliance 각도들은 다음 두 가지 방법 중 하나로 측정할 수 있습니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VhsCA/btsKWUHP3F1/ZFULG8KFWycMh6dWoxo41k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VhsCA/btsKWUHP3F1/ZFULG8KFWycMh6dWoxo41k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VhsCA/btsKWUHP3F1/ZFULG8KFWycMh6dWoxo41k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVhsCA%2FbtsKWUHP3F1%2FZFULG8KFWycMh6dWoxo41k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;80&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Joint Rotation : 뼈의 roll을 포함한 로컬 회전을 비교합니다. 이 정렬 감지는 수학적으로 매우 간단하지만 뼈가 완벽하게 각도를 이루는 것 외에도 완벽하게 굴려야 한다는 단점이 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Bone Direction : 특정 뼈의 관점에서 뼈의 방향을 비교합니다. 이 방법은 뼈대 롤을 무시하므로 방향 결정자(arbiter)로 특정 뼈대를 선택해야 합니다. 각도를 비교하는 이 방법은 특정 피트니스 애플리케이션 사용 사례를 테스트하는 동안 더 나은 느낌을 주었지만 테스트하려면 약간 더 많은 처리가 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIPeLT/btsKWhXDJ2B/7r3k9aakpa7EXjDVZFeFn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIPeLT/btsKWhXDJ2B/7r3k9aakpa7EXjDVZFeFn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIPeLT/btsKWhXDJ2B/7r3k9aakpa7EXjDVZFeFn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIPeLT%2FbtsKWhXDJ2B%2F7r3k9aakpa7EXjDVZFeFn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;80&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;에디터를&amp;nbsp;사용하여&amp;nbsp;Body&amp;nbsp;Poses&amp;nbsp;조정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BodyPoseController의 Bone Poses Array에서 위치/회전을 변경하면 Skeleton이 변경됩니다. 이 리스트의 개별 값을 수정하는 것은 가능하지만 Body Pose를 만드는 데 권장되는 방법은 아닙니다! BodyPoseBoneTransforms로 생성된 변환을 수정하거나 Preview 모드에서 Quest의 신체 추적 데이터를 읽은 다음 &quot;Export Asset&quot; 을 눌러 새로운 포즈를 만듭니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2QfU/btsKWRxDScS/QZR89uxikFNNNBRByWZsRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2QfU/btsKWRxDScS/QZR89uxikFNNNBRByWZsRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2QfU/btsKWRxDScS/QZR89uxikFNNNBRByWZsRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2QfU%2FbtsKWRxDScS%2FQZR89uxikFNNNBRByWZsRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;214&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;몸체 추적 Bone 위치와 방향 (및 길이)은 런타임에 결정됩니다. 하지만 T-Pose 데이터의 static 복사본은 FullBodySkeletonTPose.cs에 저장되고 Editor의 BodyPoseController에 적용됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Editor를 사용하여 특정 Bone Pose를 변경하는 권장 방법은 BodyPoseBoneTransforms -&amp;gt; BoneTransforms로 이동하여 리스트를 확장하고 원하는 Bone을 클릭하는 것입니다. 오브젝트를 클릭하면 해당 오브젝트가 Hierachy에 표시됩니다. Hierachy에서 Transform을 클릭하여 선택한 다음 Transform의 Rotation을 변경합니다. BodyPoseController -&amp;gt; Bone Pose에서 Bone Pose Data를 변경하므로 Bone의 파란색 선이 변경됩니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIpkiG/btsKYzWGGnQ/Gw3SVskE1LDt8Kkjptz7wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIpkiG/btsKYzWGGnQ/Gw3SVskE1LDt8Kkjptz7wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIpkiG/btsKYzWGGnQ/Gw3SVskE1LDt8Kkjptz7wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIpkiG%2FbtsKYzWGGnQ%2FGw3SVskE1LDt8Kkjptz7wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;242&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Bone Visuals To Color가 올바르게 설정된 경우 BodyPoseAlignmentDetector는 Editor 시간 동안 BodyPose를 변경하는 동안 Bone 색상을 조정해야 합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Calibration API (보정 API)&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;학습 목적&lt;/i&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 섹션을 완료한 이후 개발자는 아래의 사항들을 할 줄 알아야 한다. :&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;calibration API가 언제 유용한 지 이해한다.&lt;/li&gt;
&lt;li&gt;명시적인 높이로 자동 감지된 높이를 재정의 하는 calibration(보정) API를 적용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;섹션에서는&amp;nbsp;보정&amp;nbsp;API를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;시기와&amp;nbsp;이를&amp;nbsp;사용하여&amp;nbsp;앱별&amp;nbsp;보정에서&amp;nbsp;자동&amp;nbsp;감지된&amp;nbsp;높이를&amp;nbsp;재정의하는&amp;nbsp;방법을&amp;nbsp;자세히&amp;nbsp;설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 보정은 시스템이 헤드셋을 착용한 사람의 키를 결정하려고 시도하는 프로세스입니다. 높이는 사용자가 서 있는지, 쪼그리고 앉아 있는지, 앉아 있는지 감지할 수 있도록 하는 데 필요합니다. 자동 보정 루틴은 서비스가 생성된 후 처음 10초 이내에 실행되므로 서비스를 요청할 때 초기 상태가 중요합니다. 이상적으로 애플리케이션은 서비스가 시작될 때 사용자가 서 있는지 확인해야 합니다. 환자가 앉은 자세라면 팔을 쭉 뻗고 팔을 완전히 뻗은 상태에서 직경 약 0.3m(1피트)의 원을 그릴 수도 있습니다. 이 경우 날개폭으로 높이를 추정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나&amp;nbsp;자동&amp;nbsp;보정이&amp;nbsp;충분히&amp;nbsp;작동하지&amp;nbsp;않는&amp;nbsp;경우도&amp;nbsp;있습니다(예:&amp;nbsp;사람이&amp;nbsp;계속&amp;nbsp;앉아&amp;nbsp;있고&amp;nbsp;팔을&amp;nbsp;뻗지&amp;nbsp;않는&amp;nbsp;경우).&amp;nbsp;앱이&amp;nbsp;사람의&amp;nbsp;키를&amp;nbsp;결정하기&amp;nbsp;위해&amp;nbsp;이미&amp;nbsp;초기화&amp;nbsp;프로세스를&amp;nbsp;거쳤고&amp;nbsp;이를&amp;nbsp;사용하려는&amp;nbsp;다른&amp;nbsp;상황도&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;두&amp;nbsp;사용&amp;nbsp;사례&amp;nbsp;모두에&amp;nbsp;대해&amp;nbsp;자동&amp;nbsp;보정을&amp;nbsp;재정의하는&amp;nbsp;데&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;SuggestBodyTrackingCalibrationOverride()&amp;nbsp;및&amp;nbsp;ResetBodyTrackingCalibration&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;OVRBody.cs를&amp;nbsp;사용하면&amp;nbsp;높이가&amp;nbsp;미터&amp;nbsp;단위로&amp;nbsp;지정되는&amp;nbsp;SuggestBodyTrackingCalibrationOverride(float&amp;nbsp;height)를&amp;nbsp;통해&amp;nbsp;사용자&amp;nbsp;높이를&amp;nbsp;재정의할&amp;nbsp;수&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 id=&quot;Troubleshooting&quot; data-ke-size=&quot;size26&quot;&gt;Troubleshooting Body Tracking (Body Tracking 문제 해결)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이&amp;nbsp;섹션에서는&amp;nbsp;신체&amp;nbsp;추적과&amp;nbsp;관련된&amp;nbsp;일반적인&amp;nbsp;문제를&amp;nbsp;해결하는&amp;nbsp;방법을&amp;nbsp;자세히&amp;nbsp;설명합니다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 섹션을 완료한 후에는 다음 사항을 이해해야 합니다:&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인&amp;nbsp;프로젝트&amp;nbsp;관련&amp;nbsp;오류를&amp;nbsp;확인하는&amp;nbsp;방법&lt;/li&gt;
&lt;li&gt;Tracking 서비스가 실행 중인지 확인하는 방법&lt;/li&gt;
&lt;li&gt;가장&amp;nbsp;흔한&amp;nbsp;증상과&amp;nbsp;원인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제해결을 시작하기 위해 Edit &amp;gt; Project Settings &amp;gt; Meta XR 아래의 경고를 살펴보고 거기에서 발견된 문제를 해결하세요. 더 많은 정보를 확인하려면 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-troubleshooting/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Troubleshooting Movement SDK&lt;/a&gt;를 확인하세요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 :&amp;nbsp;&amp;nbsp;&lt;/b&gt;링크를 설정하려면 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-link/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&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;adb logcat -s Unity 명령어를 사용하여 많은 문제를 디버깅할 수 있습니다. 그렇지 않은 경우 아래 강조된 해결 방법을 사용하세요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;See which Body Tracking services are active (어떤&amp;nbsp;신체&amp;nbsp;추적&amp;nbsp;서비스가&amp;nbsp;활성화되어&amp;nbsp;있는지&amp;nbsp;확인하세요)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;개발 중에 신체 추적이 작동하지 않는 것처럼 보이는 문제가 발생할 수 있습니다. 이는 신체 추적에 대한 권한이 활성화되지 않은 것을 포함하여 여러 가지 문제로 인해 발생할 수 있습니다. 그러나 모든 권한이 설정되었다고 생각하고 서비스를 시작하려고 시도했지만 여전히 작동하지 않는 경우 ADB를 사용하여 다음 명령을 사용하여 어떤 서비스가 활성화되어 있는지 확인할 수 있습니다 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732676105864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb shell dumpsys activity service com.oculus.bodyapiservice.BodyAPIService&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;신체 추적이 전혀 활성화되지 않은 경우 이 명령은 다음을 반환합니다 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&amp;ldquo;No services match: com.oculus.bodyapiservice.BodyAPIService&amp;rdquo;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;신체 추적 서비스가 활성화된 경우 다음과 같은 출력이 표시됩니다 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732676155400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SERVICE com.oculus.bodyapiservice/.BodyApiService 98564e0 pid=17192 user=0
Client:
Begin_BodyApiService
{
&quot;fbs&quot; : true,
&quot;iobt&quot; : false,
&quot;num_updates_counter&quot; : 26693,
&quot;usingEngineV1&quot; : false
}
End_BodyApiService&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fbs 줄은 Generative Legs가 활성화되었는지 여부를 나타냅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;IOBT 줄은 IOBT가 활성 상태인지 여부를 표시합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성 상태란 현재 최소 한 명의 캐릭터가 서비스를 이용하고 있다는 의미입니다. 현재 적절한 신체 추적 서비스를 사용하여 실행 중인 캐릭터가 없으면 boolean은 false를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IOBT는&amp;nbsp;제안된&amp;nbsp;충실도&amp;nbsp;모드이며&amp;nbsp;API의&amp;nbsp;요구&amp;nbsp;사항은&amp;nbsp;아닙니다.&amp;nbsp;이&amp;nbsp;시스템은&amp;nbsp;전체&amp;nbsp;시스템의&amp;nbsp;성능을&amp;nbsp;관리하기&amp;nbsp;위해&amp;nbsp;구현됩니다.&amp;nbsp;따라서&amp;nbsp;개발자는&amp;nbsp;IOBT가&amp;nbsp;요청된&amp;nbsp;다른&amp;nbsp;서비스와&amp;nbsp;함께&amp;nbsp;지원되는지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;IOBT가&amp;nbsp;다른&amp;nbsp;기능과&amp;nbsp;함께&amp;nbsp;실행되는&amp;nbsp;모드를&amp;nbsp;테스트하는&amp;nbsp;것이&amp;nbsp;좋습니다.&amp;nbsp;특히&amp;nbsp;시스템&amp;nbsp;활용도가&amp;nbsp;높은&amp;nbsp;후에(예:&amp;nbsp;패스스루&amp;nbsp;및&amp;nbsp;FMM(Fast&amp;nbsp;Motion&amp;nbsp;Mode)&amp;nbsp;또는&amp;nbsp;컨트롤러가&amp;nbsp;활성화되거나&amp;nbsp;시스템이&amp;nbsp;일반적으로&amp;nbsp;높은&amp;nbsp;CPU&amp;nbsp;부하를&amp;nbsp;받는&amp;nbsp;경우)&amp;nbsp;신체&amp;nbsp;추적을&amp;nbsp;위해&amp;nbsp;IOBT를&amp;nbsp;활성화하라는&amp;nbsp;호출이&amp;nbsp;이루어진&amp;nbsp;경우&amp;nbsp;신체&amp;nbsp;추적이&amp;nbsp;활성화됩니다.&amp;nbsp;낮은&amp;nbsp;충실도&amp;nbsp;모드(IOBT&amp;nbsp;없음).&amp;nbsp;사용자는&amp;nbsp;동일한&amp;nbsp;골격&amp;nbsp;출력을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;IOBT에서&amp;nbsp;제공하는&amp;nbsp;특정&amp;nbsp;추적&amp;nbsp;기능(예:&amp;nbsp;팔꿈치&amp;nbsp;추적,&amp;nbsp;기울어진&amp;nbsp;자세에서&amp;nbsp;올바른&amp;nbsp;척추&amp;nbsp;위치)을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;없습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Body Tracking works with controllers, but not with hands when running on the Quest device (not PC)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Body Tracking이 컨트롤러와 함께 작동하지만 Quest 장치 (PC 아님)에서 실행할 때 손으로는 작동하지 않는다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Settings &amp;gt; Movement Tracking &amp;gt; Hand Tracking&lt;/b&gt; 에서 장치에 손 추적 권한이 활성화되어 있는지 확인&amp;nbsp;&lt;/li&gt;
&lt;li&gt;프로젝트 구성에서 핸드 트래킹 및 컨트롤러가 활성화 되어 있는지 확인&amp;nbsp;&lt;/li&gt;
&lt;li&gt;앱이 시작 시 손 추적을 요청하는지 확인하세요.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Body Tracking works when running directly on the HMD, but fails to run over Link&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신체 추적이 HMD에서 직접 실행할 때 작동하지만 링크를 통해 실행되지 않습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터를 지원하는 USB 케이블로 연결되어 있는지 확인하세요. 이는 PC의 Oculus 앱의&amp;nbsp;&lt;b&gt;Device Settings : Link Cable &amp;gt; Connect Your Headset &amp;gt; Continue&amp;nbsp;&lt;/b&gt;에서 테스트 할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Settings&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Beta&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Developer Runtime Features&lt;span style=&quot;color: #1c2b33;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #1c2b33;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;으로 이동하여 PC의 Oculus 앱에서 개발자 런타임 기능(Developer Runtime features) 이 활성화되어 있는지 확인하세요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1c2b33;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;좀 더 많은 정보를 확인하려면 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-troubleshooting/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Troubleshooting Movement SDK&lt;/a&gt;를 확인하세요. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Body looks collapsed on the floor (몸이 바닥에 쓰러진 모습으로 보인다)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;신체&amp;nbsp;추적이&amp;nbsp;작동하지&amp;nbsp;않습니다.&amp;nbsp;컨트롤러를&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;컨트롤러(또는&amp;nbsp;손&amp;nbsp;추적을&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;손)가&amp;nbsp;추적되고&amp;nbsp;있는지&amp;nbsp;확인합니다.&amp;nbsp;게임&amp;nbsp;컨텍스트&amp;nbsp;외부에서&amp;nbsp;이&amp;nbsp;작업을&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&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 style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;또한 디버그 명령인&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732676996063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb shell dumpsys activity service com.oculus.bodyapiservice.BodyAPIService&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용하여 Body Tracking이 실행 중인지 확인합니다.&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;헤드셋을 제거하고 나중에 착용할 때 신체 추적 오류가 발생하는 경우, HMDRemountRestartTracking을 사용하여 헤드셋을 착용한 후 신체 추적을 다시 시작할 수 있습니다. 이 스크립트는 프로젝트의 OVRRuntimeSettings Joint Set와 fidelity setting을 제거하고 착용한 후 다시 활성화 합니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;Body&amp;nbsp;is&amp;nbsp;in&amp;nbsp;a&amp;nbsp;motorcycle&amp;nbsp;pose&amp;nbsp;with&amp;nbsp;the&amp;nbsp;upper&amp;nbsp;body&amp;nbsp;correct,&amp;nbsp;but&amp;nbsp;knees&amp;nbsp;bent&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몸은&amp;nbsp;오토바이&amp;nbsp;자세를&amp;nbsp;취하며&amp;nbsp;상체는&amp;nbsp;올바르지만&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;있는&amp;nbsp;캐릭터에&amp;nbsp;IOBT를&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;두&amp;nbsp;뼈&amp;nbsp;IK를&amp;nbsp;사용하여&amp;nbsp;다리를&amp;nbsp;쭉&amp;nbsp;뻗을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;Movement&amp;nbsp;패키지의&amp;nbsp;Samples/Prefabs/Retargeting/ArmatureSkinningUpdateGreen에서&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;예를&amp;nbsp;볼&amp;nbsp;수&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 id=&quot;A&quot; data-ke-size=&quot;size26&quot;&gt;부록 A : Open XR changes (변경점)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는&amp;nbsp;뼈대&amp;nbsp;이름이나&amp;nbsp;블렌드&amp;nbsp;셰이프&amp;nbsp;및&amp;nbsp;대상&amp;nbsp;변경된&amp;nbsp;캐릭터&amp;nbsp;간의&amp;nbsp;불일치와&amp;nbsp;같은&amp;nbsp;문제를&amp;nbsp;디버깅하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;만큼&amp;nbsp;명명&amp;nbsp;규칙&amp;nbsp;및&amp;nbsp;Open&amp;nbsp;XR&amp;nbsp;호출을&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;섹션의&amp;nbsp;정보는&amp;nbsp;독자에게&amp;nbsp;컨텍스트를&amp;nbsp;제공하기&amp;nbsp;위한&amp;nbsp;OpenXR&amp;nbsp;인터페이스의&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;반영합니다.&amp;nbsp;하지만&amp;nbsp;Unity에서&amp;nbsp;이를&amp;nbsp;사용하는&amp;nbsp;경우에는&amp;nbsp;이러한&amp;nbsp;API를&amp;nbsp;직접&amp;nbsp;다루지&amp;nbsp;않으며&amp;nbsp;다음&amp;nbsp;섹션으로&amp;nbsp;건너뛸&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;API&amp;nbsp;관련&amp;nbsp;내용은&amp;nbsp;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/native/android/move-body-tracking/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Movement&amp;nbsp;SDK&amp;nbsp;OpenXR&amp;nbsp;설명서&lt;/a&gt;를 참조하세요. 높은 수준에서 기존 OpenXR 신체 추적 확장은 다음 네 가지 기능을 노출합니다 :&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;xrCreateBodyTrackerFB - 바디 트래커를 생성한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;xrGetBodySkeletonFB - 참조&amp;nbsp;T자형&amp;nbsp;포즈의&amp;nbsp;관절&amp;nbsp;세트를&amp;nbsp;가져옵니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;xrLocateBodyJointsFB - 관절의 현재 위치를 가져옵니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;xrDestroyBodyTrackerFB - 트래커를 없앤다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Generative Legs&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 신체 추적 전신 확장은 이러한 기능을 재사용하지만 새로운 관절 세트로 추적기를 생성하기 위한 지원을 추가합니다. 특히 XrBodyJointSetFB enum은 새로운 값 XR_BODY_JOINT_SET_FULL_BODY_META로 확장되어 사용자가 전체 하체에 대한 조인트(관절)(즉, 현재 상체와 새 하체 조인트)를 원하는 대로 지정할 수 있습니다.&lt;/p&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_1732677517335&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;XrBodyTrackerCreateInfoFB
createInfo{XR_TYPE_BODY_TRACKER_CREATE_INFO_FB};
createInfo.bodyJointSet = XR_BODY_JOINT_SET_FULL_BODY_META;
XrBodyTrackerFB bodyTracker;
xrCreateBodyTrackerFB(session, &amp;amp;createInfo, &amp;amp;bodyTracker));&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;관절 위치 찾기(또는 관절의 기본 위치 찾기)는 기존의 Body Tracking Extension과 동일합니다. 관절 세트는 동일한 70개의 상체 관절과 추가 14개의 하체 관절을 포함하는 enum XrFullBodyJointMETA에 해당합니다. FullBodyJoint enum은 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732677572503&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef enum XrFullBodyJointMETA{
XR_FULL_BODY_JOINT_ROOT_META = 0,
XR_FULL_BODY_JOINT_HIPS_META = 1,
XR_FULL_BODY_JOINT_SPINE_LOWER_META = 2,
XR_FULL_BODY_JOINT_SPINE_MIDDLE_META = 3,
XR_FULL_BODY_JOINT_SPINE_UPPER_META = 4,
XR_FULL_BODY_JOINT_CHEST_META = 5,
XR_FULL_BODY_JOINT_NECK_META = 6,
XR_FULL_BODY_JOINT_HEAD_META = 7,
XR_FULL_BODY_JOINT_LEFT_SHOULDER_META = 8,
XR_FULL_BODY_JOINT_LEFT_SCAPULA_META = 9,
XR_FULL_BODY_JOINT_LEFT_ARM_UPPER_META = 10,
XR_FULL_BODY_JOINT_LEFT_ARM_LOWER_META = 11,
XR_FULL_BODY_JOINT_LEFT_HAND_WRIST_TWIST_META = 12,
XR_FULL_BODY_JOINT_RIGHT_SHOULDER_META = 13,
XR_FULL_BODY_JOINT_RIGHT_SCAPULA_META = 14,
XR_FULL_BODY_JOINT_RIGHT_ARM_UPPER_META = 15,
XR_FULL_BODY_JOINT_RIGHT_ARM_LOWER_META = 16,
XR_FULL_BODY_JOINT_RIGHT_HAND_WRIST_TWIST_META = 17,
XR_FULL_BODY_JOINT_LEFT_HAND_PALM_META = 18,
XR_FULL_BODY_JOINT_LEFT_HAND_WRIST_META = 19,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_METACARPAL_META = 20,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_PROXIMAL_META = 21,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_DISTAL_META = 22,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_TIP_META = 23,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_METACARPAL_META = 24,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_PROXIMAL_META = 25,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_INTERMEDIATE_META = 26,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_DISTAL_META = 27,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_TIP_META = 28,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_METACARPAL_META = 29,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_PROXIMAL_META = 30,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_INTERMEDIATE_META = 31,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_DISTAL_META = 32,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_TIP_META = 33,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_METACARPAL_META = 34,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_PROXIMAL_META = 35,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_INTERMEDIATE_META = 36,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_DISTAL_META = 37,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_TIP_META = 38,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_METACARPAL_META = 39,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_PROXIMAL_META = 40,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_INTERMEDIATE_META = 41,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_DISTAL_META = 42,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_TIP_META = 43,
XR_FULL_BODY_JOINT_RIGHT_HAND_PALM_META = 44,
XR_FULL_BODY_JOINT_RIGHT_HAND_WRIST_META = 45,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_METACARPAL_META = 46,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_PROXIMAL_META = 47,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_DISTAL_META = 48,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_TIP_META = 49,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_METACARPAL_META = 50,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_PROXIMAL_META = 51,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_INTERMEDIATE_META = 52,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_DISTAL_META = 53,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_TIP_META = 54,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_METACARPAL_META = 55,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_PROXIMAL_META = 56,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_INTERMEDIATE_META = 57,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_DISTAL_META = 58,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_TIP_META = 59,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_METACARPAL_META = 60,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_PROXIMAL_META = 61,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_INTERMEDIATE_META = 62,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_DISTAL_META = 63,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_TIP_META = 64,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_METACARPAL_META = 65,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_PROXIMAL_META = 66,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_INTERMEDIATE_META = 67,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_DISTAL_META = 68,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_TIP_META = 69,




// Lower body joints:
XR_FULL_BODY_JOINT_LEFT_UPPER_LEG_META = 70,
XR_FULL_BODY_JOINT_LEFT_LOWER_LEG_META = 71,
XR_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_TWIST_META = 72,
XR_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_META = 73,
XR_FULL_BODY_JOINT_LEFT_FOOT_SUBTALAR_META = 74,
XR_FULL_BODY_JOINT_LEFT_FOOT_TRANSVERSE_META = 75,
XR_FULL_BODY_JOINT_LEFT_FOOT_BALL_META = 76,




XR_FULL_BODY_JOINT_RIGHT_UPPER_LEG_META = 77,
XR_FULL_BODY_JOINT_RIGHT_LOWER_LEG_META = 78,
XR_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_TWIST_META = 79,
XR_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_META = 80,
XR_FULL_BODY_JOINT_RIGHT_FOOT_SUBTALAR_META = 81,
XR_FULL_BODY_JOINT_RIGHT_FOOT_TRANSVERSE_META = 82,
XR_FULL_BODY_JOINT_RIGHT_FOOT_BALL_META = 83,




XR_FULL_BODY_JOINT_COUNT_META = 84,




XR_FULL_BODY_JOINT_NONE_META = 85,
XR_FULL_BODY_JOINT_MAX_ENUM_META = 0x7FFFFFFF
} XrFullBodyJointFB;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드가 실행되고 locations.isActivate가 true라고 가정하면, j&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;ointLocations[XR_FULL_BODY_JOINT_RIGHT_UPPER_LEG_META] 는 위쪽 다리 관절의 포즈를 나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Body tracking calibration (신체 추적 교정)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운&amp;nbsp;신체&amp;nbsp;추적&amp;nbsp;보정&amp;nbsp;확장을&amp;nbsp;사용하면&amp;nbsp;애플리케이션이&amp;nbsp;사용자&amp;nbsp;키에&amp;nbsp;대해&amp;nbsp;재정의된&amp;nbsp;값을&amp;nbsp;제공하여&amp;nbsp;시스템에서&amp;nbsp;수행되는&amp;nbsp;자동&amp;nbsp;보정을&amp;nbsp;재정의할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732677720255&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  XrBodyTrackerCreateInfoFB
  createInfo{XR_TYPE_BODY_TRACKER_CREATE_INFO_FB};
  createInfo.bodyJointSet = XR_BODY_JOINT_SET_FULL_BODY_META;
  XrBodyTrackerFB bodyTracker;
  xrCreateBodyTrackerFB(session, &amp;amp;createInfo, &amp;amp;bodyTracker));



  XrBodyTrackingCalibrationInfoMETA calibrationInfo = {XR_TYPE_BODY_TRACKING_CALIBRATION_INFO_META};
  calibrationInfo.bodyHeight = 2.5;
  xrSuggestBodyTrackingCalibrationMETA(bodyTracker, &amp;amp;calibrationInfo);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교정&amp;nbsp;재정의&amp;nbsp;높이는&amp;nbsp;미터&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;애플리케이션은&amp;nbsp;현재&amp;nbsp;교정&amp;nbsp;상태를&amp;nbsp;쿼리하고&amp;nbsp;신체가&amp;nbsp;현재&amp;nbsp;올바르게&amp;nbsp;교정되었는지&amp;nbsp;여부에&amp;nbsp;따라&amp;nbsp;신체&amp;nbsp;추적&amp;nbsp;결과를&amp;nbsp;사용할지&amp;nbsp;여부를&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;반환된&amp;nbsp;뼈대를&amp;nbsp;보정하는&amp;nbsp;동안&amp;nbsp;배율이&amp;nbsp;변경될&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&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;교정&amp;nbsp;상태를&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;응용&amp;nbsp;프로그램은&amp;nbsp;xrLocateBodyJointsFB를&amp;nbsp;통해&amp;nbsp;신체&amp;nbsp;포즈를&amp;nbsp;쿼리할&amp;nbsp;때&amp;nbsp;XrBodyJointLocationsFB&amp;nbsp;구조체의&amp;nbsp;다음&amp;nbsp;포인터를&amp;nbsp;통해&amp;nbsp;XrBodyTrackingCalibrationStatusMETA를&amp;nbsp;전달할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732677766671&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  XrBodyJointLocationFB
  jointLocations[XR_FULL_BODY_JOINT_COUNT_META];
  XrBodyJointLocationsFB
  locations{XR_TYPE_BODY_JOINT_LOCATIONS_FB};
  locations.jointCount = XR_FULL_BODY_JOINT_COUNT_META;
  locations.jointLocations = locations;
  XrBodyTrackingCalibrationStatusMETA calibrationStatus = {XR_TYPE_BODY_TRACKING_CALIBRATION_STATUS_META};
  Locations.next = &amp;amp;calibrationStatus;
  XrBodyJointsLocateInfoFB
  locateInfo{XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB};
  locateInfo.baseSpace = GetStageSpace();
  locateInfo.time = ToXrTime(in.PredictedDisplayTime);
  xrLocateBodyJointsFB(bodyTracker, &amp;amp;locateInfo, &amp;amp;locations));
  if (calibrationStatus.status != XR_BODY_TRACKING_CALIBRATION_STATE_VALID_META) {
      // Don&amp;rsquo;t use the body tracking result
  }

  typedef enum XrBodyTrackingCalibrationStateMETA {
  XR_BODY_TRACKING_CALIBRATION_STATE_VALID_META = 0;
  XR_BODY_TRACKING_CALIBRATION_STATE_CALIBRATING_META = 1;
  XR_BODY_TRACKING_CALIBRATION_STATE_INVALID_META = 2;
  } XrBodyTrackingCalibrationStateMETA;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유효한&amp;nbsp;보정&amp;nbsp;결과는&amp;nbsp;해당&amp;nbsp;포즈를&amp;nbsp;사용해도&amp;nbsp;안전하다는&amp;nbsp;것을&amp;nbsp;의미합니다.&amp;nbsp;신체&amp;nbsp;자세를&amp;nbsp;교정한다는&amp;nbsp;것은&amp;nbsp;교정이&amp;nbsp;아직&amp;nbsp;실행&amp;nbsp;중이고&amp;nbsp;자세가&amp;nbsp;올바르지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;의미합니다.&amp;nbsp;잘못된&amp;nbsp;보정&amp;nbsp;결과는&amp;nbsp;해당&amp;nbsp;포즈가&amp;nbsp;사용하기에&amp;nbsp;안전하지&amp;nbsp;않음을&amp;nbsp;의미합니다.&lt;/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;부록 B : ISDK integration&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 아래 사항들을 할 수 있어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISDK( Interaction SDK) 와 MSDK(Movement SDK)가 호환되도록 설정하는 방법을 이해합니다.&lt;/li&gt;
&lt;li&gt;Interaction&amp;nbsp;SDK를&amp;nbsp;사용하여&amp;nbsp;샘플&amp;nbsp;가상&amp;nbsp;객체를&amp;nbsp;조작할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;Movement&amp;nbsp;SDK를&amp;nbsp;사용하여&amp;nbsp;신체&amp;nbsp;추적으로&amp;nbsp;장면을&amp;nbsp;조작할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 Movement package에서 여러분은 MovementISDKIntegration Scene을 &lt;b&gt;Unity-Movement&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Samples~&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;AdvancedSamples&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Scenes&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;. 에서 찾을 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;이&amp;nbsp;샘플은&amp;nbsp;Interaction&amp;nbsp;SDK(ISDK)&amp;nbsp;손&amp;nbsp;움직임을&amp;nbsp;리타겟팅된&amp;nbsp;Movement&amp;nbsp;SDK(MSDK)&amp;nbsp;본문에&amp;nbsp;적용하는&amp;nbsp;방법을&amp;nbsp;보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;이&amp;nbsp;장면은&amp;nbsp;MSDK를&amp;nbsp;사용하여&amp;nbsp;신체&amp;nbsp;움직임의&amp;nbsp;대상을&amp;nbsp;캐릭터로&amp;nbsp;변경하고&amp;nbsp;ISDK에서&amp;nbsp;제공하는&amp;nbsp;상호&amp;nbsp;작용을&amp;nbsp;사용하여&amp;nbsp;캐릭터가&amp;nbsp;가상&amp;nbsp;개체와&amp;nbsp;상호&amp;nbsp;작용하도록&amp;nbsp;하려는&amp;nbsp;개발자에게&amp;nbsp;흥미로울&amp;nbsp;것입니다.&amp;nbsp;특히&amp;nbsp;잡기나&amp;nbsp;터치&amp;nbsp;제한을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;ISDK는&amp;nbsp;가상&amp;nbsp;물체(예:&amp;nbsp;컵)를&amp;nbsp;잡거나&amp;nbsp;가상&amp;nbsp;화면을&amp;nbsp;누를&amp;nbsp;때&amp;nbsp;시각적으로&amp;nbsp;정확하도록&amp;nbsp;추적된&amp;nbsp;위치에서&amp;nbsp;손가락&amp;nbsp;위치를&amp;nbsp;재배치합니다.&amp;nbsp;이는&amp;nbsp;손가락의&amp;nbsp;실제&amp;nbsp;위치와&amp;nbsp;다르기&amp;nbsp;때문에&amp;nbsp;대상&amp;nbsp;변경된&amp;nbsp;캐릭터의&amp;nbsp;손가락이나&amp;nbsp;팔꿈치&amp;nbsp;위치를&amp;nbsp;새로운&amp;nbsp;가상&amp;nbsp;위치에&amp;nbsp;맞게&amp;nbsp;조정해야&amp;nbsp;합니다.&amp;nbsp;이&amp;nbsp;샘플은&amp;nbsp;이를&amp;nbsp;수행하는&amp;nbsp;방법을&amp;nbsp;보여줍니다.&lt;/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 style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Interaction&amp;nbsp;SDK에&amp;nbsp;대한&amp;nbsp;설명서와&amp;nbsp;빠른&amp;nbsp;시작&amp;nbsp;가이드는&amp;nbsp;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-isdk-getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에서&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있습니다.&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-isdk-getting-started/#controllers-as-hands&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;nbsp;ISDK와&amp;nbsp;함께&amp;nbsp;Capsense&lt;/a&gt;를&amp;nbsp;사용해야&amp;nbsp;하며&amp;nbsp;아래&amp;nbsp;설명된&amp;nbsp;대로&amp;nbsp;OVRHands&amp;nbsp;프리팹을&amp;nbsp;통합해야&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISDK로 Capsense를 활성화하려면 &lt;b&gt;Controller Driven Hand Poses&lt;/b&gt; (OVRManager에 있음)를 &lt;b&gt;Natural&lt;/b&gt;로 설정하세요.&lt;/li&gt;
&lt;li&gt;또한 OVRCameraRig 계층 구조에 있는 OVRHandPrefab 오브젝트를 찾고 &lt;b&gt;Show State&lt;/b&gt; 옵션을 &lt;b&gt;Always&lt;/b&gt;으로 설정합니다. 이렇게 하면 컨트롤러가 손으로 작업할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Key Scirpts&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 스크립트는 기본 기능을 구현하며 프로젝트에 이식할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SkeletonHandAdjustment는&amp;nbsp;ISDK&amp;nbsp;손의&amp;nbsp;포즈를&amp;nbsp;대상&amp;nbsp;변경된&amp;nbsp;몸체에&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;스크립트입니다.&amp;nbsp;OVRInteraction&amp;nbsp;구성&amp;nbsp;요소의&amp;nbsp;하위&amp;nbsp;항목에&amp;nbsp;여러&amp;nbsp;인스턴스가&amp;nbsp;포함되어&amp;nbsp;있습니다.&amp;nbsp;OVRInteraction은&amp;nbsp;사용자가&amp;nbsp;가상&amp;nbsp;​​개체를&amp;nbsp;조작할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;손&amp;nbsp;상호&amp;nbsp;작용을&amp;nbsp;제공하는&amp;nbsp;데&amp;nbsp;사용됩니다.&amp;nbsp;이러한&amp;nbsp;손&amp;nbsp;상호&amp;nbsp;작용은&amp;nbsp;장면&amp;nbsp;계층&amp;nbsp;구조에서&amp;nbsp;왼쪽&amp;nbsp;및&amp;nbsp;오른쪽&amp;nbsp;손,&amp;nbsp;즉&amp;nbsp;LeftHandSynthetic&amp;nbsp;및&amp;nbsp;RightHandSynthetic으로&amp;nbsp;표시됩니다.&amp;nbsp;Capsense를&amp;nbsp;활성화하면&amp;nbsp;이러한&amp;nbsp;핸드&amp;nbsp;메시는&amp;nbsp;컨트롤러를&amp;nbsp;사용하든&amp;nbsp;핸드&amp;nbsp;트래킹을&amp;nbsp;사용하든&amp;nbsp;상관없이&amp;nbsp;작동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 합성 손에는 MovementISDKIntegration 샘플에 표시된 대로 SkeletonHandAdjustment 컴포넌트도 있어야 합니다. 이는 아래 설명된 SkeletonProcessAggregator 스크립트의 데이터 소스 역할을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq06RX/btsKYCzmPa3/GXMkxkexnSqVyeIdJkRPr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq06RX/btsKYCzmPa3/GXMkxkexnSqVyeIdJkRPr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq06RX/btsKYCzmPa3/GXMkxkexnSqVyeIdJkRPr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq06RX%2FbtsKYCzmPa3%2FGXMkxkexnSqVyeIdJkRPr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;181&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SkeletonProcessAggregator는&amp;nbsp;SkeletonHandAdjustment와&amp;nbsp;같은&amp;nbsp;여러&amp;nbsp;IOVRSkeletonProcessor&amp;nbsp;스크립트를&amp;nbsp;참조하고&amp;nbsp;대상&amp;nbsp;변경이&amp;nbsp;발생하기&amp;nbsp;전에&amp;nbsp;정의된&amp;nbsp;순서로&amp;nbsp;입력&amp;nbsp;뼈대에&amp;nbsp;적용하는&amp;nbsp;스크립트입니다.&amp;nbsp;애니메이션하려는&amp;nbsp;RetargetingLayer&amp;nbsp;캐릭터에&amp;nbsp;구성&amp;nbsp;요소로&amp;nbsp;추가됩니다.&amp;nbsp;예제에서는&amp;nbsp;ArmatureSkinningUpdateRetargetSkeletonProcessor&amp;nbsp;아래에&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Interaction SDK and Movement SDK Component Integration&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interaction SDK 와 Movement SDK 컴포넌트 조합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘라내기 및 붙여넣기 작업을 사용하거나 프리팹을 만들어 MovementISDKIntegration 샘플 장면에 사용된 정확한 OVRInteraction 개체를 직접 복사하는 것이 좋습니다. 직접 복사하지 않고 프로젝트에서 이러한 스크립트를 수동으로 설정하려면 다음을 수행하세요:&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-isdk-getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ISDK&amp;nbsp;시작하기&amp;nbsp;튜토리얼&lt;/a&gt;이나&amp;nbsp;유사한&amp;nbsp;ISDK&amp;nbsp;소개를&amp;nbsp;읽어보세요.&amp;nbsp;위&amp;nbsp;이미지에&amp;nbsp;표시된&amp;nbsp;것처럼&amp;nbsp;OVRCameraRig&amp;nbsp;개체와&amp;nbsp;OVRInteraction&amp;nbsp;개체가&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;단,&amp;nbsp;OVRHands&amp;nbsp;및&amp;nbsp;Synthetic&amp;nbsp;손이&amp;nbsp;누락됩니다.&amp;nbsp;OVRHands(손&amp;nbsp;포즈의&amp;nbsp;소스&amp;nbsp;역할을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;손&amp;nbsp;개체가&amp;nbsp;있음)를&amp;nbsp;검색하여&amp;nbsp;OVRInteraction에&amp;nbsp;추가합니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciSQSh/btsKZctsEol/sBCNhP319PKAyy6XM4vDnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciSQSh/btsKZctsEol/sBCNhP319PKAyy6XM4vDnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciSQSh/btsKZctsEol/sBCNhP319PKAyy6XM4vDnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciSQSh%2FbtsKZctsEol%2FsBCNhP319PKAyy6XM4vDnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;181&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;OVRLeftHandSynthetic&amp;nbsp;및&amp;nbsp;OVRRightHandSynthetic&amp;nbsp;프리팹을&amp;nbsp;검색하고&amp;nbsp;해당&amp;nbsp;항목이&amp;nbsp;아직&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;경우&amp;nbsp;OVRHands에&amp;nbsp;추가합니다.&amp;nbsp;이러한&amp;nbsp;스크립트는&amp;nbsp;명확성을&amp;nbsp;위해&amp;nbsp;MovementISDKIntegration&amp;nbsp;장면에서&amp;nbsp;이름이&amp;nbsp;변경되었습니다.&amp;nbsp;합성&amp;nbsp;손별로&amp;nbsp;설정&amp;nbsp;프로세스를&amp;nbsp;계속합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;합성 손(Synthetic Hand)이 자체적으로 설정되지 않으면 해당 데이터 소스를 소스 모노에서 데이터 소스 수정 필드로 끌어서 놓습니다. 예를 들어, 이미지에 표시된 대로 LeftHand를 LeftHandSynthetic으로 드래그해야 합니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDCbCh/btsKYEcVimL/J71jLCQLbcHwaH2FUeYwrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDCbCh/btsKYEcVimL/J71jLCQLbcHwaH2FUeYwrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDCbCh/btsKYEcVimL/J71jLCQLbcHwaH2FUeYwrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDCbCh%2FbtsKYEcVimL%2FJ71jLCQLbcHwaH2FUeYwrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1541&quot; height=&quot;546&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;왼쪽&amp;nbsp;및&amp;nbsp;오른쪽&amp;nbsp;합성&amp;nbsp;손에&amp;nbsp;SkeletonHandAdjustment를&amp;nbsp;추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-isdk-create-hand-grab-interactions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에&amp;nbsp;설명된&amp;nbsp;대로&amp;nbsp;OVRHands에&amp;nbsp;잡기&amp;nbsp;인터랙터를&amp;nbsp;추가합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;왼손의&amp;nbsp;경우&amp;nbsp;HandGrabInteractor를&amp;nbsp;OVRHands&amp;nbsp;&amp;gt;&amp;nbsp;LeftHand&amp;nbsp;&amp;gt;&amp;nbsp;HandInteractorsLeft에&amp;nbsp;추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISDK&amp;nbsp;핸드&amp;nbsp;인터랙터가&amp;nbsp;설정되면&amp;nbsp;RetargetingLayer의&amp;nbsp;GameObject에&amp;nbsp;연결되어야&amp;nbsp;하는&amp;nbsp;SkeletonProcessAggregator에서&amp;nbsp;SkeletonHandAdjustment&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;참조해야&amp;nbsp;합니다.&amp;nbsp;SkeletonProcessAggregator는&amp;nbsp;RetargetingLayer에서&amp;nbsp;예상하는&amp;nbsp;RigConstraint&amp;nbsp;구성&amp;nbsp;요소에서&amp;nbsp;사용되기&amp;nbsp;전에&amp;nbsp;입력&amp;nbsp;뼈대에&amp;nbsp;특수&amp;nbsp;처리를&amp;nbsp;적용합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RetargetingLayer가 포함된 GameObject에 SkeletonProcessAggregator 컴포넌트가 있는지 확인하세요.&lt;/li&gt;
&lt;li&gt;SkeletonProcessAggregator 컴포넌트를 추가하면 Auto Add To 필드가 자동으로 채워집니다.&lt;/li&gt;
&lt;li&gt;SkeletonProcessAggregator의&amp;nbsp;&lt;b&gt;Skeleton&amp;nbsp;Processors&lt;/b&gt; 목록에 각 합성 손 개체를 추가하고 Enabled가 선택되어 있는지 확인하세요.&lt;/li&gt;
&lt;li&gt;SkeletonProcessAggregator의 스켈레톤 프로세서 리스트에서 null 값을 제거합니다.&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AU4Ae/btsKXYwhtn0/IZgNtKL5EvDRKmWXf7KGCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AU4Ae/btsKXYwhtn0/IZgNtKL5EvDRKmWXf7KGCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AU4Ae/btsKXYwhtn0/IZgNtKL5EvDRKmWXf7KGCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAU4Ae%2FbtsKXYwhtn0%2FIZgNtKL5EvDRKmWXf7KGCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;326&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점에서 ISDK 상호 작용에 필요한 기본 컴포넌트를 추가했으며 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-isdk-hand-grab-interaction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;핸드 그랩 상호 작용&lt;/a&gt;을 설명하는 튜토리얼 중 하나로 이동하거나 우리가 제공한 샘플을 계속 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 HandGrabInteractor에 대해 HandGrabVisual을 활성화해야 조정된 손의 위치를 ​​가져와 일부 오브젝트를 감싸는 것처럼 보이도록 해야 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인터랙터 오브젝트 계층 아래의 &lt;b&gt;Visuals-&amp;gt;HandGrabVisual&lt;/b&gt;로&amp;nbsp;이동합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HandGrabVisual&lt;/b&gt;을&amp;nbsp;활성화합니다.&lt;/li&gt;
&lt;li&gt;할당되지 않은 경우 적절한 &lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Synthetic Hand를&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Synthetic Hand&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 필드에 할당합니다. 이는 손을 기반으로 한 손과 관련된 합성 손 개체에 해당합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Visuals&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;ISDK에는 디버깅에 유용한 몇 가지 시각적 요소가 있지만 캐릭터의 손과 겹쳐서 주의가 산만해 보일 수 있습니다. ISDK의 손 영상을 모두 제거하려는 경우 비활성화할 개체는 다음과 같습니다 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각 synthetic hand object에 대해 그 아래에 있는 OVRLeftHandVisual 또는 OVRRightHandVisual을 비활성화합니다.&lt;/li&gt;
&lt;li&gt;OVRHands&amp;nbsp;&amp;gt;&amp;nbsp;LeftHand&amp;nbsp;아래에서&amp;nbsp;HandVisualsLeft를&amp;nbsp;비활성화합니다.&lt;/li&gt;
&lt;li&gt;OVRHands&amp;nbsp;&amp;gt;&amp;nbsp;RightHand&amp;nbsp;아래에서&amp;nbsp;HandVisualsRight를&amp;nbsp;비활성화합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;ISDK Hierarchy&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MovementSDKIntegration&lt;/b&gt;에는 데모 목적으로만 이해해야 하며 프로젝트에서 교체되거나 제거될 수 있는 계층 구조 개체가 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI &amp;rarr; Skeleton&amp;nbsp;Rendering&amp;nbsp;Menu: 이 메뉴는 런타임 시각화를 활성화/비활성화합니다.&lt;/li&gt;
&lt;li&gt;Input skeleton visualization: Input Body Tracking Skeleton을 렌더링합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Animator&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;skeleton visualization : 대상이&amp;nbsp;변경된&amp;nbsp;애니메이터의&amp;nbsp;뼈대를&amp;nbsp;그립니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Skeleton Visuals&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;:&lt;span&gt; 여기에는&amp;nbsp;메뉴&amp;nbsp;버튼으로&amp;nbsp;수정된&amp;nbsp;BoneVisualizer&amp;nbsp;개체가&amp;nbsp;있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Environment&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;:&lt;span&gt; 장면의&amp;nbsp;바닥과&amp;nbsp;조명을&amp;nbsp;포함하는&amp;nbsp;객체입니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MirroredObjects&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;: 여기에는&amp;nbsp;미러링된&amp;nbsp;아바타와&amp;nbsp;관련&amp;nbsp;조명이&amp;nbsp;포함됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;InteractableObjects&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;:&lt;span&gt; 여기에는&amp;nbsp;Interaction&amp;nbsp;SDK를&amp;nbsp;시연하는&amp;nbsp;데&amp;nbsp;사용되는&amp;nbsp;잡을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;개체가&amp;nbsp;포함되어&amp;nbsp;있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부록 C - Advanced Body Deformation(고급&amp;nbsp;신체&amp;nbsp;변형)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약&amp;nbsp;조건을&amp;nbsp;조정한&amp;nbsp;후에도&amp;nbsp;캐릭터에&amp;nbsp;시각적&amp;nbsp;문제가&amp;nbsp;있는&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;애니메이션&amp;nbsp;리깅&amp;nbsp;제약&amp;nbsp;조건이나&amp;nbsp;대상&amp;nbsp;변경&amp;nbsp;프로세서를&amp;nbsp;적용하여&amp;nbsp;나머지&amp;nbsp;문제를&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;필요에&amp;nbsp;따라&amp;nbsp;변형&amp;nbsp;논리를&amp;nbsp;미세&amp;nbsp;조정하기&amp;nbsp;위해&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;주요&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;이해해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Animation Rigging Constraints: &lt;/b&gt;애니메이션&amp;nbsp;리깅&amp;nbsp;제약&amp;nbsp;조건에&amp;nbsp;대한&amp;nbsp;자세한&amp;nbsp;내용은&amp;nbsp;&lt;a href=&quot;https://docs.unity3d.com/Packages/com.unity.animation.rigging@1.2/manual/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에&amp;nbsp;있는&amp;nbsp;Unity&amp;nbsp;문서를&amp;nbsp;참조하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Retargeting Processors:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1e21; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;대상&amp;nbsp;변경&amp;nbsp;프로세서는&amp;nbsp;원본&amp;nbsp;추적&amp;nbsp;데이터와&amp;nbsp;대상&amp;nbsp;변경&amp;nbsp;데이터를&amp;nbsp;사용하여&amp;nbsp;뼈대&amp;nbsp;변환을&amp;nbsp;업데이트하면서&amp;nbsp;근육&amp;nbsp;공간의&amp;nbsp;제약을&amp;nbsp;받지&amp;nbsp;않도록&amp;nbsp;설계된&amp;nbsp;스크립트&amp;nbsp;가능한&amp;nbsp;개체입니다.&amp;nbsp;ArmatureCordirectLeftHand&amp;nbsp;리타겟팅&amp;nbsp;프로세서는&amp;nbsp;CCD&amp;nbsp;IK를&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;각&amp;nbsp;리타겟팅된&amp;nbsp;뼈대를&amp;nbsp;어깨에서&amp;nbsp;손&amp;nbsp;방향으로&amp;nbsp;회전시켜&amp;nbsp;원래&amp;nbsp;추적된&amp;nbsp;손&amp;nbsp;위치에&amp;nbsp;도달하려고&amp;nbsp;하는&amp;nbsp;작업의&amp;nbsp;예입니다.&amp;nbsp;자신만의&amp;nbsp;리타겟팅&amp;nbsp;프로세서를&amp;nbsp;추가하려는&amp;nbsp;경우&amp;nbsp;&lt;a href=&quot;https://github.com/oculus-samples/Unity-Movement/blob/dev/Runtime/Scripts/RetargetingProcessing/RetargetingProcessor.cs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에&amp;nbsp;있는&amp;nbsp;템플릿&amp;nbsp;ScriptableObject가&amp;nbsp;제공됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Retargeted Bone Targets: &lt;/b&gt;추적&amp;nbsp;출력(예:&amp;nbsp;SpineLower&amp;nbsp;위치&amp;nbsp;및&amp;nbsp;회전)이&amp;nbsp;필요한&amp;nbsp;경우&amp;nbsp;RetargetingLayer에&amp;nbsp;있는&amp;nbsp;외부BoneTargets을&amp;nbsp;통해&amp;nbsp;노출할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;이는&amp;nbsp;추적된&amp;nbsp;변환&amp;nbsp;데이터(위치&amp;nbsp;및&amp;nbsp;회전)로&amp;nbsp;지정된&amp;nbsp;대상&amp;nbsp;변환을&amp;nbsp;업데이트합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7cPFz/btsKWk1mIJZ/L7ImWVLW2h0qmEVJqogaA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7cPFz/btsKWk1mIJZ/L7ImWVLW2h0qmEVJqogaA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7cPFz/btsKWk1mIJZ/L7ImWVLW2h0qmEVJqogaA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7cPFz%2FbtsKWk1mIJZ%2FL7ImWVLW2h0qmEVJqogaA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;353&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;Modifying Character Height to Match Varying User Heights&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한&amp;nbsp;사용자&amp;nbsp;높이에&amp;nbsp;맞게&amp;nbsp;문자&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;정점은&amp;nbsp;일반적으로&amp;nbsp;캐릭터&amp;nbsp;애니메이션을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;메시의&amp;nbsp;제한된&amp;nbsp;부분에&amp;nbsp;영향을&amp;nbsp;미칩니다.&amp;nbsp;그러나&amp;nbsp;신체&amp;nbsp;추적은&amp;nbsp;다양한&amp;nbsp;사용자&amp;nbsp;높이를&amp;nbsp;수용하기&amp;nbsp;위해&amp;nbsp;메시의&amp;nbsp;크기를&amp;nbsp;조정할&amp;nbsp;수&amp;nbsp;있으며&amp;nbsp;이로&amp;nbsp;인해&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;시각적&amp;nbsp;아티팩트가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;여기에는&amp;nbsp;팔뚝&amp;nbsp;메시에서&amp;nbsp;연결이&amp;nbsp;끊어진&amp;nbsp;손&amp;nbsp;메시(늘리기)&amp;nbsp;또는&amp;nbsp;무릎으로&amp;nbsp;압축되는&amp;nbsp;아래쪽&amp;nbsp;다리&amp;nbsp;메시(압축)가&amp;nbsp;포함됩니다.&lt;/p&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;그림에서&amp;nbsp;캐릭터의&amp;nbsp;피부&amp;nbsp;영향은&amp;nbsp;현재&amp;nbsp;일부&amp;nbsp;관절&amp;nbsp;변환을&amp;nbsp;허용하기&amp;nbsp;위해&amp;nbsp;팔다리&amp;nbsp;관절을&amp;nbsp;따라&amp;nbsp;공유되지&amp;nbsp;않습니다.&amp;nbsp;왼쪽&amp;nbsp;그림은&amp;nbsp;발목&amp;nbsp;관절에서&amp;nbsp;메쉬&amp;nbsp;가중치가&amp;nbsp;없는&amp;nbsp;원래&amp;nbsp;캐릭터를&amp;nbsp;보여주고,&amp;nbsp;오른쪽&amp;nbsp;버전은&amp;nbsp;페인팅된&amp;nbsp;발목에서&amp;nbsp;정강이까지&amp;nbsp;가중치&amp;nbsp;영향을&amp;nbsp;보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rlqv0/btsKYNnlQXF/7296Fvs9nV01M1yBSRm4Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rlqv0/btsKYNnlQXF/7296Fvs9nV01M1yBSRm4Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rlqv0/btsKYNnlQXF/7296Fvs9nV01M1yBSRm4Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frlqv0%2FbtsKYNnlQXF%2F7296Fvs9nV01M1yBSRm4Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;296&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조정된&amp;nbsp;가중치&amp;nbsp;영향을&amp;nbsp;통해&amp;nbsp;이제&amp;nbsp;고정된&amp;nbsp;발목이&amp;nbsp;아래쪽&amp;nbsp;정강이에&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;변형으로&amp;nbsp;변환될&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciUocz/btsKXAo0UYs/GxooHJvucaFkjU6OKfEpu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciUocz/btsKXAo0UYs/GxooHJvucaFkjU6OKfEpu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciUocz/btsKXAo0UYs/GxooHJvucaFkjU6OKfEpu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciUocz%2FbtsKXAo0UYs%2FGxooHJvucaFkjU6OKfEpu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;295&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;예는&amp;nbsp;체중의&amp;nbsp;영향이&amp;nbsp;허벅지에서&amp;nbsp;무릎&amp;nbsp;관절까지의&amp;nbsp;영역에&amp;nbsp;어떻게&amp;nbsp;영향을&amp;nbsp;미칠&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;보여줍니다.&amp;nbsp;왼쪽&amp;nbsp;그림은&amp;nbsp;해당&amp;nbsp;영역에&amp;nbsp;무게가&amp;nbsp;없음을&amp;nbsp;보여&amp;nbsp;주는&amp;nbsp;반면,&amp;nbsp;오른쪽&amp;nbsp;그림은&amp;nbsp;페인팅된&amp;nbsp;무릎에서&amp;nbsp;허벅지까지&amp;nbsp;약간의&amp;nbsp;무게&amp;nbsp;영향을&amp;nbsp;보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/94IJD/btsKWNCnNoH/L6vl2Kd3rTVtRk5kMXi640/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/94IJD/btsKWNCnNoH/L6vl2Kd3rTVtRk5kMXi640/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/94IJD/btsKWNCnNoH/L6vl2Kd3rTVtRk5kMXi640/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F94IJD%2FbtsKWNCnNoH%2FL6vl2Kd3rTVtRk5kMXi640%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;295&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp;고정된&amp;nbsp;무릎을&amp;nbsp;허벅지와&amp;nbsp;무릎의&amp;nbsp;변형&amp;nbsp;결과로&amp;nbsp;변환할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z6tiW/btsKWRLzshJ/k4YvSFbNd6tou1xDgQnoc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z6tiW/btsKWRLzshJ/k4YvSFbNd6tou1xDgQnoc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z6tiW/btsKWRLzshJ/k4YvSFbNd6tou1xDgQnoc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ6tiW%2FbtsKWRLzshJ%2Fk4YvSFbNd6tou1xDgQnoc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;295&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;gif는&amp;nbsp;모션&amp;nbsp;결과를&amp;nbsp;보여줍니다.&amp;nbsp;왼쪽에는&amp;nbsp;수정되지&amp;nbsp;않은&amp;nbsp;가중치가&amp;nbsp;표시되고&amp;nbsp;오른쪽에는&amp;nbsp;조정된&amp;nbsp;가중치가&amp;nbsp;표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WzELa/btsKXHn3gMI/tNVF86K1JOKHCRx61JEsek/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WzELa/btsKXHn3gMI/tNVF86K1JOKHCRx61JEsek/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WzELa/btsKXHn3gMI/tNVF86K1JOKHCRx61JEsek/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/WzELa/btsKXHn3gMI/tNVF86K1JOKHCRx61JEsek/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;303&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 뼈대의 충격 영역을 문제의 관절 위 최소 6인치까지 확장하여 스트레칭이나 스퀴싱 중에 더 많은 메시 정점이 영향을 받도록 하는 것이 좋습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>MetaXR_SDK 탐구</category>
      <category>meta</category>
      <category>sdk 탐구</category>
      <category>XR</category>
      <category>가상현실</category>
      <category>유니티</category>
      <category>티스토리챌린지</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/224</guid>
      <comments>https://easycastleunity.tistory.com/224#entry224comment</comments>
      <pubDate>Wed, 27 Nov 2024 12:31:19 +0900</pubDate>
    </item>
    <item>
      <title>Movement SDK for Unity - 시작하기</title>
      <link>https://easycastleunity.tistory.com/223</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;b&gt;Meta XR SDK의 71버전을 기준으로 작성합니다.&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732584369141&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Meta Developers&quot; data-og-description=&quot;&quot; data-og-host=&quot;developers.meta.com&quot; data-og-source-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot; data-og-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.meta.com/horizon/documentation/unity/move-unity-getting-started/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Meta Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.meta.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;학습 목표&amp;nbsp;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 페이지의 학습을 마치면 개발자는 아래에 사항들을 할 수 있어야 합니다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;1. Movement SDK를 지원하는 프로젝트를 설정하기 위한 전제 조건을 이해한다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;2. Body Tracking, Face Tracking 이나 Eye Tracking을 지원할 수 있는 Movement SDK가 포함된 Unity 프로젝트를 만들 수 있다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Movement SDK 요구 사항&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity 용 Movement SDK를 사용하려면 아래의 있는 요소들이 필요합니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Body Tracking이나 Face Tracking을 위한 Meta Quest 나 Meta Quest Pro 헤드셋&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Eye Tracking을 위한 Meta Quest Pro 헤드셋&lt;/li&gt;
&lt;li&gt;Meta Quest OS 60.0 이상&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Movement SDK와 호환되는 Unity 버전이 설치됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2021.3.26f1(2021 LTS) 이상&lt;/li&gt;
&lt;li&gt;2022.3.11f2(2022 LTS) 이상&lt;/li&gt;
&lt;li&gt;Unity6&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Unity용 &lt;a href=&quot;https://developers.meta.com/horizon/downloads/package/meta-xr-core-sdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Meta XR Core SDK&lt;/a&gt;의 최신 버전(v71이상) 이다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/native/android/mobile-device-setup/#joining-or-creating-an-organization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개발자 조직&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Unity 프로젝트 설정&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity 프로젝트에서 설정하려는 Movement SDK 기능(Body,Face,Eye Tracking)에 관계없이 먼저 Meta Quest에서 일반적인 Unity 개발을 위해 프로젝트를 적절히 설정해야 한다. 아래의 필수 조건 섹션을 따라가면 설정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 Movement SDK 설정 섹션으로 이동하여 Movement 프로젝트를 시작해야 한다.&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;size18&quot;&gt;필수 조건&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-tutorial-hello-vr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Meta Quest 헤드셋에서 첫번째 VR 앱 만들기&lt;/a&gt; 튜토리얼을 따라라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 준비가 되면, 프로젝트 Scene에서 Cube GameObject를 삭제한다. 이 단계에서 프로젝트가 Movement SDK를 설정할 준비가 되어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Movement SDK 설정으로 진행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요 :&amp;nbsp;&lt;/b&gt;Unity 프로젝트를 처음 부터 시작하는 경우, Meta Quest 헤드셋에서 첫번째 VR 앱 만들기 튜토리얼을 따르는 것이 가장 빠르게 시작하고 Movement SDK 나 다른 기능 설정으로 안전하게 이동할 수 있는 방법이다.&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;이전 단계를 따르지 않기로 했지만 Meta Quest 헤드셋에서 빌드하고 실행할 수 있는 Unity 프로젝트를 섲어하는 방법에 익숙하다면 Movement SDK 작업을 시작하기 전에 프로젝트에 다음 설정이 있는지 확인하자.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity용 &lt;a href=&quot;https://developers.meta.com/horizon/downloads/package/meta-xr-core-sdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Meta XR Core SDK&lt;/a&gt;의 최신버전이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-project-configuration#configure-general-settings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;표준 구성 설정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OVRPlugin&lt;/li&gt;
&lt;li&gt;Scene에 OVRCameraRig를 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Movement SDK 설정&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Movement SDK를 설정하려면 아래의 단계를 따라라.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Movement 패키지를 Unity 프로젝트로 가져오기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서는 두 가지 옵션이 있다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub repo에서 직접 패키지를 설치&lt;/li&gt;
&lt;li&gt;먼저 패키지를 다운로드한 다음 디스크에서 설치&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.meta.com/horizon/downloads/package/meta-xr-core-sdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Meta XR Core SDK&lt;/a&gt; 외에&lt;a href=&quot;https://developers.meta.com/horizon/downloads/package/meta-xr-interaction-sdk-ovr-integration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; Meta XR Interaction SDK&lt;/a&gt;도 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;옵션 A. GitHub 저장소에서 직접 패키지 설치&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Unity Editor 메뉴에서&amp;nbsp;&lt;b&gt;Window &amp;gt; Package Manager&lt;/b&gt;를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;b&gt;Package Manager&amp;nbsp;&lt;/b&gt;메뉴에서 드롭다운 목록에서&amp;nbsp;&lt;b&gt;In Project for Packages&lt;/b&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;345&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RFL0j/btsKUApyqyp/lKpltABtglkRJhX7u6HFg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RFL0j/btsKUApyqyp/lKpltABtglkRJhX7u6HFg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RFL0j/btsKUApyqyp/lKpltABtglkRJhX7u6HFg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRFL0j%2FbtsKUApyqyp%2FlKpltABtglkRJhX7u6HFg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;52&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 나타나는 메뉴에서&amp;nbsp;&lt;b&gt;Add package from git URL...&amp;nbsp;&lt;/b&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;454&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3tFzl/btsKVvH2H3Z/H9xCLfjSwqL2jHTKgkIw60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3tFzl/btsKVvH2H3Z/H9xCLfjSwqL2jHTKgkIw60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3tFzl/btsKVvH2H3Z/H9xCLfjSwqL2jHTKgkIw60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3tFzl%2FbtsKVvH2H3Z%2FH9xCLfjSwqL2jHTKgkIw60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;159&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 나타나는&amp;nbsp;&lt;b&gt;Add package form git URL&amp;nbsp;&lt;/b&gt;텍스트 상자에 &lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: left;&quot;&gt;&lt;a href=&quot;https://github.com/oculus-samples/Unity-Movement.git&quot;&gt;https://github.com/oculus-samples/Unity-Movement.git&lt;/a&gt; URL을 입력하고 Add를 선택한다.&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;400&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C7OFj/btsKU69wa7W/ybaBhbyuaOUdEzzhgr8ok1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C7OFj/btsKU69wa7W/ybaBhbyuaOUdEzzhgr8ok1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C7OFj/btsKU69wa7W/ybaBhbyuaOUdEzzhgr8ok1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC7OFj%2FbtsKU69wa7W%2FybaBhbyuaOUdEzzhgr8ok1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;63&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&amp;nbsp;&lt;b&gt;Package Manager의 Package-Meta Platforms,Inc.&amp;nbsp;&lt;/b&gt;에&amp;nbsp;&lt;b&gt;Meta Movement&lt;/b&gt;가 나열되어 있는지 확인&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;옵션 B. 패키지 다운로드하여 디스크에서 설치&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://github.com/oculus-samples/Unity-Movement/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 링크&lt;/a&gt;로 들어가서 릴리즈된 패키지 중 하나를 다운로드하여 압축을 푼다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Unity Editor의 메뉴에서&amp;nbsp;&lt;b&gt;Window &amp;gt; Package Manager&amp;nbsp;&lt;/b&gt;를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;&lt;b&gt;Package Manager&amp;nbsp;&lt;/b&gt;메뉴에서 드롭다운 목록에서 &lt;b&gt;In Project&lt;/b&gt; for &lt;b&gt;Packages&lt;/b&gt; 를 선택한다. 그런 다음 &lt;b&gt;+&lt;/b&gt;를 클릭하여 패키지를 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&amp;nbsp;&lt;b&gt;Add package from disk..&amp;nbsp;&lt;/b&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;456&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zyMDp/btsKUBBVlZP/pMfJq8WaJd00cegZNTQjC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zyMDp/btsKUBBVlZP/pMfJq8WaJd00cegZNTQjC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zyMDp/btsKUBBVlZP/pMfJq8WaJd00cegZNTQjC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzyMDp%2FbtsKUBBVlZP%2FpMfJq8WaJd00cegZNTQjC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;157&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 패키지의 압축을 푼 위치에서&amp;nbsp;&lt;b&gt;package.json&amp;nbsp;&lt;/b&gt;파일을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. &lt;b&gt;Package Manager의 Package-Meta Platforms,Inc.&amp;nbsp;&lt;/b&gt;에&amp;nbsp;&lt;b&gt;Meta Movement&lt;/b&gt;가 나열되어 있는지 확인&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 샘플 가져오기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플을 별도로 가져오므로 프로젝트 Assets 폴더의 크기를 관리하는데 도움이 된다. 샘플을 가져오려면 Unity의 메뉴,&amp;nbsp;&lt;b&gt;Window &amp;gt; Package Manager&amp;nbsp;&lt;/b&gt;로 이동한다. &lt;b&gt;Meta Movement &lt;/b&gt;패키지와 해당&lt;b&gt; Samples&amp;nbsp;&lt;/b&gt;탭을 찾는다. &lt;b&gt;Import&lt;/b&gt;를 클릭하면 샘플이 Unity Project의 폴더&amp;nbsp; Assets/Samples/Meta&lt;span style=&quot;background-color: #ffffff; color: #1c2b33; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Movement/&amp;lt;version&amp;gt; 에 저장된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Body Tracking 원클릭 재적용&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여러분이&amp;nbsp;&lt;b&gt;Movement Samples &amp;gt; Body Tracking &amp;gt; Animation Rigging Retargeting (full body)(constraints)&amp;nbsp;&lt;/b&gt;나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/move-body-tracking/#setting-up-a-character-for-body-tracking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Setting up a character for body tracking&lt;/b&gt;&lt;/a&gt;글의 밑에 있는&amp;nbsp; &lt;b&gt;Enable Tracking for the Character&lt;/b&gt; 섹션에서 설명한 유사한 메뉴를 사용한 적이 있는 경우, 같은 메뉴를 다시 사용한다. 최신 구성 요소로 캐릭터를 설정하기 전에 자동으로 오래된 스크립트와 구성 요소를 정리한다. 이 방법이 효과가 없는 경우, 이전에 추가한 Movement 관련 Retargeting 스크립트와 캐릭터의 Rig 구성 요소 아래에 있는 모든 애니메이션 리깅 제약 조건을 삭제한다. 그런 다음 &lt;b&gt;Enable Tracking for the Character&amp;nbsp;&lt;/b&gt;의 지침을 다시 따라 관련 구성 요서를 추가하고 Retargeting에 필요한 데이터를 계산한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. OVRCameraRig 설정 구성&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Unity Editor의&amp;nbsp;&lt;b&gt;Hierarchy&amp;nbsp;&lt;/b&gt;하위에 있는 &lt;b&gt;OVRCameraRig&amp;nbsp;&lt;/b&gt;를 선택하여 Inspector 창을 연다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt; 중요 :&amp;nbsp; OVRCameraRig&lt;/b&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;331&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rc89r/btsKXAui9Eu/uX357G59UU5aLO27gOncLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rc89r/btsKXAui9Eu/uX357G59UU5aLO27gOncLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rc89r/btsKXAui9Eu/uX357G59UU5aLO27gOncLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frc89r%2FbtsKXAui9Eu%2FuX357G59UU5aLO27gOncLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;111&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Inspector에서&amp;nbsp;&lt;b&gt;Quest Features &amp;gt; General&amp;nbsp;&lt;/b&gt;로 이동하여 &lt;b&gt;Body,Face, Eye Tracking Support&lt;/b&gt; 중 여러분이 지원하기를 원하는 Tracking support의 type을 &lt;i&gt;Supported &lt;/i&gt;나&amp;nbsp;&lt;i&gt;Required&amp;nbsp;&lt;/i&gt;로 설정한다. 그리고&amp;nbsp;&lt;b&gt;Hand Tracking Support&amp;nbsp;&lt;/b&gt;는 &lt;i&gt;Controllers And Hands&amp;nbsp;&lt;/i&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.&amp;nbsp;&lt;b&gt;Inspector&amp;nbsp;&lt;/b&gt;window에서&amp;nbsp;&lt;b&gt;Permission Requests On Startup&amp;nbsp;&lt;/b&gt;으로 스크롤 다운하고 여러분이 사용하기 원하는&amp;nbsp;&lt;i&gt;Movement&lt;/i&gt; 기능을 켠다. Audio To Expressions가 동작하려면 오디오 기록 권한이 필요하다.&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;438&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DwLjK/btsKVbi7w9O/ltHhzEgyPTK2zOR92KDduk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DwLjK/btsKVbi7w9O/ltHhzEgyPTK2zOR92KDduk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DwLjK/btsKVbi7w9O/ltHhzEgyPTK2zOR92KDduk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDwLjK%2FbtsKVbi7w9O%2FltHhzEgyPTK2zOR92KDduk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;105&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 프로젝트 설정 도구에서 진단한 모든 문제를 수정한다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Unity Editor의 메인 화면에서&amp;nbsp;&lt;b&gt;Edit &amp;gt; Project Settings&amp;nbsp;&lt;/b&gt;를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;b&gt;Meta XR&lt;/b&gt;을 선택하고 &lt;b&gt;Project Setup Tool&amp;nbsp;&lt;/b&gt;을 연다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 스탠드 얼론 아이콘(왼쪽 아이콘)을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 문제가 있다면 &lt;b&gt;Fix All&amp;nbsp;&lt;/b&gt;을 선택한다. 더 자세한 사항은 &lt;a href=&quot;https://developers.meta.com/horizon/documentation/unity/unity-upst-overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Use Project Setup Tool&lt;/a&gt;에서 확인 바람&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>MetaXR_SDK 탐구</category>
      <category>meta</category>
      <category>XR</category>
      <category>가상현실</category>
      <category>유니티</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/223</guid>
      <comments>https://easycastleunity.tistory.com/223#entry223comment</comments>
      <pubDate>Tue, 26 Nov 2024 12:07:20 +0900</pubDate>
    </item>
    <item>
      <title>상호작용 추가</title>
      <link>https://easycastleunity.tistory.com/222</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Meta XR SDK 69버전을 기준으로 작성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/221&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://easycastleunity.tistory.com/221&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1732073105435&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;유니티 기본 세팅&quot; data-og-description=&quot;해당 글은 Meta XR SDK 69버전을 기준으로 작성되고 있다. 유니티 Asset Store에서 Meta All in One SDK 계정에 추가&amp;nbsp;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&amp;nbsp;Meta XR All-in-One SDK | 기능&quot; data-og-host=&quot;easycastleunity.tistory.com&quot; data-og-source-url=&quot;https://easycastleunity.tistory.com/221&quot; data-og-url=&quot;https://easycastleunity.tistory.com/221&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGy5L4/hyXzO2gGqi/ltsI8yUq1lfYkM85Am13l1/img.png?width=800&amp;amp;height=542&amp;amp;face=0_0_800_542,https://scrap.kakaocdn.net/dn/dEkl8p/hyXDekFNvJ/MTmuwwY2Vz587EfJ6UIgMk/img.png?width=800&amp;amp;height=542&amp;amp;face=0_0_800_542,https://scrap.kakaocdn.net/dn/TMi2A/hyXDgv1HwE/qaCvo6HWXrz594ed5yYr0k/img.png?width=957&amp;amp;height=502&amp;amp;face=0_0_957_502&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/221&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://easycastleunity.tistory.com/221&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGy5L4/hyXzO2gGqi/ltsI8yUq1lfYkM85Am13l1/img.png?width=800&amp;amp;height=542&amp;amp;face=0_0_800_542,https://scrap.kakaocdn.net/dn/dEkl8p/hyXDekFNvJ/MTmuwwY2Vz587EfJ6UIgMk/img.png?width=800&amp;amp;height=542&amp;amp;face=0_0_800_542,https://scrap.kakaocdn.net/dn/TMi2A/hyXDgv1HwE/qaCvo6HWXrz594ed5yYr0k/img.png?width=957&amp;amp;height=502&amp;amp;face=0_0_957_502');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;유니티 기본 세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 글은 Meta XR SDK 69버전을 기준으로 작성되고 있다. 유니티 Asset Store에서 Meta All in One SDK 계정에 추가&amp;nbsp;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&amp;nbsp;Meta XR All-in-One SDK | 기능&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;easycastleunity.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 포스트에서 한 기본 세팅이 마무리된 씬이 필요하다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Add an Interaction &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Hierarchy에서 3D 오브젝트 Cube를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 생성한 큐브를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 큐브에 마우스 우클릭을 하고&amp;nbsp;&lt;b&gt;Interaction SDK &amp;gt; Add ... Interaction&amp;nbsp;&lt;/b&gt;(ex. Add Grab Interaction)을 선택한다.&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;913&quot; data-origin-height=&quot;1227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8rDh6/btsKQgwjK3Y/FRej6lZkz0dZjSasMIgkh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8rDh6/btsKQgwjK3Y/FRej6lZkz0dZjSasMIgkh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8rDh6/btsKQgwjK3Y/FRej6lZkz0dZjSasMIgkh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8rDh6%2FbtsKQgwjK3Y%2FFRej6lZkz0dZjSasMIgkh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;1227&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;1227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Grab Wizard 팝업이 나온다. (QuickActions Menu이다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NpJz7/btsKQBUhg5x/qfP6sk8ApyNiZtgc5uS3Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NpJz7/btsKQBUhg5x/qfP6sk8ApyNiZtgc5uS3Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NpJz7/btsKQBUhg5x/qfP6sk8ApyNiZtgc5uS3Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpJz7%2FbtsKQBUhg5x%2FqfP6sk8ApyNiZtgc5uS3Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;882&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;5. Fix All 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이후 Create 클릭&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 자동으로 선택한 Interactable이 자식으로 만들어져 3D 오브젝트에 부착된다.&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;1985&quot; data-origin-height=&quot;1625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Fe8E/btsKQFoPAvT/e67vElnZjX0U3IOvHLrRE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Fe8E/btsKQFoPAvT/e67vElnZjX0U3IOvHLrRE0/img.png&quot; data-alt=&quot;부착된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Fe8E/btsKQFoPAvT/e67vElnZjX0U3IOvHLrRE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Fe8E%2FbtsKQFoPAvT%2Fe67vElnZjX0U3IOvHLrRE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1985&quot; height=&quot;1625&quot; data-origin-width=&quot;1985&quot; data-origin-height=&quot;1625&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부착된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OVR SDK와의 차이점&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.Physics Grabbable이 사라지고 해당 기능이 기본적인 Grabbable에 포함됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 잡고 있을때는 계속 잡은 물체는 Kinematic이었는데, 선택할 수 있도록 변경됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 샘플 기본 제공 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 상호작용 추가하는거 Quick방법이 생성됨 -&amp;gt; 기존 방법인 그냥 스크립트 추가하는 방법도 사용가능&amp;nbsp;&lt;/p&gt;</description>
      <category>MetaXR_SDK 탐구</category>
      <category>meta xr</category>
      <category>SDK</category>
      <category>VR</category>
      <category>가상현실</category>
      <category>개발</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/222</guid>
      <comments>https://easycastleunity.tistory.com/222#entry222comment</comments>
      <pubDate>Wed, 20 Nov 2024 13:48:47 +0900</pubDate>
    </item>
    <item>
      <title>유니티 기본 세팅</title>
      <link>https://easycastleunity.tistory.com/221</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;해당 글은 Meta XR SDK 69버전을 기준으로 작성되고 있다. &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유니티 Asset Store에서 Meta All in One SDK 계정에 추가&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dX1t00/btsKQdlITZM/Pzf63oDj6DbjR2HzOZxpM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dX1t00/btsKQdlITZM/Pzf63oDj6DbjR2HzOZxpM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dX1t00/btsKQdlITZM/Pzf63oDj6DbjR2HzOZxpM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdX1t00%2FbtsKQdlITZM%2FPzf63oDj6DbjR2HzOZxpM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;436&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732071084285&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Meta XR All-in-One SDK | 기능 통합 | Unity Asset Store&quot; data-og-description=&quot;Use the Meta XR All-in-One SDK from Oculus on your next project. Find this integration tool &amp;amp; more on the Unity Asset Store.&quot; data-og-host=&quot;assetstore.unity.com&quot; data-og-source-url=&quot;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&quot; data-og-url=&quot;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fZADx/hyXzMJ8u6T/z8BC7zChakjPsb0mv3KJIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/det9Q6/hyXDfcOrue/nwfmTYCU5Vd0AX7OTrONwk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9OMOF/hyXzN96dc7/dsfQMklGprwjMcqyo2qOu0/img.jpg?width=1950&amp;amp;height=1300&amp;amp;face=0_0_1950_1300&quot;&gt;&lt;a href=&quot;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fZADx/hyXzMJ8u6T/z8BC7zChakjPsb0mv3KJIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/det9Q6/hyXDfcOrue/nwfmTYCU5Vd0AX7OTrONwk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9OMOF/hyXzN96dc7/dsfQMklGprwjMcqyo2qOu0/img.jpg?width=1950&amp;amp;height=1300&amp;amp;face=0_0_1950_1300');&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;Meta XR All-in-One SDK | 기능 통합 | Unity Asset Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use the Meta XR All-in-One SDK from Oculus on your next project. Find this integration tool &amp;amp; more on the Unity Asset Store.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;assetstore.unity.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;패키지 매니저를 통해 설치 &lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rwkxr/btsKOAinRwB/In8NR2dEpMbpO8sEkSxZB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rwkxr/btsKOAinRwB/In8NR2dEpMbpO8sEkSxZB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rwkxr/btsKOAinRwB/In8NR2dEpMbpO8sEkSxZB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frwkxr%2FbtsKOAinRwB%2FIn8NR2dEpMbpO8sEkSxZB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1155&quot; height=&quot;746&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설치 이후 저장할 때마다 발생하는 에러 수정&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 저장을 할 때마다, Interaction SDK 밑에 있는 HandRay 프리팹을 저장할 권한이 없어 저장을 못한다며 오류가 발생&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이 오류는 커스텀 패키지에서 일어날 수 있는 문제로 말 그대로, 어떠한 오류로 인해 저장권한이 없기에 발생&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 해결하기 위해, 유니티의 Project 창에서 Packages 섹션으로 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Meta XR Interaction SDK를 선택하고 우클릭하여 Show In Explorer를 실행&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;610&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sIQBv/btsKPdfWHes/BOOGlC8BfrU24xkF8brs5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sIQBv/btsKPdfWHes/BOOGlC8BfrU24xkF8brs5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sIQBv/btsKPdfWHes/BOOGlC8BfrU24xkF8brs5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsIQBv%2FbtsKPdfWHes%2FBOOGlC8BfrU24xkF8brs5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;263&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 창이 나오면, com.meta.xr.sdk.interaction.ovr@69.01 라는 패키지가 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이 패키지를 복사하여, 아래 사진처럼 실제 Packages로 붙여넣기 한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmZcy5/btsKOxsuO16/EhFjr7qU3LLaNiWcMdWwYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmZcy5/btsKOxsuO16/EhFjr7qU3LLaNiWcMdWwYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmZcy5/btsKOxsuO16/EhFjr7qU3LLaNiWcMdWwYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmZcy5%2FbtsKOxsuO16%2FEhFjr7qU3LLaNiWcMdWwYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;502&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 붙여넣은 패키지에서 @69.01이라는 버전을 뜻하는 부분을 이름 변경을 통해 삭제한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 이후 다시 에디터로 돌아가면 에디터를 재시작해야 한다는 팝업이 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 해당 팝업을 통해 재시작하면 문제가 해결된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 Rig 씬에 추가 &lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 기본 씬에서 Main Camera 삭제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Hierarchy에서 마우스 우클릭을 하고 &lt;b&gt;Interaction SDK &amp;gt; Add Ovr Interaction Rig&lt;/b&gt;를 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvBbt/btsKOp81jvC/soSkjC2I6yMAYadbJ7aqvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvBbt/btsKOp81jvC/soSkjC2I6yMAYadbJ7aqvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvBbt/btsKOp81jvC/soSkjC2I6yMAYadbJ7aqvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyvBbt%2FbtsKOp81jvC%2FsoSkjC2I6yMAYadbJ7aqvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;461&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. OVRCameraRigInteraction 이 생성됨&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;565&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J8fKz/btsKQd0npeX/JNwSJUdniBkywKsI7tcHKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J8fKz/btsKQd0npeX/JNwSJUdniBkywKsI7tcHKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J8fKz/btsKQd0npeX/JNwSJUdniBkywKsI7tcHKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ8fKz%2FbtsKQd0npeX%2FJNwSJUdniBkywKsI7tcHKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;241&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 계층구조에서 &lt;b&gt;OVRCameraRigInteraction&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;OVRCameraRig&amp;nbsp;&lt;/b&gt;를 선택&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. OVRCameraRig의 OVRManager의 Quest Features를 아래 사진과 같이 변경&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;812&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNxrtS/btsKPeTeeFq/r9Hoz7QK751MghwoFPmxs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNxrtS/btsKPeTeeFq/r9Hoz7QK751MghwoFPmxs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNxrtS/btsKPeTeeFq/r9Hoz7QK751MghwoFPmxs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNxrtS%2FbtsKPeTeeFq%2Fr9Hoz7QK751MghwoFPmxs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;294&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 링크를 활성화 하고 씬을 Play 해보자&amp;nbsp;&lt;/p&gt;</description>
      <category>MetaXR_SDK 탐구</category>
      <category>meta xr</category>
      <category>SDK</category>
      <category>VR</category>
      <category>가상현실</category>
      <category>개발</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/221</guid>
      <comments>https://easycastleunity.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 20 Nov 2024 11:48:48 +0900</pubDate>
    </item>
    <item>
      <title>CGV 개발일지 14(시작 씬, 로비 씬, 방 씬 만들기)</title>
      <link>https://easycastleunity.tistory.com/213</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저희 프로젝트는, VR 플레이어가 호스트가 되어 방을 만들고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC 플레이어가 클라이언트가 되어 방에 입장하는 방식으로 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 이에 따른 기본 로직을 작성해보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 시작 씬입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시작화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RmmR0/btsCgqtCRGT/LKZhov36hDPynOkW2lD6Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RmmR0/btsCgqtCRGT/LKZhov36hDPynOkW2lD6Qk/img.png&quot; data-alt=&quot;다비고 시작화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RmmR0/btsCgqtCRGT/LKZhov36hDPynOkW2lD6Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRmmR0%2FbtsCgqtCRGT%2FLKZhov36hDPynOkW2lD6Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1138&quot; data-filename=&quot;시작화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1138&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다비고 시작화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레퍼런스한 다비고 게임의 시작화면입니다. 이 모습과 비슷하게 만들어보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;녹화_2023_12_18_17_52_03_546.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFUAmJ/btsB6vwJgGs/Gz6byJQaH4SJAYKKoMrOFk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFUAmJ/btsB6vwJgGs/Gz6byJQaH4SJAYKKoMrOFk/img.gif&quot; data-alt=&quot;버튼 위로 마우스 포인터 올라가면 하이라이트 처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFUAmJ/btsB6vwJgGs/Gz6byJQaH4SJAYKKoMrOFk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cFUAmJ/btsB6vwJgGs/Gz6byJQaH4SJAYKKoMrOFk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;799&quot; data-filename=&quot;녹화_2023_12_18_17_52_03_546.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버튼 위로 마우스 포인터 올라가면 하이라이트 처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용자가 어떤 버튼에 가 있는지 알 수 있도록 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음으로는 Game 버튼을 누르면 나오는 모습입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;온라인 게임 누른 후 화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CX2Zs/btsB6LmfbGW/1YJdKGcNQifNFmQU9GWaw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CX2Zs/btsB6LmfbGW/1YJdKGcNQifNFmQU9GWaw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CX2Zs/btsB6LmfbGW/1YJdKGcNQifNFmQU9GWaw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCX2Zs%2FbtsB6LmfbGW%2F1YJdKGcNQifNFmQU9GWaw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1139&quot; data-filename=&quot;온라인 게임 누른 후 화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1139&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-filename=&quot;녹화_2023_12_18_17_54_35_103.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5ofvf/btsB6NYKTmB/cBiDtrjVrKekOZ5al7KHT0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5ofvf/btsB6NYKTmB/cBiDtrjVrKekOZ5al7KHT0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5ofvf/btsB6NYKTmB/cBiDtrjVrKekOZ5al7KHT0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c5ofvf/btsB6NYKTmB/cBiDtrjVrKekOZ5al7KHT0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;799&quot; data-filename=&quot;녹화_2023_12_18_17_54_35_103.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Game 버튼을 누르면 거인을 플레이 할지 기사를 플레이 할지 나옵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 레퍼런스한 게임인 다비고와는 다르게 이 시점에서 닉네임을 입력하고 서버로 연결이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 관한 코드는 FirstMain이라고 작성하였고 아래의 코드 입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702889904465&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class FirstMain : MonoBehaviour
{
    [Header(&quot;Start&quot;)]
    [SerializeField] private GameObject startGo;
    [SerializeField] private Button btnGame;
    [SerializeField] private Button btnQuit;

    [Header(&quot;Select Mode&quot;)]
    [SerializeField] private GameObject selectModeGo;
    [SerializeField] private Button btnGiant;
    [SerializeField] private Button btnKnight;

    [Header(&quot;NickName Input&quot;)]
    [SerializeField] private TMP_InputField nickNameInputField;


    // Start is called before the first frame update
    void Start()
    {
        this.selectModeGo.SetActive(false);
        this.ButtonExecutionEvents();
    }

    private void ButtonExecutionEvents()
    {
        this.btnQuit.onClick.AddListener(() =&amp;gt;
        {
            this.AppQuit();
        });
        this.btnGame.onClick.AddListener(() =&amp;gt;
        {
            this.startGo.SetActive(false);
            this.selectModeGo.SetActive(true);
        });

        this.btnGiant.onClick.AddListener(() =&amp;gt;
        {
            if (string.IsNullOrEmpty(this.nickNameInputField.text))
            {
                Debug.Log(&quot;닉네임을 입력해주세요&quot;);
            }
            else
            {
                Debug.Log(&quot;&amp;lt;color=green&amp;gt;거인 선택! 방 만들기&amp;lt;/color&amp;gt;&quot;);
                NetworkManager.instance.ConnectVR(this.nickNameInputField.text);
                //로딩창 실행 
            }

        });

        this.btnKnight.onClick.AddListener(() =&amp;gt;
        {
            if (string.IsNullOrEmpty(this.nickNameInputField.text))
            {
                Debug.Log(&quot;닉네임을 입력해주세요&quot;);
            }
            else
            {
                Debug.Log(&quot;&amp;lt;color=red&amp;gt;기사 선택! 로비 씬으로 이동 &amp;lt;/color&amp;gt;&quot;);
                NetworkManager.instance.ConnectPC(this.nickNameInputField.text); //서버 연결 
                //로딩창 실행 
            }

        });
    }

    private void AppQuit()
    {
        Debug.Log(&quot;앱 종료&quot;);
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
        Application.Quit(); 
#endif
    }
}&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;Quit 버튼을 누르면 게임을 종료합니다.&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;그리고 Game 버튼을 누르면, Game버튼과 Quit 버튼을 비활성화 하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모드를 선택하는 UI창을 띄웁니다.&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;893&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ed4ay/btsCc1VDzS0/e4emakTflAthch33nKiMG1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ed4ay/btsCc1VDzS0/e4emakTflAthch33nKiMG1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ed4ay/btsCc1VDzS0/e4emakTflAthch33nKiMG1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Ed4ay/btsCc1VDzS0/e4emakTflAthch33nKiMG1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;799&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&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;또한 거인을 누르면 싱글톤 클래스인 NetworkManager의 ConnectVR을 호출하여 연결하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기사를 누르면 NetworkManager의 ConnectPC를 호출합니다.&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;530&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJf0Dh/btsCaw9tBKP/qzKpOKH9dsTuAzSobJBz6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJf0Dh/btsCaw9tBKP/qzKpOKH9dsTuAzSobJBz6k/img.png&quot; data-alt=&quot;NetworkManager의 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJf0Dh/btsCaw9tBKP/qzKpOKH9dsTuAzSobJBz6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJf0Dh%2FbtsCaw9tBKP%2FqzKpOKH9dsTuAzSobJBz6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;597&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NetworkManager의 일부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 모드를 선택한 순간 서버와 연결이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;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;거인이 룸 만들면 나오는 화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu3oOr/btsB7ijDpI1/BuLb6w1IDSC32iqFxPBpp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu3oOr/btsB7ijDpI1/BuLb6w1IDSC32iqFxPBpp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu3oOr/btsB7ijDpI1/BuLb6w1IDSC32iqFxPBpp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu3oOr%2FbtsB7ijDpI1%2FBuLb6w1IDSC32iqFxPBpp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1144&quot; data-filename=&quot;거인이 룸 만들면 나오는 화면.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거인을 선택하여 바로 방을 만들면 방을 선택하는 로비를 거치지 않고 바로 방을 만들고 방으로 들어오게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어본 룸 씬의 모습입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O6rXx/btsCbeAKvWz/hgqYBdFH9GLAKfRUXPkc4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O6rXx/btsCbeAKvWz/hgqYBdFH9GLAKfRUXPkc4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O6rXx/btsCbeAKvWz/hgqYBdFH9GLAKfRUXPkc4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO6rXx%2FbtsCbeAKvWz%2FhgqYBdFH9GLAKfRUXPkc4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;891&quot; height=&quot;506&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;506&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-filename=&quot;녹화_2023_12_18_18_02_40_469.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNk3gs/btsB84rEOqS/gD1VmGteVGsJK9hZ47kSkK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNk3gs/btsB84rEOqS/gD1VmGteVGsJK9hZ47kSkK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNk3gs/btsB84rEOqS/gD1VmGteVGsJK9hZ47kSkK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cNk3gs/btsB84rEOqS/gD1VmGteVGsJK9hZ47kSkK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;799&quot; data-filename=&quot;녹화_2023_12_18_18_02_40_469.gif&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방 만들기를 누르고, 기다리면 서버와 연결이 되며, 랜덤한 방 번호를 가진 방이 생성되어 그대로 방으로 들어가게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버와 연결된 순간 로비로 접속을 하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LFO3E/btsCevoGkVF/QCtkM9RH9qtt9L5mQhLXkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LFO3E/btsCevoGkVF/QCtkM9RH9qtt9L5mQhLXkK/img.png&quot; data-alt=&quot;NetworkManager의 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LFO3E/btsCevoGkVF/QCtkM9RH9qtt9L5mQhLXkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLFO3E%2FbtsCevoGkVF%2FQCtkM9RH9qtt9L5mQhLXkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;639&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NetworkManager의 일부분&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;876&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxVvES/btsCeyyX0ng/py3Wv0VM0BKsL2klUZkyCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxVvES/btsCeyyX0ng/py3Wv0VM0BKsL2klUZkyCk/img.png&quot; data-alt=&quot;NetworkManager의 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxVvES/btsCeyyX0ng/py3Wv0VM0BKsL2klUZkyCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxVvES%2FbtsCeyyX0ng%2Fpy3Wv0VM0BKsL2klUZkyCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;347&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NetworkManager의 일부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, OnJoinedLobby가 호출이되며, bool 변수 isVR의 값에 따라 isVR이 true면 방을 만들고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isVR이 false면 로비씬으로 넘어갑니다.&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;CreateRoom 함수를 통해, 최대 인원의 수가 5인 방을 만들고, 방의 이름을 Random을 통해 1000에서 9999사이의 숫자로 이름을 만듭니다.&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;이제 다음으로 PC에 순서를 보겠습니다.&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;기사 누르면 방 목록 창이 나옴.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPiJ6V/btsCauX667p/UmTiGyZ08HijOw040Hix31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPiJ6V/btsCauX667p/UmTiGyZ08HijOw040Hix31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPiJ6V/btsCauX667p/UmTiGyZ08HijOw040Hix31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPiJ6V%2FbtsCauX667p%2FUmTiGyZ08HijOw040Hix31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1200&quot; data-filename=&quot;기사 누르면 방 목록 창이 나옴.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방의 리스트와 비공개 방으로 들어갈 수 있는 화면입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 이거와 다르게, 개인적인 방으로만 들어가는 것을 해보았습니다.&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;이때 정보가 갱신이 되어야 하는데, 이에 대한 처리는 RoomMain이라는 스크립트가 처리합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702890993261&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Photon.Pun;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class RoomMain : MonoBehaviour
{
    [Header(&quot;Buttons&quot;)]
    [SerializeField] private Button btnStart;
    [SerializeField] private Button btnLeaveRoom;
    [Header(&quot;Room Info Text&quot;)]
    [SerializeField] private TMP_Text txtRoomCode;
    [SerializeField] private TMP_Text txtRoomPlayerCount;
    [Header(&quot;Player Nickname Text&quot;)]
    [SerializeField] private TMP_Text txtGiantNickname;
    [SerializeField] private TMP_Text[] txtKngihtNickname;
    // Start is called before the first frame update
    void Awake()
    {
        this.btnStart.onClick.AddListener(() =&amp;gt;
        {
            NetworkManager.instance.StartGame();
        });

        this.btnLeaveRoom.onClick.AddListener(() =&amp;gt;
        {
            NetworkManager.instance.CloseRoom();
        });
        this.txtRoomCode.text = PhotonNetwork.CurrentRoom.Name;

        this.SetGiantNickname();

        this.UpdatePcPlayerNickname();
        NetworkManager.instance.onJoinRoomAction();
    }

    private void Start()
    {
        if (!PhotonNetwork.IsMasterClient)
        {
            this.btnStart.gameObject.SetActive(false);
        }
    }

    private void UpdatePcPlayerNickname()
    {
        NetworkManager.instance.onJoinRoomAction = () =&amp;gt;
        {
            this.SetEnterKnightNickname();
            this.txtRoomPlayerCount.text = string.Format(&quot;{0}/{1}&quot;,
                PhotonNetwork.CurrentRoom.PlayerCount - 1, PhotonNetwork.CurrentRoom.MaxPlayers - 1);
        };

        NetworkManager.instance.onPlayerEnterRoomAction = () =&amp;gt;
        {
            this.SetEnterKnightNickname();
            this.txtRoomPlayerCount.text = string.Format(&quot;{0}/{1}&quot;,
                PhotonNetwork.CurrentRoom.PlayerCount - 1, PhotonNetwork.CurrentRoom.MaxPlayers - 1); //거인 제외 
        };

        NetworkManager.instance.onPlayerLeaveRoomAction = () =&amp;gt;
        {
            this.SetLeaveKnightNickname(); 
            this.txtRoomPlayerCount.text = string.Format(&quot;{0}/{1}&quot;,
                PhotonNetwork.CurrentRoom.PlayerCount - 1, PhotonNetwork.CurrentRoom.MaxPlayers - 1); //거인 제외
        };
    }
    private void SetGiantNickname()
    {
        this.txtGiantNickname.text = PhotonNetwork.MasterClient.NickName;
    }
    private void SetEnterKnightNickname()
    {
        List&amp;lt;Player&amp;gt; players = new List&amp;lt;Player&amp;gt;();

        foreach (var pair in PhotonNetwork.CurrentRoom.Players)
        {
            var player = pair.Value;
            if (player.IsMasterClient == false)
            {
                players.Add(player); //마스터 제외하고 리스트에 넣기 
            }
        }

        for (int i = 0; i &amp;lt; players.Count; i++)
        {
            var player = players[i];    
            this.txtKngihtNickname[i].text = player.NickName; //닉네임 세팅 
        }      
    }

    private void SetLeaveKnightNickname()
    {
        foreach(var playerNickname in this.txtKngihtNickname)//전부 닉네임 초기화 
        {
            playerNickname.text = string.Format(&quot;Empty&quot;);  
           
        }
        //초기화 하고 위에서 부터 다시 세팅 
        List&amp;lt;Player&amp;gt; players = new List&amp;lt;Player&amp;gt;();

        foreach (var pair in PhotonNetwork.CurrentRoom.Players)
        {
            var player = pair.Value;
            if (player.IsMasterClient == false)
            {
                players.Add(player); //마스터 제외하고 리스트에 넣기 
            }
        }

        for (int i = 0; i &amp;lt; players.Count; i++)
        {
            var player = players[i];
            this.txtKngihtNickname[i].text = player.NickName; //닉네임 세팅 
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들어오는 순간 거인의 닉네임 (정확히는 마스터 클라이언트)을 받아&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 상에 적용하는 역할을 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, PC 플레이어가 나가고 들어옴에 따라 화면을 갱신합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Leave Room 키를 누르면 서버와의 연결을 끊고, 처음 씬으로 돌아갑니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;마지막으로 서버와의 연결을 담당하는 NetworkManager입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702891267128&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Photon.Pun;
using Photon.Realtime;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class NetworkManager : MonoBehaviourPunCallbacks
{
    private readonly string version = &quot;1.0.0&quot;;
    public static NetworkManager instance;

    public Action&amp;lt;string&amp;gt; onJoinRoomRequest;
    public Action onJoinRoomAction;
    public Action onPlayerEnterRoomAction;
    public Action  onPlayerLeaveRoomAction;
  
    private bool isVR = false;

    private void Awake()
    {
        if (instance != null &amp;amp;&amp;amp; instance != this)
        {
            Destroy(this.gameObject);
        }
        else
        {
            DontDestroyOnLoad(this.gameObject);
            NetworkManager.instance = this;
        }
        
        this.onJoinRoomRequest = (roomCode) =&amp;gt;
        {
            PhotonNetwork.JoinRoom(roomCode);
        };
    }

    public void ConnectPC(string nickName)
    {
        if (!PhotonNetwork.IsConnected)
        {
            PhotonNetwork.AutomaticallySyncScene = true;
            PhotonNetwork.GameVersion = this.version;
            PhotonNetwork.NickName = nickName;
            PhotonNetwork.ConnectUsingSettings();
            this.isVR = false;
        }
    }

    public void ConnectVR(string nickName)
    {
        if (!PhotonNetwork.IsConnected)
        {
            Debug.Log(&quot;&amp;lt;color=red&amp;gt;VR 연결!&amp;lt;/color&amp;gt;&quot;);
            PhotonNetwork.AutomaticallySyncScene = true;
            PhotonNetwork.GameVersion = this.version;
            PhotonNetwork.NickName = nickName;
            PhotonNetwork.ConnectUsingSettings();
            this.isVR = true;
        }
    }

    public override void OnConnectedToMaster()
    {
        Debug.Log(&quot;마스터 서버에 접속&quot;);
        if(PhotonNetwork.IsConnected) PhotonNetwork.JoinLobby();
    }

    public override void OnJoinedLobby()
    {
        Debug.Log(&quot;로비에 접속&quot;);
        if (this.isVR)
        {
            this.CreateRoom();
        }
        else
        {
            this.JoinLobbyScene();
        }
    }

    public override void OnJoinedRoom()
    {
        Debug.Log(&quot;룸에 접속&quot;);
        SceneManager.LoadSceneAsync(&quot;RoomScene&quot;);
        Debug.LogFormat(&quot;방 이름: {0}&quot;, PhotonNetwork.CurrentRoom.Name);
        Debug.LogFormat(&quot;방 접속자 수: {0}&quot;, PhotonNetwork.CurrentRoom.PlayerCount);
    }

    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
        Debug.LogFormat(&quot;방에 접속한 인원:{0}&quot;, PhotonNetwork.CurrentRoom.PlayerCount);
        this.onPlayerEnterRoomAction();
    }

    public override void OnPlayerLeftRoom(Player otherPlayer)
    {
        Debug.LogFormat(&quot;방을 나간 인원:{0}&quot;, PhotonNetwork.CurrentRoom.PlayerCount);
        this.onPlayerLeaveRoomAction();
    }

    public override void OnMasterClientSwitched(Player newMasterClient)
    {
        PhotonNetwork.Disconnect();
    }

    public override void OnDisconnected(DisconnectCause cause)
    {
        Debug.Log(&quot;Disconnected from server. Cause: &quot; + cause);
        Debug.Log(&quot;연결 끊김!&quot;);
        SceneManager.LoadScene(&quot;FirstScene&quot;);
    }

    public void CloseRoom()
    {
        if (PhotonNetwork.IsConnected)  PhotonNetwork.Disconnect();
    }
    private void JoinLobbyScene()
    {
        SceneManager.LoadSceneAsync(&quot;LobbyScene&quot;);
    }
    private void CreateRoom()
    {
        int rndRoomCode = UnityEngine.Random.Range(1000, 10000); //1000에서 9999까지의 숫자 랜덤 생성 
        RoomOptions options = new RoomOptions();
        options.MaxPlayers = 5;
        options.IsOpen = true;
        options.IsVisible = false;
        PhotonNetwork.CreateRoom(rndRoomCode.ToString(), options);
    }

    public void StartGame()
    {
        SceneManager.LoadSceneAsync(&quot;GameScene&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 방을 연결하는 로직이 완료 되었습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>CGV(Castle Giant Virtual) 프로젝트 일지</category>
      <category>OVR</category>
      <category>VR</category>
      <category>가상현실</category>
      <category>멀티플레이</category>
      <category>유니티</category>
      <category>팀프로젝트</category>
      <category>포트폴리오</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/213</guid>
      <comments>https://easycastleunity.tistory.com/213#entry213comment</comments>
      <pubDate>Mon, 18 Dec 2023 18:22:08 +0900</pubDate>
    </item>
    <item>
      <title>CGV 개발일지 13 (중간정리)</title>
      <link>https://easycastleunity.tistory.com/212</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://easycastleunity.tistory.com/206&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702548239800&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;CGV 개발일지 7 (주제 변경)&quot; data-og-description=&quot;팀원들과의 회의와 여러가지로 시연해 본 결과, 여태까지 생각했던 시나리오를 그대로 만드는 경우, 사용자에게 멀미를 일으킬 수 있다는 결론이 나와 주제를 변경해 보기로 하였습니다. 기본 &quot; data-og-host=&quot;easycastleunity.tistory.com&quot; data-og-source-url=&quot;https://easycastleunity.tistory.com/206&quot; data-og-url=&quot;https://easycastleunity.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XEH79/hyULUjlxIn/3s4eRpPAH8AwEioDtGZqaK/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/bZg92o/hyUL6c3Mdb/ptRz9He8ipgWUhUIrqP9Jk/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/pgfAg/hyUL4lYX7n/uLIqg3bLZjZohXICFqscb0/img.png?width=1840&amp;amp;height=1013&amp;amp;face=0_0_1840_1013&quot;&gt;&lt;a href=&quot;https://easycastleunity.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://easycastleunity.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XEH79/hyULUjlxIn/3s4eRpPAH8AwEioDtGZqaK/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/bZg92o/hyUL6c3Mdb/ptRz9He8ipgWUhUIrqP9Jk/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/pgfAg/hyUL4lYX7n/uLIqg3bLZjZohXICFqscb0/img.png?width=1840&amp;amp;height=1013&amp;amp;face=0_0_1840_1013');&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;CGV 개발일지 7 (주제 변경)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;팀원들과의 회의와 여러가지로 시연해 본 결과, 여태까지 생각했던 시나리오를 그대로 만드는 경우, 사용자에게 멀미를 일으킬 수 있다는 결론이 나와 주제를 변경해 보기로 하였습니다. 기본&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;easycastleunity.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주제를 변경하면서 R&amp;amp;D 목록을 새로 작성하고 리스트업 했었습니다.&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;로드맵 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 전에 작성한 프로젝트 로드맵 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TNuBE/btsB2tD4QKB/AT4PRSMLLYg5KWDrhWzfkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TNuBE/btsB2tD4QKB/AT4PRSMLLYg5KWDrhWzfkk/img.png&quot; data-alt=&quot;VR 로드맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TNuBE/btsB2tD4QKB/AT4PRSMLLYg5KWDrhWzfkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTNuBE%2FbtsB2tD4QKB%2FAT4PRSMLLYg5KWDrhWzfkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1622&quot; height=&quot;795&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VR 로드맵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r1A1K/btsBYbLuR2E/zbK7QJ1AypgwMxkPYRT7x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r1A1K/btsBYbLuR2E/zbK7QJ1AypgwMxkPYRT7x0/img.png&quot; data-alt=&quot;PC 로드맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r1A1K/btsBYbLuR2E/zbK7QJ1AypgwMxkPYRT7x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr1A1K%2FbtsBYbLuR2E%2FzbK7QJ1AypgwMxkPYRT7x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;508&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC 로드맵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Qwe4/btsBXIpC0e0/kFhYxQvUriWaAkTcNawUKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Qwe4/btsBXIpC0e0/kFhYxQvUriWaAkTcNawUKk/img.png&quot; data-alt=&quot;멀티 로드맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Qwe4/btsBXIpC0e0/kFhYxQvUriWaAkTcNawUKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Qwe4%2FbtsBXIpC0e0%2FkFhYxQvUriWaAkTcNawUKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;494&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멀티 로드맵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsVxY/btsBXPPBcnY/UO5XQMO0NLJqOirLbboD01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsVxY/btsBXPPBcnY/UO5XQMO0NLJqOirLbboD01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsVxY/btsBXPPBcnY/UO5XQMO0NLJqOirLbboD01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsVxY%2FbtsBXPPBcnY%2FUO5XQMO0NLJqOirLbboD01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;466&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;466&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;1065&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyXx0A/btsB2v9LAvy/4tzB3k94LKnNEj9ntuKZMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyXx0A/btsB2v9LAvy/4tzB3k94LKnNEj9ntuKZMK/img.png&quot; data-alt=&quot;VR 현 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyXx0A/btsB2v9LAvy/4tzB3k94LKnNEj9ntuKZMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyXx0A%2FbtsB2v9LAvy%2F4tzB3k94LKnNEj9ntuKZMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1065&quot; height=&quot;500&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VR 현 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duGjM6/btsB3emoAsI/B7VQeaF3RVemtQTXVjxzHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duGjM6/btsB3emoAsI/B7VQeaF3RVemtQTXVjxzHk/img.png&quot; data-alt=&quot;PC 현 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duGjM6/btsB3emoAsI/B7VQeaF3RVemtQTXVjxzHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduGjM6%2FbtsB3emoAsI%2FB7VQeaF3RVemtQTXVjxzHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;534&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC 현 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1incw/btsB2uiGXDp/ScUEzOuNzW86FJG1BKo1tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1incw/btsB2uiGXDp/ScUEzOuNzW86FJG1BKo1tK/img.png&quot; data-alt=&quot;멀티 현 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1incw/btsB2uiGXDp/ScUEzOuNzW86FJG1BKo1tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1incw%2FbtsB2uiGXDp%2FScUEzOuNzW86FJG1BKo1tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;488&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멀티 현 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 작성한 로드맵에서 많은 부분을 구현하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;R&amp;amp;D 리스트&lt;/b&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;430&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IKr2t/btsBZGEnxfd/YAbDQ5WrM66BCDNgTjOJR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IKr2t/btsBZGEnxfd/YAbDQ5WrM66BCDNgTjOJR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IKr2t/btsBZGEnxfd/YAbDQ5WrM66BCDNgTjOJR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIKr2t%2FbtsBZGEnxfd%2FYAbDQ5WrM66BCDNgTjOJR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;351&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;351&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;405&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bErxOo/btsB1NJBpC4/iWaNemDGKLMPA6BKPkY5aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bErxOo/btsB1NJBpC4/iWaNemDGKLMPA6BKPkY5aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bErxOo/btsB1NJBpC4/iWaNemDGKLMPA6BKPkY5aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbErxOo%2FbtsB1NJBpC4%2FiWaNemDGKLMPA6BKPkY5aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;248&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;248&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;455&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUkAoe/btsB2ubV1Lw/hpspjRgzLT78m8lwkilMk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUkAoe/btsB2ubV1Lw/hpspjRgzLT78m8lwkilMk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUkAoe/btsB2ubV1Lw/hpspjRgzLT78m8lwkilMk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUkAoe%2FbtsB2ubV1Lw%2FhpspjRgzLT78m8lwkilMk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;305&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 크게 3가지 R&amp;amp;D 리스트를 가지고 있고, 현 상황을 표시해 보겠습니다.&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;size18&quot;&gt;&lt;b&gt;현 상황&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAUzFn/btsB1DgaonL/mxqg3YcmzuR6ol57ZYWJdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAUzFn/btsB1DgaonL/mxqg3YcmzuR6ol57ZYWJdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAUzFn/btsB1DgaonL/mxqg3YcmzuR6ol57ZYWJdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAUzFn%2FbtsB1DgaonL%2Fmxqg3YcmzuR6ol57ZYWJdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;347&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;347&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;322&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5zgOm/btsBXK8rEfu/fdCIuDRyBRpMioQ6SNdekk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5zgOm/btsBXK8rEfu/fdCIuDRyBRpMioQ6SNdekk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5zgOm/btsBXK8rEfu/fdCIuDRyBRpMioQ6SNdekk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5zgOm%2FbtsBXK8rEfu%2FfdCIuDRyBRpMioQ6SNdekk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;322&quot; height=&quot;249&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;249&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;543&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwwHik/btsB1wnZc66/dT2gIK4D4ug7Ghw4AvW2tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwwHik/btsB1wnZc66/dT2gIK4D4ug7Ghw4AvW2tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwwHik/btsB1wnZc66/dT2gIK4D4ug7Ghw4AvW2tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwwHik%2FbtsB1wnZc66%2FdT2gIK4D4ug7Ghw4AvW2tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;371&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 설정한 R&amp;amp;D 요소도 많이 구현이 되었습니다.&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;size18&quot;&gt;&lt;b&gt;중간정리 시연영상&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&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;size18&quot;&gt;&lt;b&gt;자체 총평&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능적으로는 많이 구현되었지만, 자잘한 부분에서 생기는 오류들이 많아 고쳐야 되고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 Asset을 가져와, 연출 및 애니메이션 동기화도 해보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이제는 게임의 한 사이클을 돌리는 것을 목표로 하려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;(로비에 접속하고 방으로 들어가서, 같이 게임씬으로 넘어가는 것)&lt;/b&gt;&lt;/i&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;기능적으로 R&amp;amp;D할 요소는 거의 끝내서, 이제 전체적으로 게임으로 보이게 하는 것이 중요하다고 생각합니다.&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;size18&quot;&gt;&lt;b&gt;향후 일정&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12/ 18 ~ 12 / 20 : 게임의 한 사이클 돌려보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12 / 21 ~ 12 /&amp;nbsp; 22: 현재 일어나고 있는 자잘한 오류 및 버그 해결&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12 / 26 ~ 12 / 29 : 리소스등을 찾고 적용하여, 게임 한 사이클 돌려보기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;01 / 02 ~ 01/ 05 :&amp;nbsp; 퀄업하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;01 / 08 ~ 01/ 12 : 프로젝트 전체적인 점검, 프로젝트 마무리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;01/ 15 ~ 01/ 18 : 문서 작업과 시연 및 발표 준비&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;01/ 19 : 최종 시연 및 발표&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>CGV(Castle Giant Virtual) 프로젝트 일지</category>
      <category>OVR</category>
      <category>VR</category>
      <category>가상현실</category>
      <category>멀티플레이</category>
      <category>유니티</category>
      <category>팀 프로젝트</category>
      <category>포트폴리오</category>
      <author>EasyCastleT</author>
      <guid isPermaLink="true">https://easycastleunity.tistory.com/212</guid>
      <comments>https://easycastleunity.tistory.com/212#entry212comment</comments>
      <pubDate>Thu, 14 Dec 2023 19:35:49 +0900</pubDate>
    </item>
  </channel>
</rss>