<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 꿀팁 블로그</title>
    <link>https://parksh3641.tistory.com/</link>
    <description>개발에 필요한 핵심 코드만을 정리하여 모아놓은 개발 꿀팁 블로그. 유니티, Unity C# , Flutter, Dart , Android, iOS, Playfab, Firebase, Photon, Xcode, Unirx, Unitask, Swift, 모바일, 빌드, APK, aab, SPNK, 윈드체스, 야미러시, 브레인부스트, 비둘기의 모험, 인디게임, 뒤끝서버, 플레이팹, 깨면 레전드, Super Hard Game</description>
    <language>ko</language>
    <pubDate>Mon, 8 Jun 2026 17:53:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SPNK</managingEditor>
    <image>
      <title>개발 꿀팁 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5418466/attach/ca0c7f9f7b904957b9aab5caa46c124c</url>
      <link>https://parksh3641.tistory.com</link>
    </image>
    <item>
      <title>링크드인 언팔로우 빠르게 자동으로 하는 방법 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A7%81%ED%81%AC%EB%93%9C%EC%9D%B8-%EC%96%B8%ED%8C%94%EB%A1%9C%EC%9A%B0-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/625Xr/btsPB1VBYQ6/ChAoTwtIMQPvwGlTQPnYEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/625Xr/btsPB1VBYQ6/ChAoTwtIMQPvwGlTQPnYEK/img.png&quot; data-alt=&quot;링크드인 언팔로우 빠르게 자동으로 하는 방법 간단 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/625Xr/btsPB1VBYQ6/ChAoTwtIMQPvwGlTQPnYEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F625Xr%2FbtsPB1VBYQ6%2FChAoTwtIMQPvwGlTQPnYEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;링크드인 언팔로우 빠르게 자동으로 하는 방법 간단 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;링크드인&amp;nbsp;언팔로우&amp;nbsp;빠르게&amp;nbsp;자동으로&amp;nbsp;하는&amp;nbsp;방법&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개발자 도구 열기&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;F12키 누르기 또는 우클릭 &amp;rarr; 검사(Inspect)&lt;/li&gt;
&lt;li&gt;Console 탭으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 경고 해제&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;붙여넣기 허용&quot; 문구 입력하고 Enter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스크립트 실행&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 업데이트된 코드 복사하여 붙여넣기&lt;/li&gt;
&lt;li&gt;Enter키 누르기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753672417508&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(() =&amp;gt; {
  let count = 0;
  let isRunning = false;
  
  function findFollowingButtons() {
    const buttons = [];
    const allButtons = document.querySelectorAll('button');
    
    allButtons.forEach(btn =&amp;gt; {
      const text = btn.textContent.trim();
      const ariaLabel = btn.getAttribute('aria-label') || '';
      
      if (text === '팔로우중' || 
          text === 'Following' || 
          ariaLabel.includes('팔로우중') ||
          ariaLabel.includes('언팔로우') ||
          ariaLabel.includes('stop following')) {
        buttons.push(btn);
      }
    });
    
    return buttons;
  }
  
  async function scrollAndUnfollow() {
    if (!isRunning) return;
    
    const buttons = findFollowingButtons();
    console.log(`현재 페이지에서 발견된 팔로우중 버튼: ${buttons.length}개`);
    
    for (let button of buttons) {
      if (!isRunning) break;
      
      try {
        count++;
        const buttonText = button.textContent.trim();
        const ariaLabel = button.getAttribute('aria-label') || '';
        
        let personName = '알 수 없음';
        if (ariaLabel) {
          personName = ariaLabel.replace(/클릭해서|팔로우중|stop following|Click to/g, '').trim();
        }
        
        console.log(`#${count} 언팔로우 중: ${personName}`);
        
        button.scrollIntoView({ behavior: 'smooth', block: 'center' });
        await new Promise(resolve =&amp;gt; setTimeout(resolve, 300));
        
        button.click();
        await new Promise(resolve =&amp;gt; setTimeout(resolve, 500));
        
      } catch (error) {
        console.log('버튼 클릭 중 오류:', error);
      }
    }
    
    const currentScrollY = window.scrollY;
    window.scrollBy(0, 800);
    await new Promise(resolve =&amp;gt; setTimeout(resolve, 1000));
    
    const newScrollY = window.scrollY;
    if (newScrollY === currentScrollY) {
      console.log('페이지 끝에 도달했습니다.');
      console.log(`총 ${count}명 언팔로우 완료!`);
      isRunning = false;
      
      if (confirm(`완료! 총 ${count}명을 언팔로우했습니다. 페이지를 새로고침하시겠습니까?`)) {
        location.reload();
      }
      return;
    }
    
    await new Promise(resolve =&amp;gt; setTimeout(resolve, 1000));
    scrollAndUnfollow();
  }
  
  function stopScript() {
    isRunning = false;
    console.log('스크립트가 중단되었습니다.');
  }
  
  function startScript() {
    if (isRunning) {
      console.log('이미 실행 중입니다.');
      return;
    }
    
    isRunning = true;
    console.log('자동 언팔로우 시작...');
    console.log('중단하려면 stopScript() 를 입력하세요.');
    scrollAndUnfollow();
  }
  
  window.stopScript = stopScript;
  
  if (confirm('자동으로 스크롤하면서 모든 팔로우를 끊으시겠습니까?\n\n주의: 이 작업은 되돌릴 수 없습니다.')) {
    startScript();
  } else {
    console.log('언팔로우를 시작하려면 다음을 입력하세요:');
    console.log('(() =&amp;gt; { 위 코드 })()');
    console.log('또는 startScript() 함수를 실행하세요.');
  }
})();&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/611</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A7%81%ED%81%AC%EB%93%9C%EC%9D%B8-%EC%96%B8%ED%8C%94%EB%A1%9C%EC%9A%B0-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry611comment</comments>
      <pubDate>Mon, 28 Jul 2025 12:14:33 +0900</pubDate>
    </item>
    <item>
      <title>유니티 플레이팹 플레이어 밴 시스템 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8C%B9-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EB%B0%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdEdOf/btsPBFyrZUk/K1qJQlQq6KQDDcnkacMTQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdEdOf/btsPBFyrZUk/K1qJQlQq6KQDDcnkacMTQ1/img.png&quot; data-alt=&quot;유니티 플레이팹 플레이어 밴 시스템 간단 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdEdOf/btsPBFyrZUk/K1qJQlQq6KQDDcnkacMTQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdEdOf%2FbtsPBFyrZUk%2FK1qJQlQq6KQDDcnkacMTQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 플레이팹 플레이어 밴 시스템 간단 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;플레이팹&amp;nbsp;플레이어&amp;nbsp;밴&amp;nbsp;시스템&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;pre id=&quot;code_1753670231621&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;

public class PlayFabBanSystem : MonoBehaviour
{
    public static PlayFabBanSystem Instance;
    
    [Header(&quot;플레이팹 설정&quot;)]
    public string titleId = &quot;YOUR_TITLE_ID&quot;;
    
    // 현재 플레이어 상태
    public bool isLoggedIn { get; private set; }
    public bool isBanned { get; private set; }
    public string banReason { get; private set; }
    public DateTime? banExpiration { get; private set; }

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            PlayFabSettings.TitleId = titleId;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // 이메일로 로그인
    public void LoginWithEmail(string email, string password)
    {
        var request = new LoginWithEmailAddressRequest
        {
            Email = email,
            Password = password
        };

        PlayFabClientAPI.LoginWithEmailAddress(request, OnLoginSuccess, OnLoginError);
    }

    // 익명 로그인 (게스트)
    public void LoginAnonymous()
    {
        var request = new LoginWithCustomIDRequest
        {
            CustomId = SystemInfo.deviceUniqueIdentifier,
            CreateAccount = true
        };

        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginError);
    }

    // 스팀 로그인
    public void LoginWithSteam(string steamTicket)
    {
        var request = new LoginWithSteamRequest
        {
            SteamTicket = steamTicket,
            CreateAccount = true
        };

        PlayFabClientAPI.LoginWithSteam(request, OnLoginSuccess, OnLoginError);
    }

    // 로그인 성공 콜백
    void OnLoginSuccess(LoginResult result)
    {
        Debug.Log(&quot;로그인 성공!&quot;);
        isLoggedIn = true;
        
        // 로그인 후 자동으로 차단 상태 확인
        CheckBanStatus();
    }

    // 로그인 실패 콜백
    void OnLoginError(PlayFabError error)
    {
        Debug.LogError($&quot;로그인 실패: {error.ErrorMessage}&quot;);
        isLoggedIn = false;
    }

    // 현재 플레이어의 차단 상태 확인
    public void CheckBanStatus()
    {
        if (!isLoggedIn)
        {
            Debug.LogWarning(&quot;로그인이 필요합니다.&quot;);
            return;
        }

        // 플레이어 프로필 정보 요청 (차단 정보 포함)
        var request = new GetPlayerProfileRequest
        {
            PlayFabId = null, // null이면 현재 로그인된 플레이어
            ProfileConstraints = new PlayerProfileViewConstraints
            {
                ShowBannedUntil = true,
                ShowStatistics = false,
                ShowTags = false
            }
        };

        PlayFabClientAPI.GetPlayerProfile(request, OnGetProfileSuccess, OnGetProfileError);
    }

    // 프로필 정보 받기 성공
    void OnGetProfileSuccess(GetPlayerProfileResult result)
    {
        var profile = result.PlayerProfile;
        
        if (profile.BannedUntil.HasValue)
        {
            DateTime banUntil = profile.BannedUntil.Value;
            DateTime now = DateTime.UtcNow;
            
            if (banUntil &amp;gt; now)
            {
                // 현재 차단 상태
                isBanned = true;
                banExpiration = banUntil;
                banReason = &quot;차단된 계정입니다.&quot;;
                
                Debug.LogWarning($&quot;계정이 차단되었습니다. 해제 시간: {banUntil}&quot;);
                OnPlayerBanned();
            }
            else
            {
                // 차단 기간 만료
                isBanned = false;
                banExpiration = null;
                banReason = null;
                Debug.Log(&quot;계정이 정상 상태입니다.&quot;);
            }
        }
        else
        {
            // 차단된 적 없음
            isBanned = false;
            banExpiration = null;
            banReason = null;
            Debug.Log(&quot;계정이 정상 상태입니다.&quot;);
        }
    }

    // 프로필 정보 받기 실패
    void OnGetProfileError(PlayFabError error)
    {
        Debug.LogError($&quot;프로필 정보 가져오기 실패: {error.ErrorMessage}&quot;);
    }

    // 차단된 플레이어 처리
    void OnPlayerBanned()
    {
        // 게임 종료 또는 메인 메뉴로 이동
        Debug.LogError(&quot;차단된 계정으로 게임을 진행할 수 없습니다.&quot;);
        
        // 여기에 차단 UI 표시 로직 추가
        ShowBanMessage();
    }

    // 차단 메시지 표시
    void ShowBanMessage()
    {
        string message = $&quot;계정이 차단되었습니다.\n&quot;;
        
        if (banExpiration.HasValue)
        {
            TimeSpan remaining = banExpiration.Value - DateTime.UtcNow;
            message += $&quot;해제까지 남은 시간: {remaining.Days}일 {remaining.Hours}시간 {remaining.Minutes}분&quot;;
        }
        else
        {
            message += &quot;영구 차단&quot;;
        }
        
        Debug.LogWarning(message);
        
        // UI로 메시지 표시하는 코드 추가 가능
        // GameManager.Instance.ShowBanDialog(message);
    }

    // 계정 상태 정보 반환
    public BanInfo GetBanInfo()
    {
        return new BanInfo
        {
            isBanned = this.isBanned,
            reason = this.banReason,
            expiration = this.banExpiration
        };
    }

    // 차단 정보 확인 (정기적으로 호출 가능)
    public void RefreshBanStatus()
    {
        CheckBanStatus();
    }

    // 로그아웃
    public void Logout()
    {
        isLoggedIn = false;
        isBanned = false;
        banReason = null;
        banExpiration = null;
        
        Debug.Log(&quot;로그아웃 완료&quot;);
    }

    // 게임 시작 전 차단 상태 체크
    public bool CanStartGame()
    {
        if (!isLoggedIn)
        {
            Debug.LogWarning(&quot;로그인이 필요합니다.&quot;);
            return false;
        }
        
        if (isBanned)
        {
            Debug.LogWarning(&quot;차단된 계정은 게임을 시작할 수 없습니다.&quot;);
            ShowBanMessage();
            return false;
        }
        
        return true;
    }

    // 주기적으로 차단 상태 확인 (옵션)
    void Start()
    {
        // 5분마다 차단 상태 확인
        InvokeRepeating(nameof(RefreshBanStatus), 0f, 300f);
    }
}

// 차단 정보 구조체
[System.Serializable]
public struct BanInfo
{
    public bool isBanned;
    public string reason;
    public DateTime? expiration;
    
    public bool IsPermanent =&amp;gt; isBanned &amp;amp;&amp;amp; !expiration.HasValue;
    
    public TimeSpan GetRemainingTime()
    {
        if (!isBanned || !expiration.HasValue)
            return TimeSpan.Zero;
            
        return expiration.Value - DateTime.UtcNow;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/플레이팹 (Playfab)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/610</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8C%B9-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EB%B0%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry610comment</comments>
      <pubDate>Mon, 28 Jul 2025 11:37:17 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 코딩 테스트 사이트 총 정리</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B4%9D-%EC%A0%95%EB%A6%AC</link>
      <description>&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;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TCkUd/btsPBHiIrfD/PFPnDJ41i79Mt2DNtV9KHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TCkUd/btsPBHiIrfD/PFPnDJ41i79Mt2DNtV9KHk/img.png&quot; data-alt=&quot;유니티 C# 코딩 테스트 사이트 총 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TCkUd/btsPBHiIrfD/PFPnDJ41i79Mt2DNtV9KHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTCkUd%2FbtsPBHiIrfD%2FPFPnDJ41i79Mt2DNtV9KHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;400&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 C# 코딩 테스트 사이트 총 정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;코딩&amp;nbsp;테스트&amp;nbsp;사이트&amp;nbsp;총&amp;nbsp;정리&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;초보자 (입문~기초)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 사이트명 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;추천 이유&lt;/td&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;언어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프로그래머스 코딩테스트 입문&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/challenges/beginner&quot;&gt;https://school.programmers.co.kr/learn/challenges/beginner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 카카오 기출문제&lt;/td&gt;
&lt;td&gt;입문자를 위한 쉬운 문제부터 단계별 제공&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;td&gt;Python, Java, JS 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CodeUp&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://codeup.kr/index.php&quot;&gt;https://codeup.kr/index.php&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 중고등학교 대상&lt;/td&gt;
&lt;td&gt;매우 기초적인 문법 연습에 최적&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;td&gt;C, C++, Python, Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;HackerRank&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.hackerrank.com/&quot;&gt;https://www.hackerrank.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 강좌 형식 제공&lt;/td&gt;
&lt;td&gt;알고리즘과 자료구조를 체계적으로 학습 가능&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;40+ 언어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Codewars&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.codewars.com/&quot;&gt;https://www.codewars.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8급부터 시작, 게임화&lt;/td&gt;
&lt;td&gt;재미있는 문제들로 코딩 실력 향상&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 사이트명 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;추천 이유&lt;/td&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;언어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프로그래머스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://programmers.co.kr/learn/challenges&quot;&gt;https://programmers.co.kr/learn/challenges&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 카카오/네이버 기출&lt;/td&gt;
&lt;td&gt;국내 취업 코딩테스트 대비 최적&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Python, Java, JS, C++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;백준 온라인 저지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.acmicpc.net/&quot;&gt;https://www.acmicpc.net/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 방대한 문제 수&lt;/td&gt;
&lt;td&gt;단계별로 풀어보기, 알고리즘 분류별 학습&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;거의 모든 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SW Expert Academy&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://swexpertacademy.com/&quot;&gt;https://swexpertacademy.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 삼성 공식&lt;/td&gt;
&lt;td&gt;삼성 SW역량테스트 대비&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;C++, Java, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구름 LEVEL&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://level.goorm.io/&quot;&gt;https://level.goorm.io/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;한국어, 기업 연계&lt;/td&gt;
&lt;td&gt;LG전자, NHN 등 기업 코딩테스트 환경&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LeetCode&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://leetcode.com/&quot;&gt;https://leetcode.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 기업 인터뷰 문제&lt;/td&gt;
&lt;td&gt;해외 취업, 알고리즘 핵심 개념 학습&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;18개 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 사이트명 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;추천 이유&lt;/td&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;언어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Codeforces&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://codeforces.com/&quot;&gt;https://codeforces.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 정기 대회 개최&lt;/td&gt;
&lt;td&gt;세계 최고 수준의 경쟁 프로그래밍 플랫폼&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;C++, Java, Python 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;AtCoder&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://atcoder.jp/&quot;&gt;https://atcoder.jp/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어/일본어, 고품질 문제&lt;/td&gt;
&lt;td&gt;일본 최고 수준, 문제 퀄리티 매우 높음&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;TopCoder&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.topcoder.com/&quot;&gt;https://www.topcoder.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 개인전 5시간 3문제&lt;/td&gt;
&lt;td&gt;전통적인 고수 플랫폼, 사고력 중시&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Java, C++, C#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SPOJ&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.spoj.com/&quot;&gt;https://www.spoj.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 20,000+ 문제&lt;/td&gt;
&lt;td&gt;방대한 문제 수, 다양한 난이도&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;60+ 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CodeChef&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.codechef.com/&quot;&gt;https://www.codechef.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 인도 기반&lt;/td&gt;
&lt;td&gt;월별 Long Challenge, 다양한 대회&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;35+ 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 사이트명 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;대상 기업&lt;/td&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;언어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Codility&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://app.codility.com/programmers/&quot;&gt;https://app.codility.com/programmers/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 실제 기업 테스트&lt;/td&gt;
&lt;td&gt;우아한형제들, 해외 스타트업&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CodeSignal&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://codesignal.com/&quot;&gt;https://codesignal.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 실시간 평가&lt;/td&gt;
&lt;td&gt;실제 채용 테스트 플랫폼&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;HackerEarth&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.hackerearth.com/&quot;&gt;https://www.hackerearth.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 기업 연계&lt;/td&gt;
&lt;td&gt;글로벌 기업 채용 플랫폼&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;40+ 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 사이트명 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;추천 이유&lt;/td&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Project Euler&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://projecteuler.net/&quot;&gt;https://projecteuler.net/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 수학 문제&lt;/td&gt;
&lt;td&gt;수학적 사고력 향상, 120문제&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;언어 무관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;USACO&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://usaco.org/&quot;&gt;https://usaco.org/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 미국 정보올림피아드&lt;/td&gt;
&lt;td&gt;체계적인 알고리즘 학습, 튜토리얼 제공&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;C++, Java, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Codility Lessons&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://codility.com/programmers/lessons/&quot;&gt;https://codility.com/programmers/lessons/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 무료 강의&lt;/td&gt;
&lt;td&gt;알고리즘 이론과 실습 병행&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;GeeksforGeeks&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/&quot;&gt;https://www.geeksforgeeks.org/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;영어, 이론+실습&lt;/td&gt;
&lt;td&gt;알고리즘 이론 학습과 문제 풀이&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;다양한 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/코딩 테스트 모음</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/609</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B4%9D-%EC%A0%95%EB%A6%AC#entry609comment</comments>
      <pubDate>Mon, 28 Jul 2025 11:33:11 +0900</pubDate>
    </item>
    <item>
      <title>사전예약부터 바이럴까지 인디게임 마케팅 핵심 프로세스</title>
      <link>https://parksh3641.tistory.com/entry/%EC%82%AC%EC%A0%84%EC%98%88%EC%95%BD%EB%B6%80%ED%84%B0-%EB%B0%94%EC%9D%B4%EB%9F%B4%EA%B9%8C%EC%A7%80-%EC%9D%B8%EB%94%94%EA%B2%8C%EC%9E%84-%EB%A7%88%EC%BC%80%ED%8C%85-%ED%95%B5%EC%8B%AC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UiLXT/btsPwy7kNCZ/esk61XznGITBjwp75RKyRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UiLXT/btsPwy7kNCZ/esk61XznGITBjwp75RKyRk/img.jpg&quot; data-alt=&quot;사전예약부터 바이럴까지 인디게임 마케팅 핵심 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UiLXT/btsPwy7kNCZ/esk61XznGITBjwp75RKyRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUiLXT%2FbtsPwy7kNCZ%2Fesk61XznGITBjwp75RKyRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;568&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사전예약부터 바이럴까지 인디게임 마케팅 핵심 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;73&quot; data-start=&quot;45&quot; data-ke-size=&quot;size26&quot;&gt;사전예약부터&amp;nbsp;바이럴까지&amp;nbsp;인디게임&amp;nbsp;마케팅&amp;nbsp;핵심&amp;nbsp;프로세스&lt;/h2&gt;
&lt;h2 data-end=&quot;73&quot; data-start=&quot;45&quot; data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;런칭 전 준비 (사전예약 중심)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;330&quot; data-start=&quot;74&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;133&quot; data-start=&quot;74&quot;&gt;&lt;b&gt;사전예약 오픈 및 홍보&lt;/b&gt;&lt;br /&gt;구글플레이, 원스토어, 사전예약 앱 등을 활용해 사전예약 모집&lt;/li&gt;
&lt;li data-end=&quot;200&quot; data-start=&quot;134&quot;&gt;&lt;b&gt;사전예약 이벤트 진행&lt;/b&gt;&lt;br /&gt;팔로워 부스팅, 참여 부스팅 이벤트, 친구 초대 이벤트 등으로 사전예약 유도&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;201&quot;&gt;&lt;b&gt;PR 및 무료 광고 활용&lt;/b&gt;&lt;br /&gt;보도자료, 블로그, 카페, 커뮤니티, 공식 레딧 등에서 사전예약 오픈 알림&lt;/li&gt;
&lt;li data-end=&quot;330&quot; data-start=&quot;269&quot;&gt;&lt;b&gt;파트너 크리에이터 및 인플루언서 모집&lt;/b&gt;&lt;br /&gt;초기 관심과 입소문 형성 위해 크리에이터 협업 준비&lt;/li&gt;
&lt;/ul&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-end=&quot;365&quot; data-start=&quot;337&quot; data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;런칭 직후 (런칭일~초기 정착)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;705&quot; data-start=&quot;366&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;426&quot; data-start=&quot;366&quot;&gt;&lt;b&gt;사전예약자 대상 보상 지급 및 고지&lt;/b&gt;&lt;br /&gt;게임에 대한 관심 유지 및 활성화를 위한 보상 제공&lt;/li&gt;
&lt;li data-end=&quot;495&quot; data-start=&quot;427&quot;&gt;&lt;b&gt;UA (유저 확보) 광고 본격 진행&lt;/b&gt;&lt;br /&gt;구글, 메타, 틱톡 등 주요 매체를 통한 광고로 유저 유입 극대화&lt;/li&gt;
&lt;li data-end=&quot;562&quot; data-start=&quot;496&quot;&gt;&lt;b&gt;런칭 이벤트 시작&lt;/b&gt;&lt;br /&gt;7일 출석, 스테이지 클리어, 배틀 패스, 다운로드 인증 등 이벤트로 참여 유도&lt;/li&gt;
&lt;li data-end=&quot;644&quot; data-start=&quot;563&quot;&gt;&lt;b&gt;커뮤니티 내 바이럴 활동 및 크리에이터 협업 확대&lt;/b&gt;&lt;br /&gt;공식 레딧, 유튜브, SNS 등에서 파트너 크리에이터와 협업하여 홍보 지속&lt;/li&gt;
&lt;li data-end=&quot;705&quot; data-start=&quot;645&quot;&gt;&lt;b&gt;스토어 순위 관리 및 업데이트 공지&lt;/b&gt;&lt;br /&gt;앱스토어 순위 달성 목표 및 첫 업데이트 정보 공유&lt;/li&gt;
&lt;/ul&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-end=&quot;739&quot; data-start=&quot;712&quot; data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;중장기 운영 (런칭 후 지속)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;906&quot; data-start=&quot;740&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;791&quot; data-start=&quot;740&quot;&gt;&lt;b&gt;상시 이벤트 유지&lt;/b&gt;&lt;br /&gt;출석, 배틀패스, 별점 이벤트 등으로 유저 참여 유지&lt;/li&gt;
&lt;li data-end=&quot;848&quot; data-start=&quot;792&quot;&gt;&lt;b&gt;커뮤니티 모니터링 및 피드백 반영&lt;/b&gt;&lt;br /&gt;유저 반응 확인 후 서비스 보완 및 소통 강화&lt;/li&gt;
&lt;li data-end=&quot;906&quot; data-start=&quot;849&quot;&gt;&lt;b&gt;크리에이터 및 커뮤니티 활성화 지속&lt;/b&gt;&lt;br /&gt;신규 콘텐츠 홍보와 함께 유저 기반 확대 노력&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/608</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%82%AC%EC%A0%84%EC%98%88%EC%95%BD%EB%B6%80%ED%84%B0-%EB%B0%94%EC%9D%B4%EB%9F%B4%EA%B9%8C%EC%A7%80-%EC%9D%B8%EB%94%94%EA%B2%8C%EC%9E%84-%EB%A7%88%EC%BC%80%ED%8C%85-%ED%95%B5%EC%8B%AC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4#entry608comment</comments>
      <pubDate>Thu, 24 Jul 2025 10:25:56 +0900</pubDate>
    </item>
    <item>
      <title>유니티 안드로이드 버전별 점유율 사용율 Api 2025년 7월 기준</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%A0%90%EC%9C%A0%EC%9C%A8-%EC%82%AC%EC%9A%A9%EC%9C%A8-Api-2025%EB%85%84-7%EC%9B%94-%EA%B8%B0%EC%A4%80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvSZp/btsPsZFczFZ/laeTX5jW3zhG9NedhnZWO0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvSZp/btsPsZFczFZ/laeTX5jW3zhG9NedhnZWO0/img.webp&quot; data-alt=&quot;유니티&amp;amp;nbsp;안드로이드&amp;amp;nbsp;버전별&amp;amp;nbsp;점유율&amp;amp;nbsp;사용율&amp;amp;nbsp;Api&amp;amp;nbsp;2024년&amp;amp;nbsp;7월&amp;amp;nbsp;기준&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvSZp/btsPsZFczFZ/laeTX5jW3zhG9NedhnZWO0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvSZp%2FbtsPsZFczFZ%2FlaeTX5jW3zhG9NedhnZWO0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티&amp;nbsp;안드로이드&amp;nbsp;버전별&amp;nbsp;점유율&amp;nbsp;사용율&amp;nbsp;Api&amp;nbsp;2024년&amp;nbsp;7월&amp;nbsp;기준&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;안드로이드&amp;nbsp;버전별&amp;nbsp;점유율&amp;nbsp;사용율&amp;nbsp;Api&amp;nbsp;2024년&amp;nbsp;7월&amp;nbsp;기준&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;472&quot; data-start=&quot;67&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;안드로이드 버전&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot;&gt;API Level&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot;&gt;점유율(%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;181&quot; data-start=&quot;140&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;157&quot; data-start=&quot;140&quot;&gt;Android 16&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;168&quot; data-start=&quot;157&quot; data-col-size=&quot;sm&quot;&gt;36&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;181&quot; data-start=&quot;168&quot; data-col-size=&quot;sm&quot;&gt;1.4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;223&quot; data-start=&quot;182&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;199&quot; data-start=&quot;182&quot;&gt;Android 15&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;210&quot; data-start=&quot;199&quot; data-col-size=&quot;sm&quot;&gt;35&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;223&quot; data-start=&quot;210&quot; data-col-size=&quot;sm&quot;&gt;20.9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;265&quot; data-start=&quot;224&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;241&quot; data-start=&quot;224&quot;&gt;Android 14&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;252&quot; data-start=&quot;241&quot; data-col-size=&quot;sm&quot;&gt;34&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;265&quot; data-start=&quot;252&quot; data-col-size=&quot;sm&quot;&gt;25.4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;307&quot; data-start=&quot;266&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;283&quot; data-start=&quot;266&quot;&gt;Android 13&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;294&quot; data-start=&quot;283&quot; data-col-size=&quot;sm&quot;&gt;33&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;307&quot; data-start=&quot;294&quot; data-col-size=&quot;sm&quot;&gt;17.3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;349&quot; data-start=&quot;308&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;325&quot; data-start=&quot;308&quot;&gt;Android 12&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;336&quot; data-start=&quot;325&quot; data-col-size=&quot;sm&quot;&gt;31 ~ 32&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;349&quot; data-start=&quot;336&quot; data-col-size=&quot;sm&quot;&gt;12.1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;391&quot; data-start=&quot;350&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;367&quot; data-start=&quot;350&quot;&gt;Android 11&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;378&quot; data-start=&quot;367&quot; data-col-size=&quot;sm&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;391&quot; data-start=&quot;378&quot; data-col-size=&quot;sm&quot;&gt;9.8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;433&quot; data-start=&quot;392&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;409&quot; data-start=&quot;392&quot;&gt;Android 10&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-end=&quot;420&quot; data-start=&quot;409&quot; data-col-size=&quot;sm&quot;&gt;29&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-end=&quot;433&quot; data-start=&quot;420&quot; data-col-size=&quot;sm&quot;&gt;5.1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;472&quot; data-start=&quot;434&quot;&gt;
&lt;td style=&quot;width: 32.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;449&quot; data-start=&quot;434&quot;&gt;Android 9 이하&lt;/td&gt;
&lt;td style=&quot;width: 31.7442%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;460&quot; data-start=&quot;449&quot;&gt;&amp;ndash;&lt;/td&gt;
&lt;td style=&quot;width: 35.3488%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;472&quot; data-start=&quot;460&quot;&gt;약 8.0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/유니티 에디터 꿀팁</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/604</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%A0%90%EC%9C%A0%EC%9C%A8-%EC%82%AC%EC%9A%A9%EC%9C%A8-Api-2025%EB%85%84-7%EC%9B%94-%EA%B8%B0%EC%A4%80#entry604comment</comments>
      <pubDate>Wed, 23 Jul 2025 10:50:27 +0900</pubDate>
    </item>
    <item>
      <title>웹 이미지 영상 생성 AI 추천 및 특징 정리 2025년 7월 기준</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9B%B9-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%98%81%EC%83%81-%EC%83%9D%EC%84%B1-AI-%EC%B6%94%EC%B2%9C-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC-2025%EB%85%84-7%EC%9B%94-%EA%B8%B0%EC%A4%80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpjefW/btsPtUwCgsz/4GC3VbYhjWo2pUZnKBvws1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpjefW/btsPtUwCgsz/4GC3VbYhjWo2pUZnKBvws1/img.png&quot; data-alt=&quot;웹 이미지 영상 생성 AI 추천 및 특징 정리 2025년 7월 기준&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpjefW/btsPtUwCgsz/4GC3VbYhjWo2pUZnKBvws1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpjefW%2FbtsPtUwCgsz%2F4GC3VbYhjWo2pUZnKBvws1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;446&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹 이미지 영상 생성 AI 추천 및 특징 정리 2025년 7월 기준&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;136&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;웹&amp;nbsp;이미지&amp;nbsp;영상&amp;nbsp;생성&amp;nbsp;AI&amp;nbsp;추천&amp;nbsp;및&amp;nbsp;특징&amp;nbsp;정리&amp;nbsp;2025년&amp;nbsp;7월&amp;nbsp;기준&lt;/h2&gt;
&lt;h2 data-end=&quot;136&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 이미지 생성형 AI&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;962&quot; data-start=&quot;138&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI 이름&lt;/td&gt;
&lt;td&gt;방식&lt;/td&gt;
&lt;td&gt;비고&lt;/td&gt;
&lt;td&gt;특징 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;513&quot; data-start=&quot;405&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;422&quot; data-start=&quot;405&quot;&gt;Midjourney&lt;/td&gt;
&lt;td data-end=&quot;439&quot; data-start=&quot;422&quot; data-col-size=&quot;sm&quot;&gt;텍스트 / 레퍼런스 이미지&lt;/td&gt;
&lt;td data-end=&quot;467&quot; data-start=&quot;439&quot; data-col-size=&quot;sm&quot;&gt;컨셉 아트 업계 표준&lt;/td&gt;
&lt;td data-end=&quot;513&quot; data-start=&quot;467&quot; data-col-size=&quot;sm&quot;&gt;강력한 EDIT 기능, 레퍼런스 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;622&quot; data-start=&quot;514&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;531&quot; data-start=&quot;514&quot;&gt;WHISK&lt;/td&gt;
&lt;td data-end=&quot;548&quot; data-start=&quot;531&quot; data-col-size=&quot;sm&quot;&gt;텍스트 / 레퍼런스 이미지&lt;/td&gt;
&lt;td data-end=&quot;580&quot; data-start=&quot;548&quot; data-col-size=&quot;sm&quot;&gt;실사 타입&lt;/td&gt;
&lt;td data-end=&quot;622&quot; data-start=&quot;580&quot; data-col-size=&quot;sm&quot;&gt;실사 높은 재현, 무료, 레퍼런스 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;735&quot; data-start=&quot;623&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;640&quot; data-start=&quot;623&quot;&gt;SORA&lt;/td&gt;
&lt;td data-end=&quot;657&quot; data-start=&quot;640&quot; data-col-size=&quot;sm&quot;&gt;텍스트 / 레퍼런스 이미지&lt;/td&gt;
&lt;td data-end=&quot;684&quot; data-start=&quot;657&quot; data-col-size=&quot;sm&quot;&gt;장면 특화, GPT 기반 요청&lt;/td&gt;
&lt;td data-end=&quot;735&quot; data-start=&quot;684&quot; data-col-size=&quot;sm&quot;&gt;높은 고증 반영, Remix 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;849&quot; data-start=&quot;736&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;753&quot; data-start=&quot;736&quot;&gt;Dezine&lt;/td&gt;
&lt;td data-end=&quot;770&quot; data-start=&quot;753&quot; data-col-size=&quot;sm&quot;&gt;텍스트 / 레퍼런스 이미지&lt;/td&gt;
&lt;td data-end=&quot;799&quot; data-start=&quot;770&quot; data-col-size=&quot;sm&quot;&gt;캐릭터 아트 특화&lt;/td&gt;
&lt;td data-end=&quot;849&quot; data-start=&quot;799&quot; data-col-size=&quot;sm&quot;&gt;동일성 유지에 특화됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;962&quot; data-start=&quot;850&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;867&quot; data-start=&quot;850&quot;&gt;Freepik AI&lt;/td&gt;
&lt;td data-end=&quot;886&quot; data-start=&quot;867&quot; data-col-size=&quot;sm&quot;&gt;텍스트 &amp;amp; 엔진 복합&lt;/td&gt;
&lt;td data-end=&quot;918&quot; data-start=&quot;886&quot; data-col-size=&quot;sm&quot;&gt;플랫폼형&lt;/td&gt;
&lt;td data-end=&quot;962&quot; data-start=&quot;918&quot; data-col-size=&quot;sm&quot;&gt;복수 AI를 단일 크레딧으로 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;990&quot; data-start=&quot;969&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 영상 생성형 AI&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2099&quot; data-start=&quot;992&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI 이름&lt;/td&gt;
&lt;td&gt;방식&lt;/td&gt;
&lt;td&gt;비고&lt;/td&gt;
&lt;td&gt;특징 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1438&quot; data-start=&quot;1303&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1318&quot; data-start=&quot;1303&quot;&gt;Midjourney&lt;/td&gt;
&lt;td data-end=&quot;1339&quot; data-start=&quot;1318&quot; data-col-size=&quot;sm&quot;&gt;프롬프트 + 이미지&lt;/td&gt;
&lt;td data-end=&quot;1375&quot; data-start=&quot;1339&quot; data-col-size=&quot;sm&quot;&gt;신규 기능&lt;/td&gt;
&lt;td data-end=&quot;1438&quot; data-start=&quot;1375&quot; data-col-size=&quot;sm&quot;&gt;영상 길이 연장, 퀄리티 조절 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1570&quot; data-start=&quot;1439&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1454&quot; data-start=&quot;1439&quot;&gt;SORA&lt;/td&gt;
&lt;td data-end=&quot;1475&quot; data-start=&quot;1454&quot; data-col-size=&quot;sm&quot;&gt;스토리보드 타입&lt;/td&gt;
&lt;td data-end=&quot;1508&quot; data-start=&quot;1475&quot; data-col-size=&quot;sm&quot;&gt;다중 생성, GPT 연동&lt;/td&gt;
&lt;td data-end=&quot;1570&quot; data-start=&quot;1508&quot; data-col-size=&quot;sm&quot;&gt;무제한 생성 방식, 스토리보드 제작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1697&quot; data-start=&quot;1571&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1586&quot; data-start=&quot;1571&quot;&gt;Runway&lt;/td&gt;
&lt;td data-end=&quot;1608&quot; data-start=&quot;1586&quot; data-col-size=&quot;sm&quot;&gt;버전별 다기능&lt;/td&gt;
&lt;td data-end=&quot;1644&quot; data-start=&quot;1608&quot; data-col-size=&quot;sm&quot;&gt;업계 표준&lt;/td&gt;
&lt;td data-end=&quot;1697&quot; data-start=&quot;1644&quot; data-col-size=&quot;sm&quot;&gt;구도/프리셋 설정, 립싱크, 언리미티드 사용 시 무제한 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1827&quot; data-start=&quot;1698&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1713&quot; data-start=&quot;1698&quot;&gt;Kling&lt;/td&gt;
&lt;td data-end=&quot;1735&quot; data-start=&quot;1713&quot; data-col-size=&quot;sm&quot;&gt;버전별 다기능&lt;/td&gt;
&lt;td data-end=&quot;1771&quot; data-start=&quot;1735&quot; data-col-size=&quot;sm&quot;&gt;업계 표준&lt;/td&gt;
&lt;td data-end=&quot;1827&quot; data-start=&quot;1771&quot; data-col-size=&quot;sm&quot;&gt;위치 지정, 모션 컨트롤, 사운드 생성, 멀티 엘리먼트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1961&quot; data-start=&quot;1828&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1843&quot; data-start=&quot;1828&quot;&gt;Veo3&lt;/td&gt;
&lt;td data-end=&quot;1864&quot; data-start=&quot;1843&quot; data-col-size=&quot;sm&quot;&gt;프롬프트 + 이미지&lt;/td&gt;
&lt;td data-end=&quot;1900&quot; data-start=&quot;1864&quot; data-col-size=&quot;sm&quot;&gt;구글 기반&lt;/td&gt;
&lt;td data-end=&quot;1961&quot; data-start=&quot;1900&quot; data-col-size=&quot;sm&quot;&gt;최고 퀄리티, 사운드 생성 (한국어 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2099&quot; data-start=&quot;1962&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1977&quot; data-start=&quot;1962&quot;&gt;Freepik&lt;/td&gt;
&lt;td data-end=&quot;1999&quot; data-start=&quot;1977&quot; data-col-size=&quot;sm&quot;&gt;엔진별 다기능&lt;/td&gt;
&lt;td data-end=&quot;2035&quot; data-start=&quot;1999&quot; data-col-size=&quot;sm&quot;&gt;플랫폼형&lt;/td&gt;
&lt;td data-end=&quot;2099&quot; data-start=&quot;2035&quot; data-col-size=&quot;sm&quot;&gt;복수 AI 단일 크레딧 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;2141&quot; data-start=&quot;2106&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;영상 생성형 AI UI 요약 (일부 주요 툴)&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-end=&quot;2156&quot; data-start=&quot;2143&quot; data-ke-size=&quot;size20&quot;&gt;▶ RUNWAY&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2676&quot; data-start=&quot;2158&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2436&quot; data-start=&quot;2356&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2380&quot; data-start=&quot;2356&quot;&gt;크레딧&lt;/td&gt;
&lt;td data-end=&quot;2436&quot; data-start=&quot;2380&quot; data-col-size=&quot;sm&quot;&gt;언리미티드 모드 시 무제한 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2514&quot; data-start=&quot;2437&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2460&quot; data-start=&quot;2437&quot;&gt;주요 기능&lt;/td&gt;
&lt;td data-end=&quot;2514&quot; data-start=&quot;2460&quot; data-col-size=&quot;sm&quot;&gt;이미지 업로드, 시간/카메라 설정, GEN3/GEN4 버전 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2594&quot; data-start=&quot;2515&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2541&quot; data-start=&quot;2515&quot;&gt;GEN4&lt;/td&gt;
&lt;td data-end=&quot;2594&quot; data-start=&quot;2541&quot; data-col-size=&quot;sm&quot;&gt;최신 버전, 4K 업스케일링 가능, 프리셋 사용 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2676&quot; data-start=&quot;2595&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2621&quot; data-start=&quot;2595&quot;&gt;GEN3&lt;/td&gt;
&lt;td data-end=&quot;2676&quot; data-start=&quot;2621&quot; data-col-size=&quot;sm&quot;&gt;구버전, 프리셋 사용 가능, 해상도 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2690&quot; data-start=&quot;2678&quot; data-ke-size=&quot;size20&quot;&gt;▶ KLING&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3216&quot; data-start=&quot;2692&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2973&quot; data-start=&quot;2890&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2914&quot; data-start=&quot;2890&quot;&gt;크레딧&lt;/td&gt;
&lt;td data-end=&quot;2973&quot; data-start=&quot;2914&quot; data-col-size=&quot;sm&quot;&gt;월 기본 제공, 초과 시 충전 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3049&quot; data-start=&quot;2974&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2997&quot; data-start=&quot;2974&quot;&gt;주요 기능&lt;/td&gt;
&lt;td data-end=&quot;3049&quot; data-start=&quot;2997&quot; data-col-size=&quot;sm&quot;&gt;텍스트 프롬프트, 사운드 생성, 버전별 기능 차이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3132&quot; data-start=&quot;3050&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3073&quot; data-start=&quot;3050&quot;&gt;2 시리즈&lt;/td&gt;
&lt;td data-end=&quot;3132&quot; data-start=&quot;3073&quot; data-col-size=&quot;sm&quot;&gt;최신 버전, High Q, FHD, 사운드 결합 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3216&quot; data-start=&quot;3133&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3156&quot; data-start=&quot;3133&quot;&gt;1 시리즈&lt;/td&gt;
&lt;td data-end=&quot;3216&quot; data-start=&quot;3156&quot; data-col-size=&quot;sm&quot;&gt;구버전, Motion Brush 사용 가능, Start-END 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3229&quot; data-start=&quot;3218&quot; data-ke-size=&quot;size20&quot;&gt;▶ SORA&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3674&quot; data-start=&quot;3231&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3496&quot; data-start=&quot;3429&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3452&quot; data-start=&quot;3429&quot;&gt;기능 요약&lt;/td&gt;
&lt;td data-end=&quot;3496&quot; data-start=&quot;3452&quot; data-col-size=&quot;sm&quot;&gt;이미지 라이브러리 사용, 비율/해상도/시간/개수 설정, 스토리보드 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3582&quot; data-start=&quot;3497&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3520&quot; data-start=&quot;3497&quot;&gt;해상도&lt;/td&gt;
&lt;td data-end=&quot;3582&quot; data-start=&quot;3520&quot; data-col-size=&quot;sm&quot;&gt;최대 1080p, 버전에 따라 다름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3674&quot; data-start=&quot;3583&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3605&quot; data-start=&quot;3583&quot;&gt;추출 개수&lt;/td&gt;
&lt;td data-end=&quot;3674&quot; data-start=&quot;3605&quot; data-col-size=&quot;sm&quot;&gt;최대 4개&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3706&quot; data-start=&quot;3676&quot; data-ke-size=&quot;size20&quot;&gt;▶ Genspark (종합 영상 AI 플랫폼)&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;4164&quot; data-start=&quot;3708&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3991&quot; data-start=&quot;3906&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3928&quot; data-start=&quot;3906&quot;&gt;플랫폼 개요&lt;/td&gt;
&lt;td data-end=&quot;3991&quot; data-start=&quot;3928&quot; data-col-size=&quot;sm&quot;&gt;제휴형 AI 플랫폼, Freepik과 유사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4087&quot; data-start=&quot;3992&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4015&quot; data-start=&quot;3992&quot;&gt;제휴 AI 예시&lt;/td&gt;
&lt;td data-end=&quot;4087&quot; data-start=&quot;4015&quot; data-col-size=&quot;sm&quot;&gt;Veo3, Kling 2.1 Master, MiniMax-Hiluo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4164&quot; data-start=&quot;4088&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4111&quot; data-start=&quot;4088&quot;&gt;추가 기능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4164&quot; data-start=&quot;4111&quot;&gt;프롬프트 자동 생성, 래퍼런스 분석 기능 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/603</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9B%B9-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%98%81%EC%83%81-%EC%83%9D%EC%84%B1-AI-%EC%B6%94%EC%B2%9C-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC-2025%EB%85%84-7%EC%9B%94-%EA%B8%B0%EC%A4%80#entry603comment</comments>
      <pubDate>Wed, 23 Jul 2025 10:46:51 +0900</pubDate>
    </item>
    <item>
      <title>성공한 모바일 게임 탕탕 특공대 마케팅 분석 인사이트 공유</title>
      <link>https://parksh3641.tistory.com/entry/%EC%84%B1%EA%B3%B5%ED%95%9C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-%ED%83%95%ED%83%95-%ED%8A%B9%EA%B3%B5%EB%8C%80-UA-%EB%B6%84%EC%84%9D-%EC%9D%B8%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B3%B5%EC%9C%A0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PwYeb/btsPtmzfY73/sDzzJscKkxjPT1mX3MlCTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PwYeb/btsPtmzfY73/sDzzJscKkxjPT1mX3MlCTK/img.jpg&quot; data-alt=&quot;성공한 모바일 게임 탕탕 특공대 마케팅 분석 인사이트 공유&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PwYeb/btsPtmzfY73/sDzzJscKkxjPT1mX3MlCTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPwYeb%2FbtsPtmzfY73%2FsDzzJscKkxjPT1mX3MlCTK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;484&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성공한 모바일 게임 탕탕 특공대 마케팅 분석 인사이트 공유&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;성공한&amp;nbsp;모바일&amp;nbsp;게임&amp;nbsp;탕탕&amp;nbsp;특공대&amp;nbsp;마케팅&amp;nbsp;분석&amp;nbsp;인사이트&amp;nbsp;공유&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1580&quot; data-start=&quot;30&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 구분 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;358&quot; data-start=&quot;248&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;265&quot; data-start=&quot;248&quot;&gt;&lt;b&gt;1. 인사이트 요약&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;358&quot; data-start=&quot;265&quot; data-col-size=&quot;xl&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;573&quot; data-start=&quot;359&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;374&quot; data-start=&quot;359&quot;&gt;게임적 측면&lt;/td&gt;
&lt;td data-end=&quot;573&quot; data-start=&quot;374&quot; data-col-size=&quot;xl&quot;&gt;- 스팀 인기 게임 중 모바일 미출시 게임 빠른 출시&lt;br /&gt;- 핵심 게임 플레이 쉽게 개선&lt;br /&gt;- 플레이어 리텐션 강화 (레벨 보상, 일일퀘스트, 방치 보상 등)&lt;br /&gt;- 빠른 경험 제공 (빠른 학습, 능력치 상승, 초기 저렴 IAP)&lt;br /&gt;- 공통 게임요소 활용 (원거리 전투, 로그라이트 성장, 장비 합성 등)&lt;br /&gt;- 하이퍼캐주얼 그래픽 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;742&quot; data-start=&quot;574&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;588&quot; data-start=&quot;574&quot;&gt;마케팅적 측면&lt;/td&gt;
&lt;td data-end=&quot;742&quot; data-start=&quot;588&quot; data-col-size=&quot;xl&quot;&gt;- 컨셉 시장성 테스트(더미앱 + Fake Ads)&lt;br /&gt;- Tiktok 광고 집중, 일반 컨텐츠처럼 제작&lt;br /&gt;- 하이퍼캐주얼 그래픽 + 적합 광고 플랫폼 활용 (Ironsource)&lt;br /&gt;- 광고소재: 대규모 좀비 전투, 밈, 실패&amp;rarr;성공 시나리오, 게임 리뷰 스타일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;829&quot; data-start=&quot;743&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;759&quot; data-start=&quot;743&quot;&gt;기타&lt;/td&gt;
&lt;td data-end=&quot;829&quot; data-start=&quot;759&quot; data-col-size=&quot;xl&quot;&gt;- 성과 좋은 시장테스트 컨셉: 심플/미니멀 그래픽, 대규모, 좀비, 1:100만 대결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;980&quot; data-start=&quot;830&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;848&quot; data-start=&quot;830&quot;&gt;&lt;b&gt;2. 탕탕특공대 기원&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;980&quot; data-start=&quot;848&quot; data-col-size=&quot;xl&quot;&gt;- Poncle 스튜디오 Vampire Survivors 기반 (2021년 12월 출시, 2022년 10월 정식 출시)&lt;br /&gt;- 팬들은 모바일 버전 간절히 원했으나 제작사는 늦게 출시 (2022년 12월)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1092&quot; data-start=&quot;981&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;999&quot; data-start=&quot;981&quot;&gt;&lt;b&gt;3. 출시 히스토리&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1092&quot; data-start=&quot;999&quot; data-col-size=&quot;xl&quot;&gt;- iOS 2020년부터, Android 2022년 7월 말부터 활성화&lt;br /&gt;- Fake Ads와 더미앱으로 유저 반응 테스트 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1332&quot; data-start=&quot;1093&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1112&quot; data-start=&quot;1093&quot;&gt;&lt;b&gt;4. 특징&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1332&quot; data-start=&quot;1112&quot; data-col-size=&quot;xl&quot;&gt;- 무료 게임, 리텐션 강화 (보상 상자, 일일 퀘스트, 방치 보상, 우편 재화, 광고 보상)&lt;br /&gt;- Vampire Survivors 대비 쉬운 접근성 (보스전 장애물, 명확한 클리어 규칙)&lt;br /&gt;- Archero 스타일 &amp;lsquo;레시피&amp;rsquo; 반영 (원거리 전투, 로그라이트, 장비 업그레이드, 등급별 보상)&lt;br /&gt;- 빠른 학습과 빠른 허들, 초기 저렴 IAP 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1580&quot; data-start=&quot;1333&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1353&quot; data-start=&quot;1333&quot;&gt;&lt;b&gt;5. 마케팅(UA)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1580&quot; data-start=&quot;1353&quot; data-col-size=&quot;xl&quot;&gt;1) 개요: 미니멀 2D 그래픽, 대규모 좀비 무리 경험, 심플&amp;middot;대규모&amp;middot;좀비&amp;middot;1:100만 대결 컨셉&lt;br /&gt;2) 채널: Facebook, Google, Tiktok, Unity, Vungle, Ironsource, Applovin 등&lt;br /&gt;3) 예산: 초기 일일 수익 80% 지출, Tiktok 50% 집중&lt;br /&gt;4) 소재: 대규모 좀비 전투, 인기 밈, 실패&amp;rarr;성공 시나리오, 일반인 컨텐츠 느낌 광고&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/602</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%84%B1%EA%B3%B5%ED%95%9C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-%ED%83%95%ED%83%95-%ED%8A%B9%EA%B3%B5%EB%8C%80-UA-%EB%B6%84%EC%84%9D-%EC%9D%B8%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B3%B5%EC%9C%A0#entry602comment</comments>
      <pubDate>Tue, 22 Jul 2025 14:02:20 +0900</pubDate>
    </item>
    <item>
      <title>모바일 게임 마케팅 매니저가 꼭 알아야 할 11가지 핵심 전략</title>
      <link>https://parksh3641.tistory.com/entry/%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-UA-%EB%A7%A4%EB%8B%88%EC%A0%80%EA%B0%80-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-11%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EC%A0%84%EB%9E%B5</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xbhVh/btsPr4T6WcZ/4HLABzzideG3aIDJlfC0pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xbhVh/btsPr4T6WcZ/4HLABzzideG3aIDJlfC0pk/img.png&quot; data-alt=&quot;모바일 게임 마케팅 매니저가 꼭 알아야 할 11가지 핵심 전략&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xbhVh/btsPr4T6WcZ/4HLABzzideG3aIDJlfC0pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxbhVh%2FbtsPr4T6WcZ%2F4HLABzzideG3aIDJlfC0pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일 게임 마케팅 매니저가 꼭 알아야 할 11가지 핵심 전략&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모바일&amp;nbsp;게임&amp;nbsp;마케팅&amp;nbsp;매니저가&amp;nbsp;꼭&amp;nbsp;알아야&amp;nbsp;할&amp;nbsp;11가지&amp;nbsp;핵심&amp;nbsp;전략&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-pm-slice=&quot;3 3 []&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt; 항목 &lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt; 내용 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UA 타겟 설정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;D1, D3, D7별 ROAS 기준 설정 필요. UA 채널별 LTV 고려하여 효율 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UA 및 크리에이티브 검토&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;타게팅 옵션, 소재 성과, 데이터 정합성, Daily Spend &amp;amp; Revenue 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UA 예산 증가 전략&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월 20% 수준 점진 증가, 회수 기간 관리, ROAS 계산 시 30% 수수료 제외 기준 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;캠페인 통합 전략&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;캠페인을 국가 그룹으로 통합하여 학습 단계 가속화. 예: US/ROW, US+T1, US+T1+T2+ROW&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;좋은 소재 제작 방법&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;첫 3초 주목, 인플루언서 활용, 영상 분할, CTA 실험, TikTok 음악 추가 등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;플레이어 동기 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경쟁심, 도전, 휴식, 소셜 상호작용, 미적 만족, 수집/커스터마이징, 탈출감 등 이해 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UA 시장 전망 (2023)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;D365&amp;rarr;D90 등 회수 기간 단축, 광고수익형 게임 유리, UA 채널 다양화 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;주요 벤치마크 &amp;amp; KPI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CPI는 국가별 비교, ROAS는 D7/D30/D90 확인, CPI+LTV 통합 분석 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비게임 앱 UA 전략&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ASA 예산 20~30%, 브랜드/경쟁사/일반 키워드 혼합 구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;TikTok 바이럴 영상 요소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;7초 이내, 강렬한 시작, 고퀄 콘텐츠, CTA 포함, POV/일상/제품리뷰 등 형식 다양화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Generative AI 활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ChatGPT 등 활용해 타이틀, 영상 아이디어 생성. 예: 30자 게임 제목, 영상 콘셉트 작성 등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/601</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-UA-%EB%A7%A4%EB%8B%88%EC%A0%80%EA%B0%80-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-11%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EC%A0%84%EB%9E%B5#entry601comment</comments>
      <pubDate>Tue, 22 Jul 2025 13:57:08 +0900</pubDate>
    </item>
    <item>
      <title>성공한 모바일 게임 레전드 오브 슬라임 마케팅 분석</title>
      <link>https://parksh3641.tistory.com/entry/%EC%84%B1%EA%B3%B5%ED%95%9C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-%EB%A0%88%EC%A0%84%EB%93%9C-%EC%98%A4%EB%B8%8C-%EC%8A%AC%EB%9D%BC%EC%9E%84-UA-%EB%B6%84%EC%84%9D</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cihtHA/btsPspDHUKj/01RZqGot6sSFYLgKXb9fW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cihtHA/btsPspDHUKj/01RZqGot6sSFYLgKXb9fW0/img.jpg&quot; data-alt=&quot;성공한 모바일 게임 레전드 오브 슬라임 마케팅 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cihtHA/btsPspDHUKj/01RZqGot6sSFYLgKXb9fW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcihtHA%2FbtsPspDHUKj%2F01RZqGot6sSFYLgKXb9fW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성공한 모바일 게임 레전드 오브 슬라임 마케팅 분석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;105&quot; data-start=&quot;89&quot; data-ke-size=&quot;size26&quot;&gt;성공한&amp;nbsp;모바일&amp;nbsp;게임&amp;nbsp;레전드&amp;nbsp;오브&amp;nbsp;슬라임&amp;nbsp;마케팅&amp;nbsp;분석&lt;/h2&gt;
&lt;h2 data-end=&quot;105&quot; data-start=&quot;89&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;게임 개요&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;291&quot; data-start=&quot;107&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;160&quot; data-start=&quot;135&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;141&quot; data-start=&quot;135&quot;&gt;게임명&lt;/td&gt;
&lt;td data-end=&quot;160&quot; data-start=&quot;141&quot; data-col-size=&quot;sm&quot;&gt;Legend of Slime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;188&quot; data-start=&quot;161&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;166&quot; data-start=&quot;161&quot;&gt;장르&lt;/td&gt;
&lt;td data-end=&quot;188&quot; data-start=&quot;166&quot; data-col-size=&quot;sm&quot;&gt;방치형 RPG (Idle RPG)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;211&quot; data-start=&quot;189&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;197&quot; data-start=&quot;189&quot;&gt;주요 시장&lt;/td&gt;
&lt;td data-end=&quot;211&quot; data-start=&quot;197&quot; data-col-size=&quot;sm&quot;&gt;미국, 일본, 한국&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;262&quot; data-start=&quot;212&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;220&quot; data-start=&quot;212&quot;&gt;주요 성과&lt;/td&gt;
&lt;td data-end=&quot;262&quot; data-start=&quot;220&quot; data-col-size=&quot;sm&quot;&gt;높은 IAP 매출, 콘텐츠 확장성과 과금 시스템으로 높은 LTV 달성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;291&quot; data-start=&quot;263&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;270&quot; data-start=&quot;263&quot;&gt;퍼블리셔&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;291&quot; data-start=&quot;270&quot;&gt;LoadComplete (한국)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;319&quot; data-start=&quot;298&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;성과 및 문제 요약&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;513&quot; data-start=&quot;321&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;수치/내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;394&quot; data-start=&quot;357&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;368&quot; data-start=&quot;357&quot;&gt;D7 수익 증가&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;394&quot; data-start=&quot;368&quot;&gt;+30% (Luna 분석 도구 도입 후)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;437&quot; data-start=&quot;395&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;410&quot; data-start=&quot;395&quot;&gt;Retention 증가&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;437&quot; data-start=&quot;410&quot;&gt;+150% (D7, D10, D14 기준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;462&quot; data-start=&quot;438&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;445&quot; data-start=&quot;438&quot;&gt;월 매출&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;462&quot; data-start=&quot;445&quot;&gt;약 $7M (단일 게임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;513&quot; data-start=&quot;463&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;469&quot; data-start=&quot;463&quot;&gt;문제점&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;513&quot; data-start=&quot;469&quot;&gt;UA 팀과 크리에이티브/데이터 팀 간 협업 부족, 시니어 UA 인력 부족&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;542&quot; data-start=&quot;520&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;LTV와 CPI 추정&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;699&quot; data-start=&quot;544&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;수치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;593&quot; data-start=&quot;572&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;585&quot; data-start=&quot;572&quot;&gt;IAP 기반 LTV&lt;/td&gt;
&lt;td data-end=&quot;593&quot; data-start=&quot;585&quot; data-col-size=&quot;sm&quot;&gt;약 $3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;617&quot; data-start=&quot;594&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;607&quot; data-start=&quot;594&quot;&gt;IAA 기반 LTV&lt;/td&gt;
&lt;td data-end=&quot;617&quot; data-start=&quot;607&quot; data-col-size=&quot;sm&quot;&gt;약 $6~7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;638&quot; data-start=&quot;618&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;629&quot; data-start=&quot;618&quot;&gt;총 LTV 추정&lt;/td&gt;
&lt;td data-end=&quot;638&quot; data-start=&quot;629&quot; data-col-size=&quot;sm&quot;&gt;$9~10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;664&quot; data-start=&quot;639&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;651&quot; data-start=&quot;639&quot;&gt;CPI 예상 범위&lt;/td&gt;
&lt;td data-end=&quot;664&quot; data-start=&quot;651&quot; data-col-size=&quot;sm&quot;&gt;$1.5 ~ $2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;699&quot; data-start=&quot;665&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;673&quot; data-start=&quot;665&quot;&gt;마진 여유&lt;/td&gt;
&lt;td data-end=&quot;699&quot; data-start=&quot;673&quot; data-col-size=&quot;sm&quot;&gt;높은 D30 ROAS로 인한 충분한 여유&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;729&quot; data-start=&quot;706&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;크리에이티브 전략 분석&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;947&quot; data-start=&quot;731&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;787&quot; data-start=&quot;759&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;778&quot; data-start=&quot;759&quot;&gt;안드로이드 라이브 크리에이티브&lt;/td&gt;
&lt;td data-end=&quot;787&quot; data-start=&quot;778&quot; data-col-size=&quot;md&quot;&gt;약 99개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;814&quot; data-start=&quot;788&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;805&quot; data-start=&quot;788&quot;&gt;iOS 라이브 크리에이티브&lt;/td&gt;
&lt;td data-end=&quot;814&quot; data-start=&quot;805&quot; data-col-size=&quot;md&quot;&gt;약 44개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;869&quot; data-start=&quot;815&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;823&quot; data-start=&quot;815&quot;&gt;포맷 구성&lt;/td&gt;
&lt;td data-end=&quot;869&quot; data-start=&quot;823&quot; data-col-size=&quot;md&quot;&gt;대부분 게임플레이 중심, 일부 TikTok 스타일(UGC, AI Voice)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;910&quot; data-start=&quot;870&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;878&quot; data-start=&quot;870&quot;&gt;부족한 점&lt;/td&gt;
&lt;td data-end=&quot;910&quot; data-start=&quot;878&quot; data-col-size=&quot;md&quot;&gt;크리에이티브 다양성/깊이 부족, 반복되는 음악 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;947&quot; data-start=&quot;911&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;916&quot; data-start=&quot;911&quot;&gt;제안&lt;/td&gt;
&lt;td data-end=&quot;947&quot; data-start=&quot;916&quot; data-col-size=&quot;md&quot;&gt;월 10~20개 새로운 콘셉트 + 반복 개선 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;978&quot; data-start=&quot;954&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주요 UA 채널 및 변화&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1223&quot; data-start=&quot;980&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;채널&lt;/td&gt;
&lt;td&gt;상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1049&quot; data-start=&quot;1008&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1019&quot; data-start=&quot;1008&quot;&gt;Applovin&lt;/td&gt;
&lt;td data-end=&quot;1049&quot; data-start=&quot;1019&quot; data-col-size=&quot;md&quot;&gt;가장 많은 지출, AdROAS 캠페인에서 효과적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1091&quot; data-start=&quot;1050&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1058&quot; data-start=&quot;1050&quot;&gt;Unity&lt;/td&gt;
&lt;td data-end=&quot;1091&quot; data-start=&quot;1058&quot; data-col-size=&quot;md&quot;&gt;iOS/Android 모두 4월 중순 이후 집행 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1124&quot; data-start=&quot;1092&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1101&quot; data-start=&quot;1092&quot;&gt;Google&lt;/td&gt;
&lt;td data-end=&quot;1124&quot; data-start=&quot;1101&quot; data-col-size=&quot;md&quot;&gt;상반기까지 상위권 유지, 이후 멈춤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1182&quot; data-start=&quot;1125&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1133&quot; data-start=&quot;1125&quot;&gt;기타 채널&lt;/td&gt;
&lt;td data-end=&quot;1182&quot; data-start=&quot;1133&quot; data-col-size=&quot;md&quot;&gt;TikTok, Facebook, Vungle, IronSource (소규모 집행)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1223&quot; data-start=&quot;1183&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1191&quot; data-start=&quot;1183&quot;&gt;원인 추정&lt;/td&gt;
&lt;td data-end=&quot;1223&quot; data-start=&quot;1191&quot; data-col-size=&quot;md&quot;&gt;인력 부족, 시니어 부재, 내부 리소스 부족 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1258&quot; data-start=&quot;1230&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;게임 디자인 내 수익 모델 요소&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 122px;&quot; border=&quot;1&quot; data-end=&quot;1507&quot; data-start=&quot;1260&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;시스템&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;기능/수익 요소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1338&quot; data-start=&quot;1307&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1317&quot; data-start=&quot;1307&quot;&gt;VIP 시스템&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1338&quot; data-start=&quot;1317&quot; data-col-size=&quot;sm&quot;&gt;광고 시청량에 따라 보너스 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1370&quot; data-start=&quot;1339&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1350&quot; data-start=&quot;1339&quot;&gt;광고 기반 강화&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1370&quot; data-start=&quot;1350&quot; data-col-size=&quot;sm&quot;&gt;광고 시청 시 일시적 강화효과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1411&quot; data-start=&quot;1371&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1380&quot; data-start=&quot;1371&quot;&gt;장비 시스템&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1411&quot; data-start=&quot;1380&quot; data-col-size=&quot;sm&quot;&gt;모든 장비가 누적 강화에 기여 (업그레이드 유도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1463&quot; data-start=&quot;1412&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1422&quot; data-start=&quot;1412&quot;&gt;콘텐츠 페이싱&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1463&quot; data-start=&quot;1422&quot; data-col-size=&quot;sm&quot;&gt;마스터리, 유물, 트레잇, 슬라임 수집 등으로 반복 성장 구조 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1507&quot; data-start=&quot;1464&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1471&quot; data-start=&quot;1464&quot;&gt;미니게임&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1507&quot; data-start=&quot;1471&quot; data-col-size=&quot;sm&quot;&gt;채굴 모드 (Township 벤치마킹)으로 클릭 유지 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1531&quot; data-start=&quot;1514&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전략적 제안&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1782&quot; data-start=&quot;1533&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;제안&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1607&quot; data-start=&quot;1561&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1568&quot; data-start=&quot;1561&quot;&gt;UA 팀&lt;/td&gt;
&lt;td data-end=&quot;1607&quot; data-start=&quot;1568&quot; data-col-size=&quot;md&quot;&gt;시니어 인력 확보, 데이터 팀과 매일 소통, UA 대시보드 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1666&quot; data-start=&quot;1608&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1622&quot; data-start=&quot;1608&quot;&gt;크리에이티브 팀 구성&lt;/td&gt;
&lt;td data-end=&quot;1666&quot; data-start=&quot;1622&quot; data-col-size=&quot;md&quot;&gt;2D/3D 모션 디자이너, 캐릭터 애니메이터, 리거, 그래픽 디자이너 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1720&quot; data-start=&quot;1667&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1676&quot; data-start=&quot;1667&quot;&gt;캠페인 전략&lt;/td&gt;
&lt;td data-end=&quot;1720&quot; data-start=&quot;1676&quot; data-col-size=&quot;md&quot;&gt;국가별/채널별 분석 및 최적화, AdROAS 지표 기반 크리에이티브 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1782&quot; data-start=&quot;1721&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1729&quot; data-start=&quot;1721&quot;&gt;확장 전략&lt;/td&gt;
&lt;td data-end=&quot;1782&quot; data-start=&quot;1729&quot; data-col-size=&quot;md&quot;&gt;해외 채널 확대, 퍼블리셔 단위 타겟팅 정교화 (예: 슬라임과 유사한 게임 사용자 대상)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1807&quot; data-start=&quot;1789&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요약 및 결론&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1986&quot; data-start=&quot;1809&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1879&quot; data-start=&quot;1837&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1842&quot; data-start=&quot;1837&quot;&gt;강점&lt;/td&gt;
&lt;td data-end=&quot;1879&quot; data-start=&quot;1842&quot; data-col-size=&quot;md&quot;&gt;고도화된 콘텐츠 설계, 높은 LTV 구조, 글로벌 매출 성과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1923&quot; data-start=&quot;1880&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1885&quot; data-start=&quot;1880&quot;&gt;약점&lt;/td&gt;
&lt;td data-end=&quot;1923&quot; data-start=&quot;1885&quot; data-col-size=&quot;md&quot;&gt;UA 전략 부족, 크리에이티브 깊이 부족, 조직 내 협업 단절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1986&quot; data-start=&quot;1924&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1929&quot; data-start=&quot;1924&quot;&gt;결론&lt;/td&gt;
&lt;td data-end=&quot;1986&quot; data-start=&quot;1929&quot; data-col-size=&quot;md&quot;&gt;수익성은 확보했으나 UA 체계 정비와 크리에이티브 전략 개선 시 &lt;b&gt;더 큰 성과 가능성 보유&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/600</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%84%B1%EA%B3%B5%ED%95%9C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B2%8C%EC%9E%84-%EB%A0%88%EC%A0%84%EB%93%9C-%EC%98%A4%EB%B8%8C-%EC%8A%AC%EB%9D%BC%EC%9E%84-UA-%EB%B6%84%EC%84%9D#entry600comment</comments>
      <pubDate>Tue, 22 Jul 2025 13:52:36 +0900</pubDate>
    </item>
    <item>
      <title>방치형 게임 성공 전략 리텐션, 과금, 마케팅까지 단계별 완전 정리</title>
      <link>https://parksh3641.tistory.com/entry/%EB%B0%A9%EC%B9%98%ED%98%95-%EA%B2%8C%EC%9E%84-%EC%84%B1%EA%B3%B5-%EC%A0%84%EB%9E%B5-%EB%A6%AC%ED%85%90%EC%85%98-%EA%B3%BC%EA%B8%88-%EB%A7%88%EC%BC%80%ED%8C%85%EA%B9%8C%EC%A7%80-%EB%8B%A8%EA%B3%84%EB%B3%84-%EC%99%84%EC%A0%84-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTWhHi/btsPtlttHIY/OhyHsGtgx2KLHLUhtYJ690/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTWhHi/btsPtlttHIY/OhyHsGtgx2KLHLUhtYJ690/img.png&quot; data-alt=&quot;방치형 게임 성공 전략 리텐션, 과금, 마케팅까지 단계별 완전 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTWhHi/btsPtlttHIY/OhyHsGtgx2KLHLUhtYJ690/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTWhHi%2FbtsPtlttHIY%2FOhyHsGtgx2KLHLUhtYJ690%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;방치형 게임 성공 전략 리텐션, 과금, 마케팅까지 단계별 완전 정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;68&quot; data-start=&quot;43&quot; data-ke-size=&quot;size26&quot;&gt;방치형&amp;nbsp;게임&amp;nbsp;성공&amp;nbsp;전략&amp;nbsp;리텐션,&amp;nbsp;과금,&amp;nbsp;마케팅까지&amp;nbsp;단계별&amp;nbsp;완전&amp;nbsp;정리&lt;/h2&gt;
&lt;h2 data-end=&quot;68&quot; data-start=&quot;43&quot; data-ke-size=&quot;size26&quot;&gt;1. 방치형 게임 평균(목표) 지표&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;307&quot; data-start=&quot;70&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;지표&lt;/td&gt;
&lt;td&gt;수치 범위 (목표)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;169&quot; data-start=&quot;136&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;148&quot; data-start=&quot;136&quot;&gt;D+1 리텐션&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;169&quot; data-start=&quot;148&quot;&gt;35% ~ 50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;203&quot; data-start=&quot;170&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;182&quot; data-start=&quot;170&quot;&gt;D+3 리텐션&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;203&quot; data-start=&quot;182&quot;&gt;20% ~ 30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;237&quot; data-start=&quot;204&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;216&quot; data-start=&quot;204&quot;&gt;D+7 리텐션&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;237&quot; data-start=&quot;216&quot;&gt;10% ~ 20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;273&quot; data-start=&quot;238&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;253&quot; data-start=&quot;238&quot;&gt;BURATE&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;273&quot; data-start=&quot;253&quot;&gt;약 3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;307&quot; data-start=&quot;274&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;289&quot; data-start=&quot;274&quot;&gt;LTV&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;307&quot; data-start=&quot;289&quot;&gt;약 $4 전후&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;338&quot; data-start=&quot;314&quot; data-ke-size=&quot;size26&quot;&gt;2. 리텐션 및 수익 개선 순서&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;720&quot; data-start=&quot;340&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 단계 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;개선 항목&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;470&quot; data-start=&quot;404&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;418&quot; data-start=&quot;404&quot;&gt;&lt;b&gt;1단계&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;431&quot; data-start=&quot;418&quot;&gt;D+1 리텐션 개선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;470&quot; data-start=&quot;431&quot;&gt;- 이탈 위치 &amp;amp; 이유 확인&lt;br /&gt;- 퍼널 분석 통한 UX 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;535&quot; data-start=&quot;471&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;485&quot; data-start=&quot;471&quot;&gt;&lt;b&gt;2단계&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;498&quot; data-start=&quot;485&quot;&gt;D+2 리텐션 개선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;535&quot; data-start=&quot;498&quot;&gt;- 푸시 알림, 보너스 이벤트&lt;br /&gt;- 일일 보상 우편 발송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;610&quot; data-start=&quot;536&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;550&quot; data-start=&quot;536&quot;&gt;&lt;b&gt;3단계&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;563&quot; data-start=&quot;550&quot;&gt;D+7 리텐션 개선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;610&quot; data-start=&quot;563&quot;&gt;- 최소 7일간 즐길 콘텐츠 제공&lt;br /&gt;- 출시 시점에 전부 구현 필요는 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;673&quot; data-start=&quot;611&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;625&quot; data-start=&quot;611&quot;&gt;&lt;b&gt;4단계&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;634&quot; data-start=&quot;625&quot;&gt;결제율 개선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;673&quot; data-start=&quot;634&quot;&gt;- 타 게임의 과금 심리 벤치마킹&lt;br /&gt;- 과금 UI/UX 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;720&quot; data-start=&quot;674&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;688&quot; data-start=&quot;674&quot;&gt;&lt;b&gt;5단계&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;697&quot; data-start=&quot;688&quot;&gt;마케팅 집행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;720&quot; data-start=&quot;697&quot;&gt;- 타이밍에 맞는 효율적 집행 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;755&quot; data-start=&quot;727&quot; data-ke-size=&quot;size26&quot;&gt;3. 마케팅 전략 (다운로드 수 기준)&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1085&quot; data-start=&quot;757&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 다운로드 수 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전략&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;865&quot; data-start=&quot;797&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;810&quot; data-start=&quot;797&quot;&gt;&lt;b&gt;~5,000&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;865&quot; data-start=&quot;810&quot;&gt;- 내부 개선 집중&lt;br /&gt;- D+1 D+7 및 결제율 확보&lt;br /&gt;- NRU 50 - 200 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;931&quot; data-start=&quot;866&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;880&quot; data-start=&quot;866&quot;&gt;&lt;b&gt;~10,000&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;931&quot; data-start=&quot;880&quot;&gt;- 마케팅 시작&lt;br /&gt;- 효율 좋은 소재 탐색&lt;br /&gt;- 썩소TV 등 오가닉 채널 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;997&quot; data-start=&quot;932&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;946&quot; data-start=&quot;932&quot;&gt;&lt;b&gt;~50,000&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;997&quot; data-start=&quot;946&quot;&gt;- 효율 좋은 소재 중심 마케팅&lt;br /&gt;- 운영 업데이트 병행&lt;br /&gt;- ROAS 최대화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1085&quot; data-start=&quot;998&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1013&quot; data-start=&quot;998&quot;&gt;&lt;b&gt;100,000+&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1085&quot; data-start=&quot;1013&quot;&gt;- 국내 유저 풀 소진 시기&lt;br /&gt;- 광고비 &amp;gt; LTV 발생 시작&lt;br /&gt;- 수명 연장 시스템 필요&lt;br /&gt;- 해외 출시 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1110&quot; data-start=&quot;1092&quot; data-ke-size=&quot;size26&quot;&gt;4. 흔한 실수 요약&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1284&quot; data-start=&quot;1112&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 구분 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실수 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1219&quot; data-start=&quot;1160&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1172&quot; data-start=&quot;1160&quot;&gt;&lt;b&gt;운영 측면&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1219&quot; data-start=&quot;1172&quot;&gt;- 순서를 지키지 않음&lt;br /&gt;- 유저와 갈등&lt;br /&gt;- 준비 완료 전 유입 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1284&quot; data-start=&quot;1220&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1233&quot; data-start=&quot;1220&quot;&gt;&lt;b&gt;마케팅 측면&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1284&quot; data-start=&quot;1233&quot;&gt;- 유저 풀 빠르게 소진&lt;br /&gt;- 단가 높은 유저 유입&lt;br /&gt;- 장기 운영 전략 부재&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/599</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%B0%A9%EC%B9%98%ED%98%95-%EA%B2%8C%EC%9E%84-%EC%84%B1%EA%B3%B5-%EC%A0%84%EB%9E%B5-%EB%A6%AC%ED%85%90%EC%85%98-%EA%B3%BC%EA%B8%88-%EB%A7%88%EC%BC%80%ED%8C%85%EA%B9%8C%EC%A7%80-%EB%8B%A8%EA%B3%84%EB%B3%84-%EC%99%84%EC%A0%84-%EC%A0%95%EB%A6%AC#entry599comment</comments>
      <pubDate>Tue, 22 Jul 2025 13:47:44 +0900</pubDate>
    </item>
    <item>
      <title>인디게임 광고 성과 기준 퍼블리셔 선정 기준 방법</title>
      <link>https://parksh3641.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A3%BC%EC%B2%B4-%ED%8C%90%EB%8B%A8-%EA%B8%B0%EC%A4%80-%EB%B0%8F-%ED%8D%BC%EB%B8%94%EB%A6%AC%EC%85%94-%EC%84%A0%EC%A0%95-%EA%B8%B0%EC%A4%80</link>
      <description>&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;74590f2c-e305-467d-81ef-ade8cf9782f7&quot; data-message-author-role=&quot;assistant&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHIsW/btsPuadEsH3/Rl4zpU5hlRM2spzN1ckAvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHIsW/btsPuadEsH3/Rl4zpU5hlRM2spzN1ckAvk/img.png&quot; data-alt=&quot;인디게임 광고 성과 기준 퍼블리셔 선정 기준 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHIsW/btsPuadEsH3/Rl4zpU5hlRM2spzN1ckAvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHIsW%2FbtsPuadEsH3%2FRl4zpU5hlRM2spzN1ckAvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인디게임 광고 성과 기준 퍼블리셔 선정 기준 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;aea3a571-49f2-45ca-9315-6c3c434adce3&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;h2 data-end=&quot;157&quot; data-start=&quot;122&quot; data-ke-size=&quot;size26&quot;&gt;인디게임&amp;nbsp;광고&amp;nbsp;성과&amp;nbsp;기준&amp;nbsp;퍼블리셔&amp;nbsp;선정&amp;nbsp;기준&amp;nbsp;방법&lt;/h2&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;159&quot; data-ke-size=&quot;size16&quot;&gt;모바일 게임 출시의 성패는 철저한 데이터 기반의 테스트와 퍼블리셔 협업 전략에 달려 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;159&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같은 &lt;b&gt;5단계 출시 프로세스&lt;/b&gt;를 통해 성공 가능성을 검증하고, 그에 따른 서비스 주체를 결정합니다.&lt;/p&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;159&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;304&quot; data-start=&quot;287&quot; data-ke-size=&quot;size26&quot;&gt;서비스 주체 판단 기준&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;470&quot; data-start=&quot;306&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;306&quot;&gt;&lt;b&gt;단계별 KPI를 달성&lt;/b&gt;한 프로젝트는 &lt;b&gt;자체 서비스 진행&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;390&quot; data-start=&quot;351&quot;&gt;KPI 기준은 글로벌 퍼블리셔의 소싱 기준과 &lt;b&gt;유사하거나 상회&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;432&quot; data-start=&quot;391&quot;&gt;각 단계별로 &lt;b&gt;내부 테스트 + 외부 퍼블리셔와의 크로스 평가 병행&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;470&quot; data-start=&quot;433&quot;&gt;&lt;b&gt;약간 미달 시&lt;/b&gt;, 퍼블리셔와 협업 가능성 &lt;b&gt;오픈 협의&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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-end=&quot;496&quot; data-start=&quot;477&quot; data-ke-size=&quot;size26&quot;&gt;단계별 KPI 수치 기준&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1245&quot; data-start=&quot;498&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody data-end=&quot;1245&quot; data-start=&quot;563&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 단계 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;핵심 평가 항목&lt;/td&gt;
&lt;td&gt;기준 수치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;621&quot; data-start=&quot;563&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;584&quot; data-start=&quot;563&quot;&gt;&lt;b&gt;1단계 (CPI Test)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;590&quot; data-start=&quot;584&quot; data-col-size=&quot;sm&quot;&gt;CPI&lt;/td&gt;
&lt;td data-end=&quot;621&quot; data-start=&quot;590&quot; data-col-size=&quot;sm&quot;&gt;캐주얼: $2 이하&lt;br /&gt;다이소류: $2.5 이하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;683&quot; data-start=&quot;622&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;643&quot; data-start=&quot;622&quot;&gt;&lt;b&gt;2단계 (PMF Test)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;655&quot; data-start=&quot;643&quot; data-col-size=&quot;sm&quot;&gt;Retention&lt;/td&gt;
&lt;td data-end=&quot;683&quot; data-start=&quot;655&quot; data-col-size=&quot;sm&quot;&gt;D+1: 30~40%, D+3: 20~30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;737&quot; data-start=&quot;684&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;710&quot; data-start=&quot;684&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;727&quot; data-start=&quot;710&quot; data-col-size=&quot;sm&quot;&gt;Daily Playtime&lt;/td&gt;
&lt;td data-end=&quot;737&quot; data-start=&quot;727&quot; data-col-size=&quot;sm&quot;&gt;20분 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;784&quot; data-start=&quot;738&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;764&quot; data-start=&quot;738&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;771&quot; data-start=&quot;764&quot; data-col-size=&quot;sm&quot;&gt;ROAS&lt;/td&gt;
&lt;td data-end=&quot;784&quot; data-start=&quot;771&quot; data-col-size=&quot;sm&quot;&gt;D+1 &amp;ge; 25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;864&quot; data-start=&quot;785&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;811&quot; data-start=&quot;785&quot;&gt;&lt;b&gt;3단계 (Advanced Test)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;823&quot; data-start=&quot;811&quot; data-col-size=&quot;sm&quot;&gt;Retention&lt;/td&gt;
&lt;td data-end=&quot;864&quot; data-start=&quot;823&quot; data-col-size=&quot;sm&quot;&gt;D+1: 35~ 45%, D+3: 25~30%, D+7: 10~15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;922&quot; data-start=&quot;865&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;895&quot; data-start=&quot;865&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;912&quot; data-start=&quot;895&quot; data-col-size=&quot;sm&quot;&gt;Daily Playtime&lt;/td&gt;
&lt;td data-end=&quot;922&quot; data-start=&quot;912&quot; data-col-size=&quot;sm&quot;&gt;25분 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;992&quot; data-start=&quot;923&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;953&quot; data-start=&quot;923&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;960&quot; data-start=&quot;953&quot; data-col-size=&quot;sm&quot;&gt;ROAS&lt;/td&gt;
&lt;td data-end=&quot;992&quot; data-start=&quot;960&quot; data-col-size=&quot;sm&quot;&gt;D+1: &amp;ge; 30%, D+30: &amp;ge; 100~120%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1071&quot; data-start=&quot;993&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1020&quot; data-start=&quot;993&quot;&gt;&lt;b&gt;4단계 (Extension Test)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1032&quot; data-start=&quot;1020&quot; data-col-size=&quot;sm&quot;&gt;Retention&lt;/td&gt;
&lt;td data-end=&quot;1071&quot; data-start=&quot;1032&quot; data-col-size=&quot;sm&quot;&gt;D+1: &amp;ge; 35%, D+7: &amp;ge; 20%, D+14: &amp;ge; 10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1129&quot; data-start=&quot;1072&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1102&quot; data-start=&quot;1072&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;1119&quot; data-start=&quot;1102&quot; data-col-size=&quot;sm&quot;&gt;Daily Playtime&lt;/td&gt;
&lt;td data-end=&quot;1129&quot; data-start=&quot;1119&quot; data-col-size=&quot;sm&quot;&gt;30분 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1195&quot; data-start=&quot;1130&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1160&quot; data-start=&quot;1130&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td data-end=&quot;1167&quot; data-start=&quot;1160&quot; data-col-size=&quot;sm&quot;&gt;ROAS&lt;/td&gt;
&lt;td data-end=&quot;1195&quot; data-start=&quot;1167&quot; data-col-size=&quot;sm&quot;&gt;D+1: &amp;ge; 40%, D+30: &amp;ge; 120%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1245&quot; data-start=&quot;1196&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1222&quot; data-start=&quot;1196&quot;&gt;&lt;b&gt;5단계 (Global Launch)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1231&quot; data-start=&quot;1222&quot; data-col-size=&quot;sm&quot;&gt;KPI 달성&lt;/td&gt;
&lt;td data-end=&quot;1245&quot; data-start=&quot;1231&quot; data-col-size=&quot;sm&quot;&gt;위 기준 모두 충족&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1279&quot; data-start=&quot;1252&quot; data-ke-size=&quot;size26&quot;&gt;UA Test(유저 획득 테스트) 예산&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot; data-end=&quot;1414&quot; data-start=&quot;1281&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody data-end=&quot;1414&quot; data-start=&quot;1321&quot;&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;단계&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;국가&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;예산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1365&quot; data-start=&quot;1321&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1336&quot; data-start=&quot;1321&quot;&gt;CPI/PMF Test&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1354&quot; data-start=&quot;1336&quot; data-col-size=&quot;sm&quot;&gt;미국 + 1~2개 주요 국가&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1365&quot; data-start=&quot;1354&quot; data-col-size=&quot;sm&quot;&gt;주차 $200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1414&quot; data-start=&quot;1366&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1387&quot; data-start=&quot;1366&quot;&gt;Advanced/Extension&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1403&quot; data-start=&quot;1387&quot; data-col-size=&quot;sm&quot;&gt;미국 + 2개 이상 국가&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1414&quot; data-start=&quot;1403&quot; data-col-size=&quot;sm&quot;&gt;주차 $500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1437&quot; data-start=&quot;1421&quot; data-ke-size=&quot;size26&quot;&gt;퍼블리셔 협업 기준&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1648&quot; data-start=&quot;1439&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1486&quot; data-start=&quot;1439&quot;&gt;&lt;b&gt;2단계(PMF Test)&lt;/b&gt;: 글로벌 퍼블리셔와 빌드 공유 및 협업 논의 가능&lt;/li&gt;
&lt;li data-end=&quot;1529&quot; data-start=&quot;1487&quot;&gt;&lt;b&gt;3단계(Advanced Test)&lt;/b&gt;: 국내 퍼블리셔 협업 논의 가능&lt;/li&gt;
&lt;li data-end=&quot;1609&quot; data-start=&quot;1530&quot;&gt;KPI 수치에 &lt;b&gt;약간 미달&lt;/b&gt;해도, 퍼블리셔 관점에서 **소싱 조건(CPI, ROAS, Retention)**을 만족하면 협업 논의 가능&lt;/li&gt;
&lt;li data-end=&quot;1648&quot; data-start=&quot;1610&quot;&gt;협업 형태: &lt;b&gt;자체 서비스 또는 퍼블리셔 조건 비교 후 판단&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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-end=&quot;1671&quot; data-start=&quot;1655&quot; data-ke-size=&quot;size26&quot;&gt;퍼블리셔 선정 기준&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1795&quot; data-start=&quot;1673&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1769&quot; data-start=&quot;1673&quot;&gt;&lt;b&gt;계약 조건&lt;/b&gt; + &lt;b&gt;마케팅 계획&lt;/b&gt; 중심으로 판단
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1769&quot; data-start=&quot;1708&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1741&quot; data-start=&quot;1708&quot;&gt;마케팅 예산, 실행 방식, 유저 타겟 등이 포함되어야 함&lt;/li&gt;
&lt;li data-end=&quot;1769&quot; data-start=&quot;1744&quot;&gt;&lt;b&gt;현실성 및 실행 가능성&lt;/b&gt; 반드시 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1795&quot; data-start=&quot;1770&quot;&gt;마케팅 계획은 &lt;b&gt;계약서 상 명시&lt;/b&gt; 필요&lt;/li&gt;
&lt;/ul&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-end=&quot;1828&quot; data-start=&quot;1802&quot; data-ke-size=&quot;size26&quot;&gt;국내 vs 글로벌 퍼블리셔 선정 기준&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1966&quot; data-start=&quot;1830&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;조건&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 우선 선정 기준 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1915&quot; data-start=&quot;1875&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1887&quot; data-start=&quot;1875&quot;&gt;같은 조건일 경우&lt;/td&gt;
&lt;td data-end=&quot;1915&quot; data-start=&quot;1887&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;국내 퍼블리셔&lt;/b&gt; (커뮤니케이션 용이성)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1966&quot; data-start=&quot;1916&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1927&quot; data-start=&quot;1916&quot;&gt;글로벌 퍼블리셔&lt;/td&gt;
&lt;td data-end=&quot;1966&quot; data-start=&quot;1927&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;광고 인프라 자체 보유&lt;/b&gt; 여부 (예: Supersonic)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;1981&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2133&quot; data-start=&quot;1983&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2013&quot; data-start=&quot;1983&quot;&gt;KPI 기준 충족 시 &lt;b&gt;자체 서비스&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2049&quot; data-start=&quot;2014&quot;&gt;KPI 미달 시에도 &lt;b&gt;글로벌 퍼블리셔 협업 가능성 있음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2093&quot; data-start=&quot;2050&quot;&gt;퍼블리셔 판단은 단순 수치 외에도 &lt;b&gt;계약 조건, 마케팅 실행력&lt;/b&gt;이 핵심&lt;/li&gt;
&lt;li data-end=&quot;2133&quot; data-start=&quot;2094&quot;&gt;출시 전 단계별로 &lt;b&gt;철저한 내부/외부 평가&lt;/b&gt;를 통해 방향성 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발/마케팅 (UA)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/598</guid>
      <comments>https://parksh3641.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A3%BC%EC%B2%B4-%ED%8C%90%EB%8B%A8-%EA%B8%B0%EC%A4%80-%EB%B0%8F-%ED%8D%BC%EB%B8%94%EB%A6%AC%EC%85%94-%EC%84%A0%EC%A0%95-%EA%B8%B0%EC%A4%80#entry598comment</comments>
      <pubDate>Tue, 22 Jul 2025 12:22:02 +0900</pubDate>
    </item>
    <item>
      <title>윈도우10 11 24H2 성능 향상 차이 분석 비교</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B010-11-24H2-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-%EC%B0%A8%EC%9D%B4-%EB%B6%84%EC%84%9D-%EB%B9%84%EA%B5%90</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAq61/btsPqae32PK/4glzD1yVPdZHvupx3L5ozK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAq61/btsPqae32PK/4glzD1yVPdZHvupx3L5ozK/img.jpg&quot; data-alt=&quot;윈도우10 11 24H2 성능 향상 차이 분석 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAq61/btsPqae32PK/4glzD1yVPdZHvupx3L5ozK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAq61%2FbtsPqae32PK%2F4glzD1yVPdZHvupx3L5ozK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;640&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도우10 11 24H2 성능 향상 차이 분석 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;윈도우10&amp;nbsp;11&amp;nbsp;24H2&amp;nbsp;성능&amp;nbsp;향상&amp;nbsp;차이&amp;nbsp;분석&amp;nbsp;비교&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;성능 비교 (% 기준)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows 10 (기준점)&lt;/td&gt;
&lt;td&gt;Windows 11 24H2&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 성능 차이 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;3DMark Fire Strike CPU&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;90.5%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-9.5%&lt;/b&gt; ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Black Myth Wukong (프레임 생성)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;117.3%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+17.3%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;AMD Ryzen 7000 게이밍&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;110%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+10%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;7-Zip 압축&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;106%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+6%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PCMark 10 앱 시작&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-13%&lt;/b&gt; ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;업데이트 설치 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;154.6%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+54.6%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;업데이트 CPU 사용률&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-25%&lt;/b&gt; ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;메모리 할당&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;115-120%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+15-20%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;게임별 성능 비교 (FPS 기준)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 게임 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows 10 FPS&lt;/td&gt;
&lt;td&gt;Windows 11 24H2 FPS&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 성능 차이 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Counter-Strike 2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;292&lt;/td&gt;
&lt;td&gt;317&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+8.5%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cyberpunk 2077&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;179&lt;/td&gt;
&lt;td&gt;187&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+4.5%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Far Cry 6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;328&lt;/td&gt;
&lt;td&gt;371&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+13.1%&lt;/b&gt; ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Call of Duty&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;221&lt;/td&gt;
&lt;td&gt;219&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-0.9%&lt;/b&gt; ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Assassin's Creed&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-2.8%&lt;/b&gt; ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;CPU 사용률 비교&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 작업 유형 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows 10&lt;/td&gt;
&lt;td&gt;Windows 11 24H2&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 차이 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;게이밍 평균&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;23-73%&lt;/td&gt;
&lt;td&gt;21-76%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-2% ~ +3%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;압축 작업&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기준&lt;/td&gt;
&lt;td&gt;기준 + 6%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;+6%&lt;/b&gt; 효율성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;업데이트 시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;-25%&lt;/b&gt; 부하 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 분야 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows 10&lt;/td&gt;
&lt;td&gt;Windows 11 24H2&lt;/td&gt;
&lt;td&gt;추가/개선 사항&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용자 인터페이스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;클래식 시작 메뉴&lt;/td&gt;
&lt;td&gt;새로운 시작 메뉴, Phone Link 통합&lt;/td&gt;
&lt;td&gt;모던한 디자인, 중앙 정렬 작업 표시줄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파일 관리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기본 파일 탐색기&lt;/td&gt;
&lt;td&gt;7z, RAR 지원 내장, .TAR 압축 포맷 생성&lt;/td&gt;
&lt;td&gt;서드파티 앱 없이 압축 파일 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;보안&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기본 보안 기능&lt;/td&gt;
&lt;td&gt;JScript9Legacy로 향상된 보안, XSS 공격 방어 강화&lt;/td&gt;
&lt;td&gt;최신 보안 표준 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;AI 기능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;Copilot+ PC 전용: Live Captions, Windows Studio Effects, Paint Cocreator&lt;/td&gt;
&lt;td&gt;AI 기반 기능 추가 (NPU 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;명령어 도구&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PowerShell, CMD&lt;/td&gt;
&lt;td&gt;sudo 명령어 추가&lt;/td&gt;
&lt;td&gt;Linux 스타일 관리자 권한 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows 10&lt;/td&gt;
&lt;td&gt;Windows 11 24H2&lt;/td&gt;
&lt;td&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CPU&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1GHz 이상&lt;/td&gt;
&lt;td&gt;8세대 Intel/2세대 AMD Ryzen 이상&lt;/td&gt;
&lt;td&gt;Win11이 더 높은 요구사항&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;RAM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1GB (32비트), 2GB (64비트)&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;td&gt;Win11이 2배 이상 요구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;저장공간&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;16GB (32비트), 20GB (64비트)&lt;/td&gt;
&lt;td&gt;64GB&lt;/td&gt;
&lt;td&gt;Win11이 약 3배 더 요구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;TPM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;TPM 2.0 필수&lt;/td&gt;
&lt;td&gt;보안 칩 요구사항&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;UEFI&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;Secure Boot 지원 UEFI&lt;/td&gt;
&lt;td&gt;보안 부팅 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; OS 지원 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;종료일&lt;/td&gt;
&lt;td&gt;연장 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Windows 10&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2025년 10월 14일&lt;/td&gt;
&lt;td&gt;유료 연장 지원 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Windows 11 24H2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2027년 10월 (Pro), 2030년 10월 (Enterprise)&lt;/td&gt;
&lt;td&gt;장기 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windows 10을 계속 사용하는 경우:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게이밍에서 최대 성능이 필요한 경우&lt;/li&gt;
&lt;li&gt;구형 하드웨어를 사용하는 경우&lt;/li&gt;
&lt;li&gt;TPM 2.0이 없는 시스템&lt;/li&gt;
&lt;li&gt;안정성과 호환성을 우선시하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windows 11 24H2로 업그레이드하는 경우:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 하드웨어 (특히 AMD Ryzen 7000+ 시리즈)&lt;/li&gt;
&lt;li&gt;AI 기능 활용이 필요한 경우&lt;/li&gt;
&lt;li&gt;빠른 업데이트와 낮은 CPU 사용률을 원하는 경우&lt;/li&gt;
&lt;li&gt;장기적인 보안 지원이 필요한 경우&lt;/li&gt;
&lt;li&gt;최신 보안 기능이 중요한 경우&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/597</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B010-11-24H2-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-%EC%B0%A8%EC%9D%B4-%EB%B6%84%EC%84%9D-%EB%B9%84%EA%B5%90#entry597comment</comments>
      <pubDate>Mon, 21 Jul 2025 10:10:27 +0900</pubDate>
    </item>
    <item>
      <title>키움 OpenAPI랑 Flask로 쉽고 빠르게 만드는 자동매매 REST API</title>
      <link>https://parksh3641.tistory.com/entry/%ED%82%A4%EC%9B%80-OpenAPI%EB%9E%91-Flask%EB%A1%9C-%EC%89%BD%EA%B3%A0-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9E%90%EB%8F%99%EB%A7%A4%EB%A7%A4-REST-API</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLxfgW/btsPkB3IHAk/TGkRrkEdZB3JpD9CCL4Lt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLxfgW/btsPkB3IHAk/TGkRrkEdZB3JpD9CCL4Lt0/img.png&quot; data-alt=&quot;키움 OpenAPI랑 Flask로 쉽고 빠르게 만드는 자동매매 REST API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLxfgW/btsPkB3IHAk/TGkRrkEdZB3JpD9CCL4Lt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLxfgW%2FbtsPkB3IHAk%2FTGkRrkEdZB3JpD9CCL4Lt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;280&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키움 OpenAPI랑 Flask로 쉽고 빠르게 만드는 자동매매 REST API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;키움&amp;nbsp;OpenAPI랑&amp;nbsp;Flask로&amp;nbsp;쉽고&amp;nbsp;빠르게&amp;nbsp;만드는&amp;nbsp;자동매매&amp;nbsp;REST&amp;nbsp;API&lt;/h2&gt;
&lt;pre id=&quot;code_1752568229573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
import threading
from flask import Flask, request, jsonify, abort
from PyQt5.QtWidgets import QApplication
from PyQt5.QAxContainer import QAxWidget

app = Flask(__name__)
qt_app = QApplication(sys.argv)

kiwoom = QAxWidget(&quot;KHOPENAPI.KHOpenAPICtrl.1&quot;)
kiwoom.dynamicCall(&quot;CommConnect()&quot;)

data_received = False
price_list = []

API_KEY = &quot;your_secure_api_key_here&quot;  # 간단 인증용 키


def receive_tr_data(screen_no, rqname, trcode, recordname, prevnext, dat_len, error_code, msg, splm_msg):
    global data_received, price_list
    count = kiwoom.dynamicCall(&quot;GetRepeatCnt(QString, QString)&quot;, trcode, rqname)

    price_list.clear()
    for i in range(count):
        close_price = kiwoom.dynamicCall(&quot;GetCommData(QString, QString, int, QString)&quot;, trcode, rqname, i, &quot;현재가&quot;)
        close_price = int(close_price.strip().replace('-', ''))
        price_list.append(close_price)
    data_received = True


kiwoom.OnReceiveTrData.connect(receive_tr_data)


def get_price_data(code):
    global data_received
    data_received = False

    kiwoom.dynamicCall(&quot;SetInputValue(QString, QString)&quot;, &quot;종목코드&quot;, code)
    kiwoom.dynamicCall(&quot;SetInputValue(QString, QString)&quot;, &quot;기준일자&quot;, &quot;&quot;)
    kiwoom.dynamicCall(&quot;SetInputValue(QString, QString)&quot;, &quot;수정주가구분&quot;, &quot;1&quot;)
    kiwoom.dynamicCall(&quot;CommRqData(QString, QString, int, QString)&quot;, &quot;opt10081_req&quot;, &quot;opt10081&quot;, 0, &quot;0101&quot;)

    while not data_received:
        qt_app.processEvents()


def check_golden_cross():
    if len(price_list) &amp;lt; 20:
        return &quot;데이터 부족&quot;

    ma5 = sum(price_list[:5]) / 5
    ma20 = sum(price_list[:20]) / 20
    return &quot;BUY&quot; if ma5 &amp;gt; ma20 else &quot;HOLD&quot;


def send_order(code, qty, price, order_type=1, hoga=&quot;00&quot;):
    acc_no = kiwoom.dynamicCall(&quot;GetLoginInfo(QString)&quot;, &quot;ACCNO&quot;).split(';')[0]
    ret = kiwoom.dynamicCall(
        &quot;SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)&quot;,
        [&quot;시장가매수&quot;, &quot;0101&quot;, acc_no, order_type, code, qty, price, hoga, &quot;&quot;]
    )
    return ret


def check_auth():
    key = request.headers.get(&quot;X-API-KEY&quot;)
    if key != API_KEY:
        abort(401, &quot;Unauthorized&quot;)


@app.route(&quot;/signal&quot;)
def signal():
    check_auth()
    code = request.args.get(&quot;code&quot;, &quot;005930&quot;)
    try:
        get_price_data(code)
        signal = check_golden_cross()
        return jsonify({&quot;code&quot;: code, &quot;signal&quot;: signal, &quot;price_list&quot;: price_list[:20]})
    except Exception as e:
        return jsonify({&quot;error&quot;: str(e)}), 500


@app.route(&quot;/order&quot;, methods=[&quot;POST&quot;])
def order():
    check_auth()
    data = request.json
    if not data:
        return jsonify({&quot;error&quot;: &quot;JSON body required&quot;}), 400

    code = data.get(&quot;code&quot;)
    qty = data.get(&quot;qty&quot;, 1)
    price = data.get(&quot;price&quot;, 0)  # 0 = 시장가

    if not code:
        return jsonify({&quot;error&quot;: &quot;code is required&quot;}), 400

    try:
        ret = send_order(code, qty, price)
        if ret == 0:
            return jsonify({&quot;code&quot;: code, &quot;qty&quot;: qty, &quot;price&quot;: price, &quot;result&quot;: &quot;주문 성공&quot;})
        else:
            return jsonify({&quot;code&quot;: code, &quot;qty&quot;: qty, &quot;price&quot;: price, &quot;result&quot;: f&quot;주문 실패, 오류코드: {ret}&quot;}), 500
    except Exception as e:
        return jsonify({&quot;error&quot;: str(e)}), 500


def flask_thread():
    app.run(port=5000)


if __name__ == &quot;__main__&quot;:
    t = threading.Thread(target=flask_thread, daemon=True)
    t.start()
    sys.exit(qt_app.exec_())&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/596</guid>
      <comments>https://parksh3641.tistory.com/entry/%ED%82%A4%EC%9B%80-OpenAPI%EB%9E%91-Flask%EB%A1%9C-%EC%89%BD%EA%B3%A0-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9E%90%EB%8F%99%EB%A7%A4%EB%A7%A4-REST-API#entry596comment</comments>
      <pubDate>Tue, 15 Jul 2025 17:30:47 +0900</pubDate>
    </item>
    <item>
      <title>앱이  Android 15(API  수준 35) 이상을 타켓팅해야 함 수정 방법</title>
      <link>https://parksh3641.tistory.com/entry/%EC%95%B1%EC%9D%B4-Android-15API-%EC%88%98%EC%A4%80-35-%EC%9D%B4%EC%83%81%EC%9D%84-%ED%83%80%EC%BC%93%ED%8C%85%ED%95%B4%EC%95%BC-%ED%95%A8-%EC%88%98%EC%A0%95-%EB%B0%A9%EB%B2%95</link>
      <description>&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;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mLmWs/btsPjl0Guh2/i3qIMs6lRFGsfaZpTBEnoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mLmWs/btsPjl0Guh2/i3qIMs6lRFGsfaZpTBEnoK/img.png&quot; data-alt=&quot;앱이 Android 15(API 수준 35) 이상을 타켓팅해야 함 수정 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mLmWs/btsPjl0Guh2/i3qIMs6lRFGsfaZpTBEnoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmLmWs%2FbtsPjl0Guh2%2Fi3qIMs6lRFGsfaZpTBEnoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-filename=&quot;구글.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱이 Android 15(API 수준 35) 이상을 타켓팅해야 함 수정 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앱이&amp;nbsp;&amp;nbsp;Android&amp;nbsp;15(API&amp;nbsp;&amp;nbsp;수준&amp;nbsp;35)&amp;nbsp;이상을&amp;nbsp;타켓팅해야&amp;nbsp;함&amp;nbsp;수정&amp;nbsp;방법&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;pre id=&quot;code_1752542389117&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;앱이 Android 15(API 수준 35) 이상을 타겟팅해야 함
상태
앱 업데이트를 출시할 수 없게 됩니다(47일 남음).
배송된 날짜
2025년 7월 2일
기한
2025년 8월 31일
사용자에게 안전한 환경을 제공하기 위해 Google Play의 모든 앱은 대상 API 수준 요구사항을 충족해야 합니다.
2025년 8월 31일부터 최신 Android 출시로부터 1년 이내의 대상 API 수준을 타겟팅하지 않는 경우 앱을 업데이트할 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Target API Level 을 35이상으로 설정합니다. (현재 36까지 가능)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndAoF/btsPuNXz6cY/LXIDxSG0fKW7FTvffjdZx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndAoF/btsPuNXz6cY/LXIDxSG0fKW7FTvffjdZx1/img.png&quot; data-alt=&quot;앱이&amp;amp;nbsp;&amp;amp;nbsp;Android 15(API&amp;amp;nbsp;&amp;amp;nbsp;수준 35) 이상을 타켓팅해야 함 수정 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndAoF/btsPuNXz6cY/LXIDxSG0fKW7FTvffjdZx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndAoF%2FbtsPuNXz6cY%2FLXIDxSG0fKW7FTvffjdZx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;961&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;961&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱이&amp;nbsp;&amp;nbsp;Android 15(API&amp;nbsp;&amp;nbsp;수준 35) 이상을 타켓팅해야 함 수정 방법&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;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;요구사항&lt;/td&gt;
&lt;td&gt;Unity 안정화 LTS 버전 추천&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android 15(API 35) 이상&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Unity 2022.3.62f1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구글 결제 라이브러리 7이상&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Unity 2022.3.62f1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/구글 업로드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/595</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%95%B1%EC%9D%B4-Android-15API-%EC%88%98%EC%A4%80-35-%EC%9D%B4%EC%83%81%EC%9D%84-%ED%83%80%EC%BC%93%ED%8C%85%ED%95%B4%EC%95%BC-%ED%95%A8-%EC%88%98%EC%A0%95-%EB%B0%A9%EB%B2%95#entry595comment</comments>
      <pubDate>Tue, 15 Jul 2025 10:21:05 +0900</pubDate>
    </item>
    <item>
      <title>유니티 조치 필요 지원되는 버전의 Google Play 결제 라이브러리 7이상으로 이전하세요 해결 방법</title>
      <link>https://parksh3641.tistory.com/entry/%EC%A1%B0%EC%B9%98-%ED%95%84%EC%9A%94-%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EB%B2%84%EC%A0%84%EC%9D%98-Google-Play-%EA%B2%B0%EC%A0%9C-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EC%9D%B4%EC%A0%84%ED%95%98%EC%84%B8%EC%9A%94</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8p84y/btsPi2obN1z/YlWGvW80jWcNclKQWXPpi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8p84y/btsPi2obN1z/YlWGvW80jWcNclKQWXPpi1/img.png&quot; data-alt=&quot;In App Purchasing 4.13.0 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8p84y/btsPi2obN1z/YlWGvW80jWcNclKQWXPpi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8p84y%2FbtsPi2obN1z%2FYlWGvW80jWcNclKQWXPpi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;695&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;In App Purchasing 4.13.0 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조치&amp;nbsp;필요:&amp;nbsp;지원되는&amp;nbsp;버전의&amp;nbsp;Google&amp;nbsp;Play&amp;nbsp;결제&amp;nbsp;라이브러리로&amp;nbsp;이전하세요 &lt;br /&gt;&lt;br /&gt;Play&amp;nbsp;결제&amp;nbsp;라이브러리의&amp;nbsp;수명&amp;nbsp;주기&amp;nbsp;및&amp;nbsp;관련된&amp;nbsp;지원&amp;nbsp;중단&amp;nbsp;일정이&amp;nbsp;변경됩니다.&amp;nbsp;현재&amp;nbsp;이전&amp;nbsp;버전의&amp;nbsp;라이브러리를&amp;nbsp;사용&amp;nbsp;중이시므로&amp;nbsp;앞으로&amp;nbsp;지켜야&amp;nbsp;할&amp;nbsp;새로운&amp;nbsp;주요&amp;nbsp;일정을&amp;nbsp;알려드립니다. &lt;br /&gt;&lt;br /&gt;2025년 8월 31일까지 모든 신규 앱과 기존 앱 업데이트에서 결제 라이브러리 버전 7 이상을 사용해야 합니다. 앱을 업데이트하기 위해 시간이 더 필요한 경우 2025년 11월 1일까지 기한 연장을 요청할 수 있습니다. &lt;br /&gt;&lt;br /&gt;여기에서&amp;nbsp;지원&amp;nbsp;중단에&amp;nbsp;대해&amp;nbsp;자세히&amp;nbsp;알아보세요. &lt;br /&gt;&lt;br /&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;Play&amp;nbsp;Console에서&amp;nbsp;Play&amp;nbsp;결제&amp;nbsp;라이브러리&amp;nbsp;6보다&amp;nbsp;낮은&amp;nbsp;버전을&amp;nbsp;사용하는&amp;nbsp;앱은&amp;nbsp;게시&amp;nbsp;및&amp;nbsp;업데이트가&amp;nbsp;차단됩니다. &lt;br /&gt;&lt;br /&gt;다음&amp;nbsp;단계:&amp;nbsp;최신&amp;nbsp;버전의&amp;nbsp;Play&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;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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;유니티 패키지 In App Purchasing 을 &lt;b&gt;4.13.0&lt;/b&gt; 이상의 버전으로 업데이트 해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패키지 관리자&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 가서&lt;span&gt;&amp;nbsp;&lt;/span&gt;왼쪽 상단 모서리에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;+&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 클릭하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이름으로 패키지 추가를 선택하 고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;com.unity.purchasing&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이라는 이름을 추가&lt;span&gt;&amp;nbsp;&lt;/span&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;추가를&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클릭합니다 .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 4.13.0이 설치됩니다.&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;현재 버전 : 4.13.0 (2025년 7월 기준)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;요구사항&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;&lt;b&gt;권장 Unity 버전 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;Android 15(API 35) 대응&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;&lt;b&gt;Unity 2022.3.62f1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;구글 결제 라이브러리 7 이상&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;&lt;b&gt;Unity 2022.3.62f1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/유니티 빌드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/500</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%A1%B0%EC%B9%98-%ED%95%84%EC%9A%94-%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EB%B2%84%EC%A0%84%EC%9D%98-Google-Play-%EA%B2%B0%EC%A0%9C-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A1%9C-%EC%9D%B4%EC%A0%84%ED%95%98%EC%84%B8%EC%9A%94#entry500comment</comments>
      <pubDate>Tue, 15 Jul 2025 10:19:32 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 구글 애드몹 미디에이션 구현 방법</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EB%AA%B9-%EB%AF%B8%EB%94%94%EC%97%90%EC%9D%B4%EC%85%98-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Unity.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCgIl/btsPhsADfop/jfwSgHqSsL7ITyEMf9M7Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCgIl/btsPhsADfop/jfwSgHqSsL7ITyEMf9M7Dk/img.png&quot; data-alt=&quot;유니티 C# 구글 애드몹 미디에이션 구현 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCgIl/btsPhsADfop/jfwSgHqSsL7ITyEMf9M7Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCgIl%2FbtsPhsADfop%2FjfwSgHqSsL7ITyEMf9M7Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;400&quot; data-filename=&quot;Unity.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 C# 구글 애드몹 미디에이션 구현 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;구글&amp;nbsp;애드몹&amp;nbsp;미디에이션&amp;nbsp;구현&amp;nbsp;방법&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;보상형 광고 구현&lt;/h2&gt;
&lt;pre id=&quot;code_1752541284356&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using UnityEngine.Events;

public class AdmobReward : MonoBehaviour
{
    public static AdmobReward Instance;

    private string androidId = &quot;ca-app-pub-3940256099942544/5224354917&quot;;
    private string iosId = &quot;ca-app-pub-3940256099942544/1712485313&quot;;
    private string adUnitId = &quot;&quot;;

    private RewardedAd rewardedAd;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

#if UNITY_ANDROID
        adUnitId = androidId;
#elif  UNITY_IOS
        adUnitId = iosId;
#endif
    }

    void Start()
    {
        MobileAds.RaiseAdEventsOnUnityMainThread = true;

        RequestConfiguration requestConfiguration = new RequestConfiguration.Builder()
            .SetTagForChildDirectedTreatment(TagForChildDirectedTreatment.Unspecified)
            .build();
        MobileAds.SetRequestConfiguration(requestConfiguration);

        MobileAds.Initialize((InitializationStatus initStatus) =&amp;gt; {
            Dictionary&amp;lt;string, AdapterStatus&amp;gt; adapterStatusMap = initStatus.getAdapterStatusMap();
            foreach (string adapterClassName in adapterStatusMap.Keys)
            {
                AdapterStatus status = adapterStatusMap[adapterClassName];
                Debug.Log(&quot;Adapter: &quot; + adapterClassName + &quot; Status: &quot; + status.InitializationState + &quot; Description: &quot; + status.Description);
            }
            Debug.Log(&quot;AdMob Mediation initialized&quot;);
            LoadRewardedAd();
        });
    }

    public void LoadRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }

        Debug.Log(&quot;Loading mediated rewarded ad.&quot;);

        AdRequest adRequest = new AdRequest.Builder()
            .AddExtra(&quot;npa&quot;, PlayerPrefs.GetInt(&quot;gdpr_consent&quot;, 0).ToString())
            .Build();

        RewardedAd.Load(adUnitId, adRequest,
            (RewardedAd ad, LoadAdError error) =&amp;gt;
            {
                if (error != null || ad == null)
                {
                    Debug.LogError(&quot;Mediated rewarded ad failed to load: &quot; + error);
                    return;
                }
                Debug.Log(&quot;Mediated rewarded ad loaded successfully&quot;);
                rewardedAd = ad;
                RegisterEventHandlers(ad);
            });
    }

    private void RegisterEventHandlers(RewardedAd ad)
    {
        ad.OnAdFullScreenContentClosed += () =&amp;gt;
        {
            Debug.Log(&quot;Mediated ad closed, reloading...&quot;);
            LoadRewardedAd();
        };

        ad.OnAdFullScreenContentFailed += (AdError error) =&amp;gt;
        {
            Debug.LogError(&quot;Mediated ad failed to show: &quot; + error);
            LoadRewardedAd();
        };

        ad.OnAdPaid += (AdValue adValue) =&amp;gt;
        {
            Debug.Log(&quot;Mediated ad paid: &quot; + adValue.Value + &quot; &quot; + adValue.CurrencyCode);
        };
    }

    public void ShowAd(int number, Action onAdCompleted = null)
    {
        Debug.Log(&quot;Attempting to show mediated ad for reward type: &quot; + number);

        bool adsRemoved = PlayerPrefs.GetInt(&quot;ads_removed&quot;, 0) == 1;

        if (adsRemoved)
        {
            Debug.Log(&quot;Ads removed, giving reward directly without showing ad&quot;);
            GetReward(number);
            onAdCompleted?.Invoke();
            return;
        }

        if (rewardedAd != null &amp;amp;&amp;amp; rewardedAd.CanShowAd())
        {
            rewardedAd.Show((Reward reward) =&amp;gt;
            {
                Debug.Log(&quot;Mediated ad watched successfully! Rewarding player.&quot;);
                GetReward(number);
                onAdCompleted?.Invoke();
            });
        }
        else
        {
            Debug.LogWarning(&quot;Mediated ad not ready. Reloading...&quot;);
            LoadRewardedAd();
            GetReward(number);
            onAdCompleted?.Invoke();
        }
    }

    void GetReward(int number)
    {
        Debug.Log(&quot;Giving reward for type: &quot; + number);
        switch (number)
        {
            case 0:
                break;
            case 1:
                break;
            default:
                Debug.Log(&quot;Unknown reward type: &quot; + number);
                break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;배너 광고 구현&lt;/h2&gt;
&lt;pre id=&quot;code_1752541389493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds;
using GoogleMobileAds.Api;
using System;

public class AdmobBanner : MonoBehaviour
{
    public static AdmobBanner Instance;

    private string androidId = &quot;ca-app-pub-3940256099942544/6300978111&quot;;
    private string iosId = &quot;ca-app-pub-3940256099942544/2934735716&quot;;
    private string adUnitId = &quot;&quot;;
    private BannerView _bannerView;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

#if UNITY_ANDROID
        adUnitId = androidId;
#elif  UNITY_IOS
        adUnitId = iosId;
#endif
    }

    public void Start()
    {
        Instance = this;

        RequestConfiguration requestConfiguration = new RequestConfiguration.Builder()
            .SetTagForChildDirectedTreatment(TagForChildDirectedTreatment.Unspecified)
            .build();
        MobileAds.SetRequestConfiguration(requestConfiguration);

        MobileAds.Initialize((InitializationStatus initStatus) =&amp;gt;
        {
            Dictionary&amp;lt;string, AdapterStatus&amp;gt; adapterStatusMap = initStatus.getAdapterStatusMap();
            foreach (string adapterClassName in adapterStatusMap.Keys)
            {
                AdapterStatus status = adapterStatusMap[adapterClassName];
                Debug.Log(&quot;Banner Adapter: &quot; + adapterClassName + &quot; Status: &quot; + status.InitializationState);
            }
            Debug.Log(&quot;AdMob Banner Mediation initialized&quot;);

            if (SaveDataManager.Instance.SaveData.IsRemoveBanner)
            {
                if (DateTime.Now &amp;lt; SaveDataManager.Instance.SaveData.RemoveBannerExpiryDate)
                {
                    Debug.Log(&quot;Banner ads removed by purchase&quot;);
                }
                else
                {
                    SaveDataManager.Instance.SaveData.IsRemoveBanner = false;
                    SaveDataManager.Instance.WriteSaveData();
                    Debug.Log(&quot;Banner ad removal expired&quot;);
                    LoadAd();
                }
            }
            else
            {
#if UNITY_IOS
            return; 
#endif
                LoadAd();
            }
        });
    }

    public void LoadAd()
    {
        if (_bannerView == null)
        {
            CreateBannerView();
        }

        var adRequest = new AdRequest.Builder()
            .AddExtra(&quot;npa&quot;, PlayerPrefs.GetInt(&quot;gdpr_consent&quot;, 0).ToString())
            .Build();

        Debug.Log(&quot;Loading mediated banner ad.&quot;);
        _bannerView.LoadAd(adRequest);
    }

    public void CreateBannerView()
    {
        Debug.Log(&quot;Creating mediated banner view&quot;);

        if (_bannerView != null)
        {
            DestroyAd();
        }

        AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);

        _bannerView = new BannerView(adUnitId, adaptiveSize, AdPosition.Bottom);

        ListenToAdEvents();
    }

    private void ListenToAdEvents()
    {
        _bannerView.OnBannerAdLoaded += () =&amp;gt;
        {
            Debug.Log(&quot;Mediated banner view loaded successfully&quot;);
        };

        _bannerView.OnBannerAdLoadFailed += (LoadAdError error) =&amp;gt;
        {
            Debug.LogError(&quot;Mediated banner view failed to load: &quot; + error);
        };

        _bannerView.OnAdClicked += () =&amp;gt;
        {
            Debug.Log(&quot;Mediated banner view was clicked.&quot;);
        };

        _bannerView.OnAdFullScreenContentOpened += () =&amp;gt;
        {
            Debug.Log(&quot;Mediated banner view full screen content opened.&quot;);
        };

        _bannerView.OnAdFullScreenContentClosed += () =&amp;gt;
        {
            Debug.Log(&quot;Mediated banner view full screen content closed.&quot;);
        };

        _bannerView.OnAdPaid += (AdValue adValue) =&amp;gt;
        {
            Debug.Log(&quot;Mediated banner ad paid: &quot; + adValue.Value + &quot; &quot; + adValue.CurrencyCode);
        };
    }

    public void DestroyAd()
    {
        if (_bannerView != null)
        {
            Debug.Log(&quot;Destroying mediated banner ad.&quot;);
            _bannerView.Destroy();
            _bannerView = null;
        }
    }

    private void OnDisable()
    {
        DestroyAd();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전면 광고 구현&lt;/h2&gt;
&lt;pre id=&quot;code_1752541449447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds;
using GoogleMobileAds.Api;

public class AdmobInterstitial : MonoBehaviour
{
    public static AdmobInterstitial Instance;

    private string androidId = &quot;ca-app-pub-3940256099942544/1033173712&quot;;
    private string iosId = &quot;ca-app-pub-3940256099942544/4411468910&quot;;
    private string adUnitId = &quot;&quot;;

    private InterstitialAd interstitialAd;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

#if UNITY_ANDROID
        adUnitId = androidId;
#elif UNITY_IOS
        adUnitId = iosId;
#endif
    }

    void Start()
    {
        RequestConfiguration requestConfiguration = new RequestConfiguration.Builder()
            .SetTagForChildDirectedTreatment(TagForChildDirectedTreatment.Unspecified)
            .build();
        MobileAds.SetRequestConfiguration(requestConfiguration);

        MobileAds.Initialize(initStatus =&amp;gt;
        {
            Debug.Log(&quot;AdMob Interstitial initialized&quot;);
            LoadAd();
        });
    }

    public void LoadAd()
    {
        if (interstitialAd != null)
        {
            interstitialAd.Destroy();
            interstitialAd = null;
        }

        var adRequest = new AdRequest.Builder()
            .AddExtra(&quot;npa&quot;, PlayerPrefs.GetInt(&quot;gdpr_consent&quot;, 0).ToString())
            .Build();

        InterstitialAd.Load(adUnitId, adRequest, (InterstitialAd ad, LoadAdError error) =&amp;gt;
        {
            if (error != null || ad == null)
            {
                Debug.LogError(&quot;Failed to load interstitial ad: &quot; + error);
                return;
            }

            interstitialAd = ad;
            Debug.Log(&quot;Interstitial ad loaded&quot;);

            RegisterAdEvents(interstitialAd);
        });
    }

    public void ShowAd()
    {
        if (interstitialAd != null &amp;amp;&amp;amp; interstitialAd.CanShowAd())
        {
            interstitialAd.Show();
        }
        else
        {
            Debug.LogWarning(&quot;Interstitial ad is not ready yet.&quot;);
            LoadAd(); // 로드 다시 시도
        }
    }

    private void RegisterAdEvents(InterstitialAd ad)
    {
        ad.OnAdFullScreenContentOpened += () =&amp;gt;
        {
            Debug.Log(&quot;Interstitial ad full screen content opened.&quot;);
        };

        ad.OnAdFullScreenContentClosed += () =&amp;gt;
        {
            Debug.Log(&quot;Interstitial ad full screen content closed.&quot;);
            LoadAd(); // 광고 닫힌 후 다시 로드
        };

        ad.OnAdImpressionRecorded += () =&amp;gt;
        {
            Debug.Log(&quot;Interstitial ad impression recorded.&quot;);
        };

        ad.OnAdClicked += () =&amp;gt;
        {
            Debug.Log(&quot;Interstitial ad clicked.&quot;);
        };

        ad.OnAdFullScreenContentFailed += (AdError error) =&amp;gt;
        {
            Debug.LogError(&quot;Interstitial ad failed to show: &quot; + error);
        };

        ad.OnAdPaid += (AdValue adValue) =&amp;gt;
        {
            Debug.Log(&quot;Interstitial ad paid: &quot; + adValue.Value + &quot; &quot; + adValue.CurrencyCode);
        };
    }

    private void OnDestroy()
    {
        if (interstitialAd != null)
        {
            interstitialAd.Destroy();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/594</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EB%AA%B9-%EB%AF%B8%EB%94%94%EC%97%90%EC%9D%B4%EC%85%98-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95#entry594comment</comments>
      <pubDate>Tue, 15 Jul 2025 10:04:15 +0900</pubDate>
    </item>
    <item>
      <title>루아 Lua 메이플스토리 월드 옛날 메이플과 비슷하게 구현 방법 가이드</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-%EC%98%9B%EB%82%A0-%EB%A9%94%EC%9D%B4%ED%94%8C%EA%B3%BC-%EB%B9%84%EC%8A%B7%ED%95%98%EA%B2%8C-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;루아&amp;nbsp;Lua&amp;nbsp;메이플스토리&amp;nbsp;월드&amp;nbsp;옛날&amp;nbsp;메이플과&amp;nbsp;비슷하게&amp;nbsp;구현&amp;nbsp;방법&amp;nbsp;가이드&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 공격 시스템&lt;/h2&gt;
&lt;pre id=&quot;code_1738214534065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function attack(player)
    local damage = math.random(10, 20)  -- 데미지 범위 설정
    local target = player:getTarget()

    if target then
        target:takeDamage(damage)
        player:sendMessage(&quot;공격 성공! &quot; .. damage .. &quot; 데미지를 입혔습니다.&quot;)
    else
        player:sendMessage(&quot;공격할 대상이 없습니다.&quot;)
    end
end&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;h2 data-ke-size=&quot;size26&quot;&gt;2. 점프 및 이동 제어&lt;/h2&gt;
&lt;pre id=&quot;code_1738214563689&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function onKeyPress(player, key)
    if key == &quot;left&quot; then
        player:move(-5, 0)  -- 왼쪽으로 이동
    elseif key == &quot;right&quot; then
        player:move(5, 0)  -- 오른쪽으로 이동
    elseif key == &quot;space&quot; then
        if player:isOnGround() then
            player:jump(10)  -- 점프 높이
        end
    end
end&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;h2 data-ke-size=&quot;size26&quot;&gt;3. 몬스터 스폰 및 AI&lt;/h2&gt;
&lt;pre id=&quot;code_1738214575869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function spawnMonster(map)
    local monster = createEntity(&quot;Snail&quot;, map:getSpawnPoint())
    monster:setHealth(50)
    monster:setAI(&quot;simpleAI&quot;)
end

function simpleAI(monster)
    while monster:isAlive() do
        local direction = math.random(0, 1) == 0 and -1 or 1
        monster:move(direction * 2, 0)
        wait(1)  -- 1초마다 움직임 변경
    end
end&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;h2 data-ke-size=&quot;size26&quot;&gt;4. NPC 및 대화 시스템&lt;/h2&gt;
&lt;pre id=&quot;code_1738214587587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function onTalkToNPC(player, npc)
    npc:showDialogue({
        &quot;안녕하세요! 저는 이 마을의 주민입니다.&quot;,
        &quot;옛날 메이플이 그리우시죠?&quot;,
        &quot;도움이 필요하시면 언제든지 말해주세요!&quot;
    })
end&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;h2 data-ke-size=&quot;size26&quot;&gt;5. 퀘스트 시스템&lt;/h2&gt;
&lt;pre id=&quot;code_1738214599850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;quests = {}

function startQuest(player, questID)
    quests[player] = questID
    player:sendMessage(&quot;퀘스트 시작: &quot; .. questID)
end

function completeQuest(player, questID)
    if quests[player] == questID then
        player:addEXP(100)  -- 경험치 지급
        player:sendMessage(&quot;퀘스트 완료! 100 경험치를 획득했습니다.&quot;)
        quests[player] = nil
    end
end&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;h2 data-ke-size=&quot;size26&quot;&gt;6. 아이템 및 장비 시스템&lt;/h2&gt;
&lt;pre id=&quot;code_1738214611941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;items = {}

function giveItem(player, itemName)
    if not items[player] then items[player] = {} end
    table.insert(items[player], itemName)
    player:sendMessage(itemName .. &quot;을(를) 획득했습니다!&quot;)
end

function equipItem(player, itemName)
    if items[player] and table.contains(items[player], itemName) then
        player:equip(itemName)
        player:sendMessage(itemName .. &quot;을(를) 장착했습니다!&quot;)
    end
end&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/MSW 루아 (Lua)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/592</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-%EC%98%9B%EB%82%A0-%EB%A9%94%EC%9D%B4%ED%94%8C%EA%B3%BC-%EB%B9%84%EC%8A%B7%ED%95%98%EA%B2%8C-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-%EA%B0%80%EC%9D%B4%EB%93%9C#entry592comment</comments>
      <pubDate>Thu, 30 Jan 2025 15:24:14 +0900</pubDate>
    </item>
    <item>
      <title>모바일 게임 출시 후 구글 광고 리텐션 UA 정리</title>
      <link>https://parksh3641.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EA%B4%91%EA%B3%A0-%EB%A6%AC%ED%85%90%EC%85%98-%EC%A0%95%EB%A6%AC</link>
      <description>&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;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuc4p/btsPhs1JQHn/jSVgoooLnodMQgTlds7EJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuc4p/btsPhs1JQHn/jSVgoooLnodMQgTlds7EJ1/img.png&quot; data-alt=&quot;모바일 게임 출시 후 구글 광고 리텐션 UA 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuc4p/btsPhs1JQHn/jSVgoooLnodMQgTlds7EJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftuc4p%2FbtsPhs1JQHn%2FjSVgoooLnodMQgTlds7EJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;400&quot; data-filename=&quot;구글.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일 게임 출시 후 구글 광고 리텐션 UA 정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;80&quot; data-start=&quot;56&quot; data-ke-size=&quot;size26&quot;&gt;모바일&amp;nbsp;게임&amp;nbsp;출시&amp;nbsp;후&amp;nbsp;구글&amp;nbsp;광고&amp;nbsp;리텐션&amp;nbsp;UA&amp;nbsp;정리&lt;/h2&gt;
&lt;h2 data-end=&quot;91&quot; data-start=&quot;82&quot; data-ke-size=&quot;size26&quot;&gt;준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;177&quot; data-start=&quot;92&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;118&quot; data-start=&quot;92&quot;&gt;출시 후 1개월 이내의 게임 (또는 예정작)&lt;/li&gt;
&lt;li data-end=&quot;133&quot; data-start=&quot;119&quot;&gt;광고 예산 140만 원&lt;/li&gt;
&lt;li data-end=&quot;149&quot; data-start=&quot;134&quot;&gt;Google Ads 계정&lt;/li&gt;
&lt;li data-end=&quot;177&quot; data-start=&quot;150&quot;&gt;지표 분석 툴 (예: 뒤끝, Firebase)&lt;/li&gt;
&lt;/ul&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-end=&quot;203&quot; data-start=&quot;184&quot; data-ke-size=&quot;size26&quot;&gt;실행 순서 (최소 기준)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;326&quot; data-start=&quot;204&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;212&quot; data-start=&quot;204&quot;&gt;게임 출시&lt;/li&gt;
&lt;li data-end=&quot;234&quot; data-start=&quot;213&quot;&gt;구글애즈 계정에 140만 원 충전&lt;/li&gt;
&lt;li data-end=&quot;307&quot; data-start=&quot;235&quot;&gt;광고 캠페인 세팅
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;307&quot; data-start=&quot;253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;269&quot; data-start=&quot;253&quot;&gt;캠페인 유형: 앱 설치&lt;/li&gt;
&lt;li data-end=&quot;287&quot; data-start=&quot;273&quot;&gt;단가 설정: 미설정&lt;/li&gt;
&lt;li data-end=&quot;307&quot; data-start=&quot;291&quot;&gt;이미지 및 영상 소재 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;326&quot; data-start=&quot;308&quot;&gt;하루 광고비 20만 원 집행&lt;/li&gt;
&lt;/ol&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-end=&quot;344&quot; data-start=&quot;333&quot; data-ke-size=&quot;size26&quot;&gt;권장 사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;453&quot; data-start=&quot;345&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;363&quot; data-start=&quot;345&quot;&gt;하루 예산 40만 원으로 증액&lt;/li&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;364&quot;&gt;이미지 소재 20장 이상&lt;/li&gt;
&lt;li data-end=&quot;403&quot; data-start=&quot;380&quot;&gt;가로/세로 영상 각각 20개 이상 제작&lt;/li&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;404&quot;&gt;MMP 도입: AppsFlyer, Adjust 등&lt;/li&gt;
&lt;li data-end=&quot;453&quot; data-start=&quot;434&quot;&gt;Facebook 광고 계정 활용&lt;/li&gt;
&lt;/ul&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-end=&quot;474&quot; data-start=&quot;460&quot; data-ke-size=&quot;size26&quot;&gt;핵심 지표 기준&lt;/h2&gt;
&lt;h3 data-end=&quot;494&quot; data-start=&quot;476&quot; data-ke-size=&quot;size23&quot;&gt;리텐션 기준 (장르 평균)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;661&quot; data-start=&quot;495&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;597&quot; data-start=&quot;495&quot;&gt;&lt;b&gt;D1 유지율&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;597&quot; data-start=&quot;510&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;525&quot; data-start=&quot;510&quot;&gt;30% 이상: 기본 이상&lt;/li&gt;
&lt;li data-end=&quot;545&quot; data-start=&quot;528&quot;&gt;35% 이상: 손익분기 가능&lt;/li&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;548&quot;&gt;40% 이상: 퍼블리셔 협상 가능&lt;/li&gt;
&lt;li data-end=&quot;597&quot; data-start=&quot;571&quot;&gt;60% 이상: 대형 퍼블리셔 및 수익화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;628&quot; data-start=&quot;599&quot;&gt;&lt;b&gt;D7 유지율&lt;/b&gt;&lt;br /&gt;평균: 8% ~ 12%&lt;/li&gt;
&lt;li data-end=&quot;661&quot; data-start=&quot;630&quot;&gt;&lt;b&gt;D30 유지율&lt;/b&gt;&lt;br /&gt;평균: 2.5% ~ 5%&lt;/li&gt;
&lt;/ul&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-end=&quot;679&quot; data-start=&quot;668&quot; data-ke-size=&quot;size26&quot;&gt;ROAS 기준&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;750&quot; data-start=&quot;680&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;715&quot; data-start=&quot;680&quot;&gt;&lt;b&gt;D1 ROAS 30%&lt;/b&gt; 이상 &amp;rarr; 무난한 초기 회수 가능&lt;/li&gt;
&lt;li data-end=&quot;750&quot; data-start=&quot;716&quot;&gt;&lt;b&gt;D30 ROAS 100%&lt;/b&gt; 이상 &amp;rarr; 수익성 게임 판단&lt;/li&gt;
&lt;/ul&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-end=&quot;768&quot; data-start=&quot;757&quot; data-ke-size=&quot;size26&quot;&gt;사례 분석&lt;/h2&gt;
&lt;h3 data-end=&quot;787&quot; data-start=&quot;770&quot; data-ke-size=&quot;size23&quot;&gt;사례 1 &amp;ndash; 리뉴얼 결정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;873&quot; data-start=&quot;788&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;804&quot; data-start=&quot;788&quot;&gt;게임명: 모여라 무명용사단&lt;/li&gt;
&lt;li data-end=&quot;816&quot; data-start=&quot;805&quot;&gt;CPI: 500원&lt;/li&gt;
&lt;li data-end=&quot;830&quot; data-start=&quot;817&quot;&gt;D1 리텐션: 21%&lt;/li&gt;
&lt;li data-end=&quot;846&quot; data-start=&quot;831&quot;&gt;하루 광고비: 30만 원&lt;/li&gt;
&lt;li data-end=&quot;860&quot; data-start=&quot;847&quot;&gt;일 수익: 40만 원&lt;/li&gt;
&lt;li data-end=&quot;873&quot; data-start=&quot;861&quot;&gt;결과: 리뉴얼 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;894&quot; data-start=&quot;875&quot; data-ke-size=&quot;size23&quot;&gt;사례 2 &amp;ndash; 수익 증대 성공&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;965&quot; data-start=&quot;895&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;908&quot; data-start=&quot;895&quot;&gt;D1 리텐션: 32%&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;909&quot;&gt;모객 단가: 2100원&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;924&quot;&gt;초기 월 수익: 500만 원&lt;/li&gt;
&lt;li data-end=&quot;965&quot; data-start=&quot;942&quot;&gt;현재 월 수익: 2000~3000만 원&lt;/li&gt;
&lt;/ul&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-end=&quot;988&quot; data-start=&quot;972&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 전략 요약&lt;/h2&gt;
&lt;h3 data-end=&quot;1003&quot; data-start=&quot;990&quot; data-ke-size=&quot;size23&quot;&gt;가장 중요한 지표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1037&quot; data-start=&quot;1004&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;1004&quot;&gt;리텐션 (D1, D7, D30)&lt;/li&gt;
&lt;li data-end=&quot;1037&quot; data-start=&quot;1024&quot;&gt;모객 단가 (CPI)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1047&quot; data-start=&quot;1039&quot; data-ke-size=&quot;size23&quot;&gt;실행 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1164&quot; data-start=&quot;1048&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1077&quot; data-start=&quot;1048&quot;&gt;&lt;b&gt;D1 30% 미만&lt;/b&gt;: 온보딩 UX 집중 개선&lt;/li&gt;
&lt;li data-end=&quot;1108&quot; data-start=&quot;1078&quot;&gt;&lt;b&gt;D7 10% 미만&lt;/b&gt;: 전환/리텐션 콘텐츠 추가&lt;/li&gt;
&lt;li data-end=&quot;1138&quot; data-start=&quot;1109&quot;&gt;&lt;b&gt;D30 3% 미만&lt;/b&gt;: 메타 시스템 구축 고려&lt;/li&gt;
&lt;li data-end=&quot;1164&quot; data-start=&quot;1139&quot;&gt;광고 소재 A/B 테스트는 반복적으로 수행&lt;/li&gt;
&lt;/ul&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-end=&quot;1178&quot; data-start=&quot;1171&quot; data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1545&quot; data-start=&quot;1180&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1321&quot; data-start=&quot;1278&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1288&quot; data-start=&quot;1278&quot;&gt;리텐션 D1&lt;/td&gt;
&lt;td data-end=&quot;1321&quot; data-start=&quot;1288&quot; data-col-size=&quot;sm&quot;&gt;30% 이상 (최소)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1367&quot; data-start=&quot;1322&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1332&quot; data-start=&quot;1322&quot;&gt;리텐션 D7&lt;/td&gt;
&lt;td data-end=&quot;1367&quot; data-start=&quot;1332&quot; data-col-size=&quot;sm&quot;&gt;10% 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1413&quot; data-start=&quot;1368&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1378&quot; data-start=&quot;1368&quot;&gt;리텐션 D30&lt;/td&gt;
&lt;td data-end=&quot;1413&quot; data-start=&quot;1378&quot; data-col-size=&quot;sm&quot;&gt;3~5% 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1462&quot; data-start=&quot;1414&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1427&quot; data-start=&quot;1414&quot;&gt;D1 ROAS&lt;/td&gt;
&lt;td data-end=&quot;1462&quot; data-start=&quot;1427&quot; data-col-size=&quot;sm&quot;&gt;30% 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1506&quot; data-start=&quot;1463&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1476&quot; data-start=&quot;1463&quot;&gt;D30 ROAS&lt;/td&gt;
&lt;td data-end=&quot;1506&quot; data-start=&quot;1476&quot; data-col-size=&quot;sm&quot;&gt;100% 이상 (손익분기점)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1545&quot; data-start=&quot;1507&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1520&quot; data-start=&quot;1507&quot;&gt;CPI&lt;/td&gt;
&lt;td data-end=&quot;1545&quot; data-start=&quot;1520&quot; data-col-size=&quot;sm&quot;&gt;장르 및 시장에 따라 달라짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/591</guid>
      <comments>https://parksh3641.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EA%B4%91%EA%B3%A0-%EB%A6%AC%ED%85%90%EC%85%98-%EC%A0%95%EB%A6%AC#entry591comment</comments>
      <pubDate>Wed, 18 Dec 2024 20:29:14 +0900</pubDate>
    </item>
    <item>
      <title>리엑트 네이티브 기본 프로젝트 구조 및 문법 설명 React Native</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A6%AC%EC%97%91%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EA%B8%B0%EB%B3%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EB%AC%B8%EB%B2%95-%EC%84%A4%EB%AA%85-React-Native</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RT9Im/btsKZwAFwcm/StZzwHKGpORQ9Xnv4pxfUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RT9Im/btsKZwAFwcm/StZzwHKGpORQ9Xnv4pxfUk/img.png&quot; data-alt=&quot;리엑트 네이티브 기본 프로젝트 구조 및 문법 설명 React Native&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RT9Im/btsKZwAFwcm/StZzwHKGpORQ9Xnv4pxfUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRT9Im%2FbtsKZwAFwcm%2FStZzwHKGpORQ9Xnv4pxfUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;631&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리엑트 네이티브 기본 프로젝트 구조 및 문법 설명 React Native&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리엑트&amp;nbsp;네이티브&amp;nbsp;기본&amp;nbsp;프로젝트&amp;nbsp;구조&amp;nbsp;및&amp;nbsp;문법&amp;nbsp;설명&amp;nbsp;React&amp;nbsp;Native&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로젝트 폴더 구조&lt;/h2&gt;
&lt;pre id=&quot;code_1732848198399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my-project/
├── App.tsx           # 애플리케이션의 진입점
├── assets/           # 이미지, 폰트 등 정적 리소스 폴더
├── node_modules/     # 설치된 npm 패키지
├── package.json      # 프로젝트 의존성과 스크립트 설정 파일
├── tsconfig.json     # TypeScript 설정 파일
├── app.json          # Expo 프로젝트 설정 파일
└── babel.config.js   # Babel 설정 파일 (코드 변환기)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 주요 파일 설명&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1. App.tsx&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱의 진입점으로, 첫 화면을 구성하는 곳입니다.&lt;/li&gt;
&lt;li&gt;여기에서 컴포넌트와 화면을 렌더링하며 필요한 로직을 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848219105&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;Text&amp;gt;Welcome to React Native!&amp;lt;/Text&amp;gt;
    &amp;lt;/View&amp;gt;
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff',
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2. assets/&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지, 폰트, 아이콘 등 정적 파일을 저장하는 폴더입니다.&lt;/li&gt;
&lt;li&gt;예: assets/logo.png 같은 리소스를 저장하고 앱에서 불러옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3. package.json&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트의 메타데이터, 의존성, 스크립트를 정의하는 파일입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848243416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;my-project&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;expo start&quot;,
    &quot;build&quot;: &quot;expo build&quot;,
    &quot;eject&quot;: &quot;expo eject&quot;
  },
  &quot;dependencies&quot;: {
    &quot;react&quot;: &quot;18.0.0&quot;,
    &quot;react-native&quot;: &quot;0.72.0&quot;,
    &quot;expo&quot;: &quot;~49.0.0&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.4. tsconfig.json&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript 설정 파일로, 컴파일러 옵션을 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848264066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;esnext&quot;,
    &quot;module&quot;: &quot;esnext&quot;,
    &quot;jsx&quot;: &quot;react-native&quot;,
    &quot;strict&quot;: true,
    &quot;esModuleInterop&quot;: true,
    &quot;skipLibCheck&quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.5. app.json&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Expo 설정 파일로, 앱 이름, 아이콘, 배포 설정 등을 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848279081&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;expo&quot;: {
    &quot;name&quot;: &quot;My Project&quot;,
    &quot;slug&quot;: &quot;my-project&quot;,
    &quot;version&quot;: &quot;1.0.0&quot;,
    &quot;platforms&quot;: [&quot;ios&quot;, &quot;android&quot;],
    &quot;icon&quot;: &quot;./assets/icon.png&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 리액트 네이티브 코드의 기본 구조&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1. React Native Core Components&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native는 HTML 대신 자체 UI 컴포넌트를 사용합니다:&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;View&lt;/b&gt;: 레이아웃 컨테이너 (HTML의 div와 비슷)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Text&lt;/b&gt;: 텍스트 표시 (HTML의 p 또는 span)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Image&lt;/b&gt;: 이미지 표시 (HTML의 img)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ScrollView&lt;/b&gt;: 스크롤 가능한 뷰&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Button&lt;/b&gt;: 기본 버튼&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2. 코드 예제&lt;/h4&gt;
&lt;pre id=&quot;code_1732848293991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import { StyleSheet, Text, View, Image, Button, Alert } from 'react-native';

export default function App() {
  const onPressButton = () =&amp;gt; {
    Alert.alert(&quot;Button clicked!&quot;);
  };

  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;Text style={styles.title}&amp;gt;Hello, React Native!&amp;lt;/Text&amp;gt;
      &amp;lt;Image source={{ uri: 'https://via.placeholder.com/150' }} style={styles.image} /&amp;gt;
      &amp;lt;Button title=&quot;Click Me&quot; onPress={onPressButton} /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#f5f5f5',
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
    marginBottom: 20,
  },
  image: {
    width: 150,
    height: 150,
    marginBottom: 20,
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 스타일링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native에서는 CSS 대신 &lt;b&gt;StyleSheet&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;Flexbox를 사용하여 레이아웃을 구성합니다.&lt;/li&gt;
&lt;li&gt;색상, 폰트 크기 등은 React Native의 스타일 속성을 따릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848314639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const styles = StyleSheet.create({
  container: {
    flex: 1, // 화면을 꽉 채움
    justifyContent: 'center', // 세로 정렬
    alignItems: 'center', // 가로 정렬
    backgroundColor: '#fff', // 배경색
  },
  text: {
    fontSize: 16, // 글자 크기
    color: '#333', // 글자 색
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 컴포넌트 구조화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업이 커지면 코드를 컴포넌트로 분리하여 관리합니다&lt;/p&gt;
&lt;pre id=&quot;code_1732848330860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my-project/
├── components/
│   ├── Header.tsx    # 헤더 컴포넌트
│   └── Footer.tsx    # 푸터 컴포넌트
├── screens/
│   ├── HomeScreen.tsx # 홈 화면
│   └── AboutScreen.tsx # 소개 화면&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Expo 기본 명령어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848344588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm start&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;빌드 준비(Android/iOS):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732848366436&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo build:android
expo build:ios&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발/기타 (Others)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/590</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A6%AC%EC%97%91%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EA%B8%B0%EB%B3%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EB%AC%B8%EB%B2%95-%EC%84%A4%EB%AA%85-React-Native#entry590comment</comments>
      <pubDate>Fri, 29 Nov 2024 11:46:58 +0900</pubDate>
    </item>
    <item>
      <title>루아 Lua 메이플스토리 월드 NPC 대화 상자 구현하기</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EB%8C%80%ED%99%94-%EC%83%81%EC%9E%90-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;루아&amp;nbsp;Lua&amp;nbsp;메이플스토리&amp;nbsp;월드&amp;nbsp;NPC&amp;nbsp;대화&amp;nbsp;상자&amp;nbsp;구현하기&lt;/h2&gt;
&lt;pre id=&quot;code_1732535547366&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- NPC 대화 이벤트 함수
function onTalk(player, npc)
    -- 대화 시작
    npc:say(&quot;안녕하세요! 이곳은 메이플 월드입니다.&quot;, &quot;환영합니다!&quot;)
    
    -- 옵션 선택
    local choice = npc:ask(&quot;무엇을 하고 싶으신가요?&quot;, {
        &quot;퀘스트 시작하기&quot;,
        &quot;상점 열기&quot;,
        &quot;그냥 둘러보기&quot;
    })
    
    -- 선택에 따른 동작
    if choice == 1 then
        npc:say(&quot;새로운 퀘스트를 시작합니다!&quot;)
        player:startQuest(1001)  -- 퀘스트 ID를 지정
    elseif choice == 2 then
        npc:say(&quot;상점을 엽니다.&quot;)
        player:openShop(2001)   -- 상점 ID를 지정
    else
        npc:say(&quot;즐거운 시간 보내세요!&quot;)
    end
end&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/MSW 루아 (Lua)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/589</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EB%8C%80%ED%99%94-%EC%83%81%EC%9E%90-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#entry589comment</comments>
      <pubDate>Mon, 25 Nov 2024 21:52:37 +0900</pubDate>
    </item>
    <item>
      <title>루아 Lua 메이플스토리 월드 NPC 아이템 획득 기능 구현하기</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EC%95%84%EC%9D%B4%ED%85%9C-%ED%9A%8D%EB%93%9D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;루아&amp;nbsp;Lua&amp;nbsp;메이플스토리&amp;nbsp;월드&amp;nbsp;NPC&amp;nbsp;아이템&amp;nbsp;획득&amp;nbsp;기능&amp;nbsp;구현하기&lt;/h2&gt;
&lt;pre id=&quot;code_1732205010023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 아이템 획득 스크립트

-- 아이템 데이터 설정
local item = {
    name = &quot;HP 물약&quot;,
    description = &quot;사용 시 체력을 50 회복합니다.&quot;,
    amount = 1 -- 아이템 수량
}

-- 플레이어 인벤토리 (가상의 테이블)
local playerInventory = {}

-- 아이템 획득 함수
function giveItemToPlayer(player, item)
    print(&quot;플레이어가 아이템을 획득했습니다: &quot; .. item.name)
    -- 인벤토리에 아이템 추가
    if playerInventory[item.name] then
        playerInventory[item.name] = playerInventory[item.name] + item.amount
    else
        playerInventory[item.name] = item.amount
    end

    print(item.name .. &quot; x&quot; .. playerInventory[item.name] .. &quot; (현재 수량)&quot;)
end

-- 플레이어가 특정 영역에 들어왔을 때 호출
function onPlayerEnterArea(player, area)
    if area.name == &quot;아이템 상자&quot; and not area.isClaimed then
        print(&quot;아이템 상자 근처에 도달했습니다.&quot;)
        giveItemToPlayer(player, item)
        area.isClaimed = true -- 아이템이 이미 획득되었음을 표시
    else
        print(&quot;이미 아이템이 획득된 상자입니다.&quot;)
    end
end

-- 테스트 영역 데이터
local testArea = {
    name = &quot;아이템 상자&quot;,
    isClaimed = false
}

-- 테스트 실행
local player = {} -- 가상의 플레이어 객체
print(&quot;플레이어가 아이템 영역에 들어갑니다.&quot;)
onPlayerEnterArea(player, testArea)

-- 다시 들어가면 아이템을 받을 수 없음을 확인
print(&quot;플레이어가 다시 아이템 영역에 들어갑니다.&quot;)
onPlayerEnterArea(player, testArea)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/MSW 루아 (Lua)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/587</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EC%95%84%EC%9D%B4%ED%85%9C-%ED%9A%8D%EB%93%9D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#entry587comment</comments>
      <pubDate>Fri, 22 Nov 2024 01:04:20 +0900</pubDate>
    </item>
    <item>
      <title>루아 Lua 메이플스토리 월드 NPC 상호작용 기능 구현하기</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;루아&amp;nbsp;Lua&amp;nbsp;메이플스토리&amp;nbsp;월드&amp;nbsp;NPC&amp;nbsp;상호작용&amp;nbsp;기능&amp;nbsp;구현하기&lt;/h2&gt;
&lt;pre id=&quot;code_1732205010023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- NPC Interaction Script

-- NPC 기본 설정
local npc = {
    name = &quot;상점 주인&quot;,
    dialogue = {
        &quot;안녕하세요! 무엇을 도와드릴까요?&quot;,
        &quot;오늘은 새로운 아이템이 들어왔어요. 한번 둘러보세요!&quot;,
        &quot;좋은 하루 되세요!&quot;
    }
}

-- 플레이어가 NPC와 상호작용했을 때 실행되는 함수
function interactWithNPC(player)
    print(npc.name .. &quot;과(와) 상호작용 중...&quot;)
    
    -- 랜덤 대화 출력
    local randomIndex = math.random(1, #npc.dialogue)
    local message = npc.dialogue[randomIndex]
    print(npc.name .. &quot;: &quot; .. message)

    -- 추가로 상점 메뉴 열기나 퀘스트 제공 등의 기능 추가 가능
    -- 예: openShop(player)
    -- 예: offerQuest(player, &quot;퀘스트 이름&quot;)
end

-- 플레이어가 근처에서 상호작용 키를 누를 때 호출
function onPlayerInteract(player)
    if isPlayerNearby(player, npc) then
        interactWithNPC(player)
    else
        print(&quot;NPC 근처에 있어야 상호작용할 수 있습니다.&quot;)
    end
end

-- NPC와 플레이어의 거리 계산 (가상 함수)
function isPlayerNearby(player, npc)
    -- 여기서는 단순히 true를 반환
    -- 실제로는 거리 계산을 추가해야 함
    return true
end&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/MSW 루아 (Lua)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/586</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A3%A8%EC%95%84-Lua-%EB%A9%94%EC%9D%B4%ED%94%8C%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%9B%94%EB%93%9C-NPC-%EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#entry586comment</comments>
      <pubDate>Fri, 22 Nov 2024 01:03:48 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 앱 버전 비교해서 업데이트 하기 간단 구현 AWS 활용</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%95%B1-%EB%B2%84%EC%A0%84-%EB%B9%84%EA%B5%90%ED%95%B4%EC%84%9C-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%95%98%EA%B8%B0-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-AWS-%ED%99%9C%EC%9A%A9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUTnI4/btsKR52HXMi/tb6EjkpL351B6RdXT6OEn1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUTnI4/btsKR52HXMi/tb6EjkpL351B6RdXT6OEn1/img.webp&quot; data-alt=&quot;유니티 C# 앱 버전 비교해서 업데이트 하기 간단 구현 AWS 활용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUTnI4/btsKR52HXMi/tb6EjkpL351B6RdXT6OEn1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUTnI4%2FbtsKR52HXMi%2Ftb6EjkpL351B6RdXT6OEn1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 C# 앱 버전 비교해서 업데이트 하기 간단 구현 AWS 활용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;앱&amp;nbsp;버전&amp;nbsp;비교해서&amp;nbsp;업데이트&amp;nbsp;하기&amp;nbsp;간단&amp;nbsp;구현&amp;nbsp;AWS&amp;nbsp;활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS Json 형식&lt;/h2&gt;
&lt;pre id=&quot;code_1732170450648&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;latest_version&quot;: &quot;1.2.3&quot;,
  &quot;update_urls&quot;: {
    &quot;android&quot;: &quot;https://play.google.com/store/apps/details?id=com.example.myapp&quot;,
    &quot;ios&quot;: &quot;https://apps.apple.com/app/id1234567890&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1732170434401&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.IO;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;

public class VersionChecker : MonoBehaviour
{
    [Header(&quot;AWS JSON 파일 경로&quot;)]
    public string awsJsonFilePath = &quot;aws_versions.json&quot;;

    private string currentVersion;
    private string latestVersion;
    private string androidStoreUrl;
    private string iosStoreUrl;

    void Start()
    {
        // 현재 앱 버전 가져오기
        currentVersion = Application.version;
        Debug.Log($&quot;현재 앱 버전: {currentVersion}&quot;);

        // AWS JSON 파일 읽기 및 처리
        LoadAndCheckVersion();
    }

    void LoadAndCheckVersion()
    {
        try
        {
            // JSON 파일 읽기
            string jsonContent = File.ReadAllText(awsJsonFilePath);
            JObject json = JObject.Parse(jsonContent);

            // 최신 버전 및 업데이트 URL 추출
            latestVersion = json[&quot;latest_version&quot;]?.ToString();
            androidStoreUrl = json[&quot;update_urls&quot;]?[&quot;android&quot;]?.ToString();
            iosStoreUrl = json[&quot;update_urls&quot;]?[&quot;ios&quot;]?.ToString();

            Debug.Log($&quot;최신 버전: {latestVersion}&quot;);

            // 버전 비교
            if (Version.TryParse(currentVersion, out var current) &amp;amp;&amp;amp;
                Version.TryParse(latestVersion, out var latest))
            {
                if (current &amp;lt; latest)
                {
                    Debug.LogWarning(&quot;앱 버전이 최신이 아닙니다. 업데이트가 필요합니다.&quot;);
                    PromptUpdate();
                }
                else
                {
                    Debug.Log(&quot;앱 버전이 최신입니다. 계속 진행합니다.&quot;);
                    ProceedToApp();
                }
            }
            else
            {
                Debug.LogError(&quot;버전 비교 실패: 올바른 형식이 아닙니다.&quot;);
            }
        }
        catch (Exception ex)
        {
            Debug.LogError($&quot;JSON 파일 처리 중 오류 발생: {ex.Message}&quot;);
        }
    }

    void PromptUpdate()
    {
        // 업데이트 메시지 표시 (UI 또는 팝업)
        Debug.Log(&quot;사용자에게 업데이트를 요청합니다.&quot;);

#if UNITY_ANDROID
        Application.OpenURL(androidStoreUrl);
#elif UNITY_IOS
        Application.OpenURL(iosStoreUrl);
#else
        Debug.LogError(&quot;지원되지 않는 플랫폼입니다.&quot;);
#endif

        // 업데이트 강제 시 앱 종료
        Application.Quit();
    }

    void ProceedToApp()
    {
        // 앱이 최신 버전일 경우 다음 씬 로드 등 진행
        Debug.Log(&quot;앱을 실행합니다.&quot;);
        SceneManager.LoadScene(&quot;MainScene&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/585</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%95%B1-%EB%B2%84%EC%A0%84-%EB%B9%84%EA%B5%90%ED%95%B4%EC%84%9C-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%95%98%EA%B8%B0-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-AWS-%ED%99%9C%EC%9A%A9#entry585comment</comments>
      <pubDate>Thu, 21 Nov 2024 15:27:57 +0900</pubDate>
    </item>
    <item>
      <title>유니티 Xcode Assertion failed: (false &amp;amp;&amp;amp; &amp;quot;compact unwind compressed function offset doesn't fit in 24 bits&amp;quot;) 해결 방법</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-Xcode-Assertion-failed-false-compact-unwind-compressed-function-offset-doesnt-fit-in-24-bits-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSc4d4/btsKQLKL3Nc/B8TrE6qXu9TNsggb42LKtk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSc4d4/btsKQLKL3Nc/B8TrE6qXu9TNsggb42LKtk/img.webp&quot; data-alt=&quot;유니티 Xcode Assertion failed: (false &amp;amp;amp;&amp;amp;amp; &amp;quot;compact unwind compressed function offset doesn't fit in 24 bits&amp;quot;) 해결 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSc4d4/btsKQLKL3Nc/B8TrE6qXu9TNsggb42LKtk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSc4d4%2FbtsKQLKL3Nc%2FB8TrE6qXu9TNsggb42LKtk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 Xcode Assertion failed: (false &amp;amp;&amp;amp; &quot;compact unwind compressed function offset doesn't fit in 24 bits&quot;) 해결 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티 Xcode Assertion failed: (false &amp;amp;&amp;amp; &quot;compact unwind compressed function offset doesn't fit in 24 bits&quot;) 해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assertion failed: (false &amp;amp;&amp;amp; &quot;compact unwind compressed function offset doesn't fit in 24 bits&quot;), function operator(), file Layout.cpp, line 5758. clang: error: linker command failed with exit code 1 (use -v to see invocation) ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UnityFramework / Build Setting / Other Linker Flags 에 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-ld64&lt;/b&gt;&lt;/span&gt; 옵션 추가 (LD 입니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;figure id=&quot;og_1732167086595&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;Xcode 15 beat6  Assertion failed: &amp;hellip; | Apple Developer Forums&quot; data-og-description=&quot;Xcode 15 beat6 0 0x102aa3698 __assert_rtn + 72 1 0x102a5e284 ___Z13dispatchApplyIRKmZ15dispatchForEachIKN6mach_o13CompactUnwind11Diff24FixupEZNK2ld16LayoutExecutable18writeCompactUnwindENSt3__14spanIhLm18446744073709551615EEEyRKNS7_13SectionLayoutEE4$_26Ev&quot; data-og-host=&quot;forums.developer.apple.com&quot; data-og-source-url=&quot;https://forums.developer.apple.com/forums/thread/735426&quot; data-og-url=&quot;https://forums.developer.apple.com/forums/thread/735426&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLLOSX/hyXzI8Z0iP/L8t1xeUUl3qT5FRvj9BL91/img.jpg?width=2044&amp;amp;height=338&amp;amp;face=0_0_2044_338&quot;&gt;&lt;a href=&quot;https://forums.developer.apple.com/forums/thread/735426&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://forums.developer.apple.com/forums/thread/735426&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLLOSX/hyXzI8Z0iP/L8t1xeUUl3qT5FRvj9BL91/img.jpg?width=2044&amp;amp;height=338&amp;amp;face=0_0_2044_338');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Xcode 15 beat6 Assertion failed: &amp;hellip; | Apple Developer Forums&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Xcode 15 beat6 0 0x102aa3698 __assert_rtn + 72 1 0x102a5e284 ___Z13dispatchApplyIRKmZ15dispatchForEachIKN6mach_o13CompactUnwind11Diff24FixupEZNK2ld16LayoutExecutable18writeCompactUnwindENSt3__14spanIhLm18446744073709551615EEEyRKNS7_13SectionLayoutEE4$_26Ev&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;forums.developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/유니티 빌드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/584</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-Xcode-Assertion-failed-false-compact-unwind-compressed-function-offset-doesnt-fit-in-24-bits-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry584comment</comments>
      <pubDate>Thu, 21 Nov 2024 14:31:46 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# CSV 파일 처리 자동화 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-CSV-%ED%8C%8C%EC%9D%BC-%EC%B2%98%EB%A6%AC-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0iIFY/btsKPUOOrnt/10VA5g5HsbnPL9p5wqyOFK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0iIFY/btsKPUOOrnt/10VA5g5HsbnPL9p5wqyOFK/img.webp&quot; data-alt=&quot;유니티 C# CSV 파일 처리 자동화 간단 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0iIFY/btsKPUOOrnt/10VA5g5HsbnPL9p5wqyOFK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0iIFY%2FbtsKPUOOrnt%2F10VA5g5HsbnPL9p5wqyOFK%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-filename=&quot;Unity.webp&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 C# CSV 파일 처리 자동화 간단 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;CSV&amp;nbsp;파일&amp;nbsp;처리&amp;nbsp;자동화&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;pre id=&quot;code_1732157940792&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;
using System.Collections.Generic;
using UnityEngine;

public class CSVProcessor : MonoBehaviour
{
    public string inputFilePath = &quot;Assets/InputData.csv&quot;; // 입력 CSV 파일 경로
    public string outputFilePath = &quot;Assets/OutputData.csv&quot;; // 출력 CSV 파일 경로

    void Start()
    {
        // CSV 읽기
        List&amp;lt;string[]&amp;gt; data = ReadCSV(inputFilePath);

        // 데이터 처리 (예: 특정 조건으로 필터링)
        List&amp;lt;string[]&amp;gt; filteredData = ProcessData(data);

        // 결과를 새로운 CSV로 저장
        WriteCSV(outputFilePath, filteredData);

        Debug.Log(&quot;CSV 데이터 처리가 완료되었습니다!&quot;);
    }

    // CSV 읽기
    List&amp;lt;string[]&amp;gt; ReadCSV(string filePath)
    {
        List&amp;lt;string[]&amp;gt; result = new List&amp;lt;string[]&amp;gt;();

        if (File.Exists(filePath))
        {
            string[] lines = File.ReadAllLines(filePath);

            foreach (string line in lines)
            {
                string[] row = line.Split(',');
                result.Add(row);
            }
        }
        else
        {
            Debug.LogError($&quot;파일을 찾을 수 없습니다: {filePath}&quot;);
        }

        return result;
    }

    // 데이터 처리 (필터링 또는 계산)
    List&amp;lt;string[]&amp;gt; ProcessData(List&amp;lt;string[]&amp;gt; data)
    {
        List&amp;lt;string[]&amp;gt; filteredData = new List&amp;lt;string[]&amp;gt;();

        foreach (string[] row in data)
        {
            // 예제: 특정 값이 포함된 행만 추가
            if (row.Length &amp;gt; 1 &amp;amp;&amp;amp; row[1] == &quot;조건값&quot;)
            {
                filteredData.Add(row);
            }
        }

        return filteredData;
    }

    // CSV 쓰기
    void WriteCSV(string filePath, List&amp;lt;string[]&amp;gt; data)
    {
        List&amp;lt;string&amp;gt; lines = new List&amp;lt;string&amp;gt;();

        foreach (string[] row in data)
        {
            lines.Add(string.Join(&quot;,&quot;, row));
        }

        File.WriteAllLines(filePath, lines);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/583</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-CSV-%ED%8C%8C%EC%9D%BC-%EC%B2%98%EB%A6%AC-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry583comment</comments>
      <pubDate>Thu, 21 Nov 2024 11:59:45 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 Python 주식 자동 매매 프로그램 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Python-%EC%A3%BC%EC%8B%9D-%EC%9E%90%EB%8F%99-%EB%A7%A4%EB%A7%A4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d63lsH/btsKPyyAIMD/IqC2jOzzLtTVbEsclKKhf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d63lsH/btsKPyyAIMD/IqC2jOzzLtTVbEsclKKhf0/img.png&quot; data-alt=&quot;파이썬 Python 주식 자동 매매 프로그램 간단 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d63lsH/btsKPyyAIMD/IqC2jOzzLtTVbEsclKKhf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd63lsH%2FbtsKPyyAIMD%2FIqC2jOzzLtTVbEsclKKhf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파이썬 Python 주식 자동 매매 프로그램 간단 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬&amp;nbsp;Python&amp;nbsp;주식&amp;nbsp;자동&amp;nbsp;매매&amp;nbsp;프로그램&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Alpaca API 준비&lt;/h2&gt;
&lt;pre id=&quot;code_1732110372131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install alpaca-trade-api&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1732110379947&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import alpaca_trade_api as tradeapi
import time

# Alpaca API 키와 시크릿 키를 설정합니다.
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
base_url = 'https://paper-api.alpaca.markets'  # 테스트 환경 (종이 거래)

# Alpaca 클라이언트 초기화
api = tradeapi.REST(api_key, api_secret, base_url, api_version='v2')

# 거래할 주식 및 수량 설정 (예: 애플 주식 1주)
symbol = 'AAPL'
quantity = 1

# 주식 현재 가격 가져오기
def get_price():
    &quot;&quot;&quot;현재 주식 가격을 가져오는 함수&quot;&quot;&quot;
    barset = api.get_barset(symbol, 'minute', limit=1)  # 1분 간격으로 최신 가격 가져오기
    return barset[symbol][0].c

# 매수 함수
def buy():
    &quot;&quot;&quot;매수 함수&quot;&quot;&quot;
    price = get_price()
    print(f&quot;현재 가격: {price} USD, 매수 주문 실행&quot;)
    api.submit_order(
        symbol=symbol,
        qty=quantity,
        side='buy',
        type='market',
        time_in_force='gtc'
    )

# 매도 함수
def sell():
    &quot;&quot;&quot;매도 함수&quot;&quot;&quot;
    price = get_price()
    print(f&quot;현재 가격: {price} USD, 매도 주문 실행&quot;)
    api.submit_order(
        symbol=symbol,
        qty=quantity,
        side='sell',
        type='market',
        time_in_force='gtc'
    )

# 간단한 자동 매매 로직
def trade():
    &quot;&quot;&quot;매매 전략&quot;&quot;&quot;
    while True:
        try:
            price = get_price()
            print(f&quot;현재 가격: {price} USD&quot;)
            
            # 예시: 가격이 특정 값 이상이면 매도, 이하이면 매수
            if price &amp;gt; 150:  # 가격이 150 USD 이상이면 매도
                sell()
            elif price &amp;lt; 130:  # 가격이 130 USD 이하이면 매수
                buy()

            # 60초 대기 후 반복
            time.sleep(60)

        except Exception as e:
            print(f&quot;에러 발생: {e}&quot;)
            time.sleep(60)

if __name__ == &quot;__main__&quot;:
    trade()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/플러터 (Flutter)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/582</guid>
      <comments>https://parksh3641.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Python-%EC%A3%BC%EC%8B%9D-%EC%9E%90%EB%8F%99-%EB%A7%A4%EB%A7%A4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry582comment</comments>
      <pubDate>Wed, 20 Nov 2024 22:48:37 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 플러터 파이어베이스 채팅 앱 구현하기 Firestore Database</title>
      <link>https://parksh3641.tistory.com/entry/Flutter-%ED%94%8C%EB%9F%AC%ED%84%B0-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%B1%84%ED%8C%85-%EC%95%B1-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-Firestore-Database</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5glO/btsKNuIZBtm/bC9YsJ51KE4Cp76rMlFNz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5glO/btsKNuIZBtm/bC9YsJ51KE4Cp76rMlFNz1/img.png&quot; data-alt=&quot;Flutter 플러터 파이어베이스 채팅 앱 구현하기 Firestore Database&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5glO/btsKNuIZBtm/bC9YsJ51KE4Cp76rMlFNz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5glO%2FbtsKNuIZBtm%2FbC9YsJ51KE4Cp76rMlFNz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Flutter 플러터 파이어베이스 채팅 앱 구현하기 Firestore Database&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Flutter 플러터 파이어베이스 채팅 앱 구현하기 Firestore Database&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;main.dart&lt;/h2&gt;
&lt;pre id=&quot;code_1731984696721&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'chat_screen.dart';
import 'random_chat_service.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AuthenticationScreen(),
    );
  }
}

class AuthenticationScreen extends StatelessWidget {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  Future&amp;lt;void&amp;gt; _signInAnonymously(BuildContext context) async {
    try {
      UserCredential userCredential = await _auth.signInAnonymously();
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) =&amp;gt; MainScreen(userId: userCredential.user!.uid),
        ),
      );
    } catch (e) {
      print(&quot;로그인 오류: $e&quot;);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('랜덤 채팅 로그인')),
      body: Center(
        child: ElevatedButton(
          onPressed: () =&amp;gt; _signInAnonymously(context),
          child: Text('로그인'),
        ),
      ),
    );
  }
}

class MainScreen extends StatefulWidget {
  final String userId;
  MainScreen({required this.userId});

  @override
  _MainScreenState createState() =&amp;gt; _MainScreenState();
}

class _MainScreenState extends State&amp;lt;MainScreen&amp;gt; {
  bool isLoading = false;
  StreamSubscription&amp;lt;String?&amp;gt;? _matchSubscription;
  Timer? _countdownTimer;
  int countdownSeconds = 10;

  Future&amp;lt;void&amp;gt; _startRandomChat() async {
    setState(() {
      isLoading = true;
    });

    // 사용자를 대기열에 추가
    await RandomChatService().addToQueue(widget.userId);

    // 대기 중 모달 창 띄우기
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) =&amp;gt; StatefulBuilder(
        builder: (context, setDialogState) {
          // 타이머를 시작하고, 타이머가 실행될 때마다 setDialogState를 호출하여 UI 갱신
          if (_countdownTimer == null || !_countdownTimer!.isActive) {
            _countdownTimer = Timer.periodic(Duration(seconds: 1), (timer) {
              if (countdownSeconds &amp;gt; 0) {
                setState(() {
                  countdownSeconds--;
                });
                setDialogState(() {}); // 모달 창 UI 갱신
              } else {
                _cancelMatchmaking();
                if (Navigator.canPop(context)) {
                  Navigator.pop(context); // 대기 중 모달 창 닫기
                }
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text(&quot;매칭 시간이 초과되어 취소되었습니다.&quot;)),
                );
              }
            });
          }

          return AlertDialog(
            title: Text('상대방을 찾고 있습니다...'),
            content: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                CircularProgressIndicator(),
                SizedBox(height: 20),
                Text(&quot;대기 시간 : $countdownSeconds초&quot;),
              ],
            ),
          );
        },
      ),
    );

    // 상대방을 기다리며 매칭을 확인
    _matchSubscription = RandomChatService().waitForMatch(widget.userId).listen((chatId) {
      if (chatId != null) {
        _cancelMatchmaking(); // 타이머와 매칭 구독 해제
        Navigator.pop(context); // 대기 중 모달 창 닫기
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) =&amp;gt; ChatScreen(chatId: chatId, userId: widget.userId),
          ),
        );
        setState(() {
          isLoading = false;
        });
      }
    });
  }

  void _startCountdownTimer() {
    _countdownTimer = Timer.periodic(Duration(seconds: 1), (timer) {
      if (countdownSeconds &amp;gt; 0) {
        setState(() {
          countdownSeconds--;
        });
      } else {
        _cancelMatchmaking();
        if (Navigator.canPop(context)) {
          Navigator.pop(context); // 대기 중 모달 창 닫기
        }
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text(&quot;매칭 시간이 초과되어 취소되었습니다.&quot;)),
        );
      }
    });
  }

  void _cancelMatchmaking() {
    _matchSubscription?.cancel();
    _countdownTimer?.cancel();
    _countdownTimer = null; // 타이머 해제 후 null로 초기화하여 재실행 방지
    setState(() {
      isLoading = false;
      countdownSeconds = 10;
    });
  }

  @override
  void dispose() {
    _cancelMatchmaking(); // 모든 타이머와 스트림 구독 해제
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('메인 화면')),
      body: Center(
        child: isLoading
            ? CircularProgressIndicator()
            : ElevatedButton(
                onPressed: _startRandomChat,
                child: Text('랜덤 채팅 시작'),
              ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;chat_screen.dart&lt;/h2&gt;
&lt;pre id=&quot;code_1731984672868&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class ChatScreen extends StatefulWidget {
  final String chatId;
  final String userId;

  ChatScreen({required this.chatId, required this.userId});

  @override
  _ChatScreenState createState() =&amp;gt; _ChatScreenState();
}

class _ChatScreenState extends State&amp;lt;ChatScreen&amp;gt; {
  final TextEditingController messageController = TextEditingController();
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;
  final ScrollController _scrollController = ScrollController();

  @override
  void initState() {
    super.initState();
    _sendSystemMessage(&quot;${widget.userId} 님이 입장하였습니다.&quot;);
  }

  @override
  void dispose() {
    _sendSystemMessage(&quot;${widget.userId} 님이 방에서 나갔습니다.&quot;);
    _scrollController.dispose();
    super.dispose();
  }

  Future&amp;lt;void&amp;gt; _sendSystemMessage(String message) async {
    await _firestore.collection('chats').doc(widget.chatId).collection('messages').add({
      'text': message,
      'createdAt': FieldValue.serverTimestamp(),
      'isSystemMessage': true,
      'senderId': 'system', // 시스템 메시지는 senderId를 'system'으로 설정
    });
  }

  Future&amp;lt;void&amp;gt; _sendMessage() async {
    if (messageController.text.trim().isNotEmpty) {
      await _firestore.collection('chats').doc(widget.chatId).collection('messages').add({
        'senderId': widget.userId,
        'text': messageController.text,
        'createdAt': FieldValue.serverTimestamp(),
        'isSystemMessage': false,
      });
      messageController.clear();
      _scrollToBottom();
    }
  }

  void _scrollToBottom() {
    if (_scrollController.hasClients) {
      _scrollController.animateTo(
        _scrollController.position.maxScrollExtent,
        duration: Duration(milliseconds: 300),
        curve: Curves.easeOut,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('랜덤 채팅'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Column(
        children: [
          Expanded(
            child: StreamBuilder(
              stream: _firestore
                  .collection('chats')
                  .doc(widget.chatId)
                  .collection('messages')
                  .orderBy('createdAt')
                  .snapshots(),
              builder: (context, AsyncSnapshot&amp;lt;QuerySnapshot&amp;gt; snapshot) {
                if (!snapshot.hasData) return CircularProgressIndicator();

                // 새 메시지가 수신되면 자동 스크롤
                WidgetsBinding.instance.addPostFrameCallback((_) =&amp;gt; _scrollToBottom());

                return ListView(
                  controller: _scrollController,
                  children: snapshot.data!.docs.map((doc) {
                    final data = doc.data() as Map&amp;lt;String, dynamic&amp;gt;;
                    bool isSystemMessage = data['isSystemMessage'] ?? false;
                    String senderId = data['senderId'] ?? '';

                    if (isSystemMessage) {
                      return Center(
                        child: Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Text(
                            data['text'],
                            style: TextStyle(
                              color: Colors.grey,
                              fontStyle: FontStyle.italic,
                            ),
                          ),
                        ),
                      );
                    } else {
                      bool isCurrentUser = senderId == widget.userId;
                      return Align(
                        alignment: isCurrentUser ? Alignment.centerRight : Alignment.centerLeft,
                        child: Container(
                          margin: EdgeInsets.symmetric(vertical: 4.0, horizontal: 8.0),
                          padding: EdgeInsets.all(10.0),
                          decoration: BoxDecoration(
                            color: isCurrentUser ? Colors.blue[100] : Colors.grey[300],
                            borderRadius: BorderRadius.only(
                              topLeft: Radius.circular(12),
                              topRight: Radius.circular(12),
                              bottomLeft: isCurrentUser ? Radius.circular(12) : Radius.circular(0),
                              bottomRight: isCurrentUser ? Radius.circular(0) : Radius.circular(12),
                            ),
                          ),
                          child: Text(
                            data['text'],
                            style: TextStyle(
                              color: Colors.black,
                            ),
                          ),
                        ),
                      );
                    }
                  }).toList(),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: messageController,
                    decoration: InputDecoration(hintText: '메시지를 입력하세요'),
                    onSubmitted: (value) =&amp;gt; _sendMessage(),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: _sendMessage,
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;random_chat_service.dart&lt;/h2&gt;
&lt;pre id=&quot;code_1731984758390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:cloud_firestore/cloud_firestore.dart';

class RandomChatService {
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  Future&amp;lt;void&amp;gt; addToQueue(String userId) async {
    await _firestore.collection('queue').doc(userId).set({
      'userId': userId,
      'createdAt': FieldValue.serverTimestamp(),
    });
  }

  Stream&amp;lt;String?&amp;gt; waitForMatch(String userId) async* {
    await for (var snapshot in _firestore
        .collection('queue')
        .where('userId', isNotEqualTo: userId)
        .snapshots()) {
      if (snapshot.docs.isNotEmpty) {
        final otherUserId = snapshot.docs.first.id;
        
        // 두 사용자 ID를 이용해 기존 채팅방이 있는지 확인하고 가져오기
        final chatId = await _findOrCreateChatRoom(userId, otherUserId);
        yield chatId;
      } else {
        yield null;
      }
    }
  }

  Future&amp;lt;String&amp;gt; _findOrCreateChatRoom(String userId, String otherUserId) async {
    // 두 사용자가 이미 존재하는 채팅방이 있는지 확인
    final existingChat = await _firestore
        .collection('chats')
        .where('users', arrayContains: userId)
        .get();

    for (var doc in existingChat.docs) {
      final users = List&amp;lt;String&amp;gt;.from(doc['users']);
      if (users.contains(otherUserId)) {
        return doc.id; // 기존 채팅방 ID 반환
      }
    }

    // 기존 채팅방이 없다면 새로 생성
    var chatDoc = await _firestore.collection('chats').add({
      'users': [userId, otherUserId],
      'createdAt': FieldValue.serverTimestamp(),
    });

    // 대기열에서 두 사용자 제거
    await _firestore.collection('queue').doc(userId).delete();
    await _firestore.collection('queue').doc(otherUserId).delete();

    return chatDoc.id;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/플러터 (Flutter)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/581</guid>
      <comments>https://parksh3641.tistory.com/entry/Flutter-%ED%94%8C%EB%9F%AC%ED%84%B0-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%B1%84%ED%8C%85-%EC%95%B1-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-Firestore-Database#entry581comment</comments>
      <pubDate>Tue, 19 Nov 2024 11:55:13 +0900</pubDate>
    </item>
    <item>
      <title>리엑트 네이티브 윈도우 컴퓨터 세팅 방법 React Native Windows</title>
      <link>https://parksh3641.tistory.com/entry/%EB%A6%AC%EC%97%91%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%84%B8%ED%8C%85-%EB%B0%A9%EB%B2%95-React-Native-Windows</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFtzE/btsKOHG1RWK/xHsk7ZjXm5uenaLgmkyD9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFtzE/btsKOHG1RWK/xHsk7ZjXm5uenaLgmkyD9k/img.png&quot; data-alt=&quot;리엑트 네이티브 윈도우 컴퓨터 세팅 방법 React Native Windows&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFtzE/btsKOHG1RWK/xHsk7ZjXm5uenaLgmkyD9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFtzE%2FbtsKOHG1RWK%2FxHsk7ZjXm5uenaLgmkyD9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;370&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리엑트 네이티브 윈도우 컴퓨터 세팅 방법 React Native Windows&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;React Native 윈도우 컴퓨터 세팅 가이드 (Expo 사용)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 네이티브는 크로스 플랫폼 앱을 개발할 수 있는 강력한 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 Expo를 사용하여 빠르고 간편하게 리액트 네이티브 환경을 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Node.js 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native는 Node.js를 필요로 합니다. 다음 단계를 따라 설치하세요:&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://nodejs.org/&quot;&gt;&lt;span&gt;Node&lt;/span&gt;&lt;span&gt;.js&lt;/span&gt;&lt;span&gt; 공식&lt;/span&gt;&lt;span&gt; 웹사이트&lt;/span&gt;&lt;/a&gt;에 방문합니다.&lt;/li&gt;
&lt;li&gt;LTS(Long Term Support) 버전을 다운로드하고 설치합니다.&lt;/li&gt;
&lt;li&gt;설치 후, 터미널이나 명령 프롬프트를 열어 다음 명령어로 Node.js와 npm이 설치되었는지 확인합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1731944614151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node -v 
npm -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Expo CLI 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Expo CLI는 리액트 네이티브 앱 개발을 간소화하는 도구입니다. 다음 단계를 따라 설치하세요:&lt;/p&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. 명령 프롬프트에서 다음 명령어를 입력하여 Expo CLI를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731944659579&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g expo-cli&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;2. 설치가 완료되면 Expo CLI가 올바르게 설치되었는지 확인합니다&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1731944692175&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo --version&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;3. 새 프로젝트 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 새로운 Expo 프로젝트를 생성해봅시다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;명령 프롬프트에서 프로젝트를 생성할 디렉터리로 이동합니다.&lt;/li&gt;
&lt;li&gt;다음 명령어를 실행하여 새로운 프로젝트를 생성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1731944737658&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo init my-new-project&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;3. 생성된 프로젝트 디렉터리로 이동합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1731944761324&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd my-new-project&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 플랫폼 빌드하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Expo 개발 서버를 시작하려면 다음 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731944791523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo start&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;이 명령어를 실행하면 터미널에 QR 코드가 표시되며, Expo Go 앱(모바일 앱)을 통해 프로젝트를 실행할 수 있습니다.&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;5. Expo Go 앱 설치 및 테스트&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모바일 기기에 Expo Go 앱을 설치합니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/&quot;&gt;&lt;span&gt;iOS&lt;/span&gt;&lt;span&gt; 앱스토어&lt;/span&gt;&lt;/a&gt; 또는 &lt;a href=&quot;https://play.google.com/&quot;&gt;&lt;span&gt;Android&lt;/span&gt;&lt;span&gt; 플레이스토어&lt;/span&gt;&lt;/a&gt;에서 다운로드 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;앱을 열고 QR 코드를 스캔하여 프로젝트를 실행합니다.&lt;/li&gt;
&lt;/ol&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;6. 에뮬레이터(선택 사항)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에뮬레이터를 사용하려면 다음을 설치하세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;안드로이드 에뮬레이터&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/studio&quot;&gt;&lt;span&gt;Android&lt;/span&gt;&lt;span&gt; Studio&lt;/span&gt;&lt;/a&gt;를 설치합니다.&lt;/li&gt;
&lt;li&gt;설치 후, AVD(Android Virtual Device)를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Expo CLI가 Android 에뮬레이터를 자동으로 감지하며, expo start 후 터미널에서 'a'를 눌러 실행할 수 있습니다.&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 윈도우에서 Expo와 함께 리액트 네이티브 개발을 시작할 준비가 되었습니다. 코드를 작성하고 즉시 앱에서 결과를 확인하며 효율적으로 작업할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 문제가 발생하거나 디버깅이 필요할 경우, Expo 공식 문서(&lt;a&gt;&lt;span&gt;Expo&lt;/span&gt;&lt;span&gt; Docs&lt;/span&gt;&lt;/a&gt;)를 참조하세요.&lt;/p&gt;</description>
      <category>개발/기타 (Others)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/579</guid>
      <comments>https://parksh3641.tistory.com/entry/%EB%A6%AC%EC%97%91%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%84%B8%ED%8C%85-%EB%B0%A9%EB%B2%95-React-Native-Windows#entry579comment</comments>
      <pubDate>Tue, 19 Nov 2024 00:47:11 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 비트코인 코인 채굴 시뮬레이션 코드 작성 Bitcoin Mining</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8-%EC%BD%94%EC%9D%B8-%EC%B1%84%EA%B5%B4-%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;비트코인&amp;nbsp;코인&amp;nbsp;채굴&amp;nbsp;시뮬레이션&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1731429745011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using UnityEngine.UI;
using System.Security.Cryptography;
using System.Text;

public class BitcoinMiningSimulator : MonoBehaviour
{
    public Text minedBlocksText; // 채굴된 블록 수를 표시할 텍스트
    public Text hashRateText;    // 해시 속도를 표시할 텍스트
    public Button startMiningButton; // 채굴 시작 버튼
    public Button stopMiningButton;  // 채굴 중지 버튼

    private bool isMining = false; // 채굴 중인지 여부
    private int blocksMined = 0;   // 채굴된 블록 수
    private float hashRate = 100000f; // 초당 해시 속도 (단위는 가상값, 실제와 다름)
    private string targetPrefix = &quot;0000&quot;; // 간단한 타겟 난이도 설정

    void Start()
    {
        // 버튼에 클릭 이벤트 연결
        startMiningButton.onClick.AddListener(StartMining);
        stopMiningButton.onClick.AddListener(StopMining);

        // 초기 UI 업데이트
        UpdateUI();
    }

    void Update()
    {
        if (isMining)
        {
            MineBlock();
        }
    }

    void StartMining()
    {
        isMining = true;
    }

    void StopMining()
    {
        isMining = false;
    }

    void MineBlock()
    {
        string newHash = &quot;&quot;;
        int nonce = 0;
        
        // 타겟 난이도에 맞는 해시를 찾을 때까지 반복
        do
        {
            nonce++;
            string data = &quot;Block#&quot; + blocksMined + &quot;Nonce:&quot; + nonce;
            newHash = CalculateHash(data);
        } while (!newHash.StartsWith(targetPrefix));

        // 블록이 채굴된 경우
        blocksMined++;
        UpdateUI();
    }

    string CalculateHash(string input)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] inputBytes = Encoding.ASCII.GetBytes(input);
            byte[] hashBytes = sha256.ComputeHash(inputBytes);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i &amp;lt; hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString(&quot;X2&quot;));
            }
            return sb.ToString();
        }
    }

    void UpdateUI()
    {
        minedBlocksText.text = &quot;Mined Blocks: &quot; + blocksMined;
        hashRateText.text = &quot;Hash Rate: &quot; + hashRate + &quot; H/s&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/578</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8-%EC%BD%94%EC%9D%B8-%EC%B1%84%EA%B5%B4-%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry578comment</comments>
      <pubDate>Wed, 13 Nov 2024 01:42:42 +0900</pubDate>
    </item>
    <item>
      <title>Error: A JNI error has occurred, please check your installation and try again 해결 방법</title>
      <link>https://parksh3641.tistory.com/entry/Error-A-JNI-error-has-occurred-please-check-your-installation-and-try-again-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error:&amp;nbsp;A&amp;nbsp;JNI&amp;nbsp;error&amp;nbsp;has&amp;nbsp;occurred,&amp;nbsp;please&amp;nbsp;check&amp;nbsp;your&amp;nbsp;installation&amp;nbsp;and&amp;nbsp;try&amp;nbsp;again &lt;br /&gt;Exception&amp;nbsp;in&amp;nbsp;thread&amp;nbsp;&quot;main&quot;&amp;nbsp;java.lang.UnsupportedClassVersionError:&amp;nbsp;com/google/wireless/android/vending/developer/signing/tools/extern/export/ExportEncryptedPrivateKeyTool&amp;nbsp;has&amp;nbsp;been&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;a&amp;nbsp;more&amp;nbsp;recent&amp;nbsp;version&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Java&amp;nbsp;Runtime&amp;nbsp;(class&amp;nbsp;file&amp;nbsp;version&amp;nbsp;55.0),&amp;nbsp;this&amp;nbsp;version&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Java&amp;nbsp;Runtime&amp;nbsp;only&amp;nbsp;recognizes&amp;nbsp;class&amp;nbsp;file&amp;nbsp;versions&amp;nbsp;up&amp;nbsp;to&amp;nbsp;52.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jdk 11 버전 설치&lt;/p&gt;
&lt;figure id=&quot;og_1730252559884&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;Java Platform, Standard Edition 11 Reference
Implementations&quot; data-og-description=&quot;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&quot; data-og-host=&quot;jdk.java.net&quot; data-og-source-url=&quot;https://jdk.java.net/java-se-ri/11&quot; data-og-url=&quot;https://jdk.java.net/java-se-ri/11&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jdk.java.net/java-se-ri/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jdk.java.net/java-se-ri/11&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;Java Platform, Standard Edition 11 Reference Implementations&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jdk.java.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/유니티 빌드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/577</guid>
      <comments>https://parksh3641.tistory.com/entry/Error-A-JNI-error-has-occurred-please-check-your-installation-and-try-again-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry577comment</comments>
      <pubDate>Wed, 30 Oct 2024 10:42:52 +0900</pubDate>
    </item>
    <item>
      <title>Cannot find any provider supporting rsa/none/oaepwithsha1andmgf1padding 해결 방법</title>
      <link>https://parksh3641.tistory.com/entry/cannot-find-any-provider-supporting-rsanoneoaepwithsha1andmgf1padding-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 앱 서명 자바 pepk.jar 로 암호화 작업 중에 나타나는 현상&lt;/p&gt;
&lt;pre id=&quot;code_1730252422473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Cannot find any provider supporting rsa/none/oaepwithsha1andmgf1padding ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDK 11 버전으로 설치 후 환경 변수를 변경하고 다시 실행&lt;/p&gt;
&lt;figure id=&quot;og_1730252454356&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;Java Platform, Standard Edition 11 Reference
Implementations&quot; data-og-description=&quot;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&quot; data-og-host=&quot;jdk.java.net&quot; data-og-source-url=&quot;https://jdk.java.net/java-se-ri/11&quot; data-og-url=&quot;https://jdk.java.net/java-se-ri/11&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jdk.java.net/java-se-ri/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jdk.java.net/java-se-ri/11&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;Java Platform, Standard Edition 11 Reference Implementations&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java Platform, Standard Edition 11 Reference Implementations The official Reference Implementation for Java SE&amp;nbsp;11 (JSR&amp;nbsp;384) is based solely upon open-source code available from the JDK&amp;nbsp;11 Project in the OpenJDK Community. This Reference Implementation a&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jdk.java.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/유니티 빌드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/576</guid>
      <comments>https://parksh3641.tistory.com/entry/cannot-find-any-provider-supporting-rsanoneoaepwithsha1andmgf1padding-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry576comment</comments>
      <pubDate>Wed, 30 Oct 2024 10:41:15 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 어드레서블 Addressables 간단 구현 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%96%B4%EB%93%9C%EB%A0%88%EC%84%9C%EB%B8%94-Addressables-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;어드레서블&amp;nbsp;Addressables&amp;nbsp;간단&amp;nbsp;구현&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1729688721545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableExample : MonoBehaviour
{
    // Addressable Asset을 참조하는 AssetReference를 추가합니다.
    public AssetReference assetReference;

    void Start()
    {
        // Addressable Asset 로드
        LoadAsset();
    }

    public void LoadAsset()
    {
        // 비동기로 에셋 로드
        assetReference.LoadAssetAsync&amp;lt;GameObject&amp;gt;().Completed += OnAssetLoaded;
    }

    private void OnAssetLoaded(AsyncOperationHandle&amp;lt;GameObject&amp;gt; obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            // 로드가 성공했을 때, 에셋을 인스턴스화합니다.
            Instantiate(obj.Result, Vector3.zero, Quaternion.identity);
        }
        else
        {
            Debug.LogError(&quot;Failed to load Addressable Asset.&quot;);
        }
    }

    public void UnloadAsset()
    {
        // 에셋 언로드 (메모리에서 해제)
        assetReference.ReleaseAsset();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/575</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%96%B4%EB%93%9C%EB%A0%88%EC%84%9C%EB%B8%94-Addressables-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry575comment</comments>
      <pubDate>Wed, 23 Oct 2024 22:05:31 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 딥 링크 Deep Link 구현 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%94%A5-%EB%A7%81%ED%81%AC-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;딥&amp;nbsp;링크&amp;nbsp;Deep&amp;nbsp;Link&amp;nbsp;구현&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AndroidManifest.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729688604731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;activity android:name=&quot;com.unity3d.player.UnityPlayerActivity&quot;&amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.VIEW&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&amp;gt;
        &amp;lt;!-- 딥링크로 사용할 스키마 설정 (예: myapp://auth) --&amp;gt;
        &amp;lt;data android:scheme=&quot;myapp&quot; android:host=&quot;auth&quot; /&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
&amp;lt;/activity&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729688616830&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class DeepLinkHandler : MonoBehaviour
{
    void Start()
    {
        // 앱이 처음 실행될 때 딥링크가 설정되어 있는지 확인
        if (!string.IsNullOrEmpty(Application.absoluteURL))
        {
            HandleDeepLink(Application.absoluteURL);
        }

        // 앱 실행 중에 딥링크가 호출되면 이벤트를 통해 처리
        Application.deepLinkActivated += HandleDeepLink;
    }

    void HandleDeepLink(string url)
    {
        Debug.Log(&quot;Received deep link: &quot; + url);

        // URL에서 필요한 정보를 추출하고 처리하는 코드 작성
        // 예: myapp://auth?token=abc123
        if (url.Contains(&quot;auth&quot;))
        {
            // 로그인 성공 후 토큰 처리
            var token = GetParameterFromUrl(url, &quot;token&quot;);
            Debug.Log(&quot;Token: &quot; + token);

            // 토큰을 기반으로 추가적인 로그인 처리 등을 수행
            // ...
        }
    }

    // URL에서 특정 파라미터 추출하는 함수 (예: token 값을 가져오기)
    string GetParameterFromUrl(string url, string parameterName)
    {
        Uri uri = new Uri(url);
        string query = uri.Query;
        var queryParams = System.Web.HttpUtility.ParseQueryString(query);
        return queryParams.Get(parameterName);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Info.plist&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729688634071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;key&amp;gt;CFBundleURLTypes&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;CFBundleURLName&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;myapp&amp;lt;/string&amp;gt;
        &amp;lt;key&amp;gt;CFBundleURLSchemes&amp;lt;/key&amp;gt;
        &amp;lt;array&amp;gt;
            &amp;lt;string&amp;gt;myapp&amp;lt;/string&amp;gt; &amp;lt;!-- 딥링크 스키마 --&amp;gt;
        &amp;lt;/array&amp;gt;
    &amp;lt;/dict&amp;gt;
&amp;lt;/array&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729688648967&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#import &quot;UnityAppController.h&quot;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&amp;lt;UIApplicationOpenURLOptionsKey, id&amp;gt; *)options
{
    // Unity로 딥링크 URL 전달
    NSString* absoluteUrl = [url absoluteString];
    UnitySendMessage(&quot;DeepLinkHandler&quot;, &quot;HandleDeepLink&quot;, [absoluteUrl UTF8String]);
    return YES;
}

@end&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/574</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%94%A5-%EB%A7%81%ED%81%AC-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry574comment</comments>
      <pubDate>Wed, 23 Oct 2024 22:04:27 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# AWS S3 파일 다운로드 받는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-AWS-S3-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;AWS&amp;nbsp;S3&amp;nbsp;파일&amp;nbsp;다운로드&amp;nbsp;받는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1728737819774&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;

public class S3FileDownloader : MonoBehaviour
{
    // S3에서 다운로드할 파일의 URL
    private string fileUrl = &quot;https://your-bucket-name.s3.region.amazonaws.com/your-file-name&quot;;
    
    // 파일을 저장할 로컬 경로
    private string localFilePath;

    void Start()
    {
        // 로컬 파일 경로 설정
        localFilePath = Path.Combine(Application.persistentDataPath, &quot;downloadedFile.ext&quot;);
        
        // 파일 다운로드 시작
        StartCoroutine(DownloadFile(fileUrl, localFilePath));
    }

    IEnumerator DownloadFile(string url, string filePath)
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
        {
            Debug.LogError(&quot;File download error: &quot; + request.error);
        }
        else
        {
            // 다운로드된 파일을 로컬에 저장
            File.WriteAllBytes(filePath, request.downloadHandler.data);
            Debug.Log(&quot;File downloaded to: &quot; + filePath);
            
            // 다운로드한 파일을 로드하거나 실행하는 로직
            ExecuteFile(filePath);
        }
    }

    // 예시로 다운로드한 텍스트 파일을 실행하는 로직 (필요에 따라 수정)
    void ExecuteFile(string filePath)
    {
        if (File.Exists(filePath))
        {
            string fileContent = File.ReadAllText(filePath);
            Debug.Log(&quot;Downloaded File Content: &quot; + fileContent);
        }
        else
        {
            Debug.LogError(&quot;File not found: &quot; + filePath);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/573</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-AWS-S3-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry573comment</comments>
      <pubDate>Sat, 12 Oct 2024 22:57:06 +0900</pubDate>
    </item>
    <item>
      <title>Play Console의 광고 ID 선언에는 앱에서 광고 ID를 사용한다고 명시되어 있습니다. 해결 방법</title>
      <link>https://parksh3641.tistory.com/entry/Play-Console%EC%9D%98-%EA%B4%91%EA%B3%A0-ID-%EC%84%A0%EC%96%B8%EC%97%90%EB%8A%94-%EC%95%B1%EC%97%90%EC%84%9C-%EA%B4%91%EA%B3%A0-ID%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C%EB%8B%A4%EA%B3%A0-%EB%AA%85%EC%8B%9C%EB%90%98%EC%96%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Play&amp;nbsp;Console의&amp;nbsp;광고&amp;nbsp;ID&amp;nbsp;선언에는&amp;nbsp;앱에서&amp;nbsp;광고&amp;nbsp;ID를&amp;nbsp;사용한다고&amp;nbsp;명시되어&amp;nbsp;있습니다.&amp;nbsp;활성&amp;nbsp;아티팩트&amp;nbsp;중&amp;nbsp;하나의&amp;nbsp;매니페스트&amp;nbsp;파일에&amp;nbsp;co&lt;a href=&quot;http://m.google.android.gms.permission.AD_ID&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.google.android.gms.permission.AD_ID&lt;/a&gt;&amp;nbsp;권한이&amp;nbsp;포함되어&amp;nbsp;있지&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&gt;매니페스트&amp;nbsp;파일에&amp;nbsp;이&amp;nbsp;권한을&amp;nbsp;포함하지&amp;nbsp;않으면&amp;nbsp;광고&amp;nbsp;ID가&amp;nbsp;0으로&amp;nbsp;처리됩니다.&amp;nbsp;그로&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;&lt;br /&gt;광고 ID 선언을 업데이트하면 이러한 오류를 해결할 수 있습니다.&lt;br /&gt;&lt;br /&gt;AD_ID&amp;nbsp;권한&amp;nbsp;없이&amp;nbsp;Android&amp;nbsp;13(API&amp;nbsp;33)을&amp;nbsp;타겟팅하는&amp;nbsp;앱은&amp;nbsp;광고&amp;nbsp;ID가&amp;nbsp;0으로&amp;nbsp;처리됩니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱의 &lt;b&gt;AndroidManifest.xml&lt;/b&gt; 파일에 아래와 같이 &lt;b&gt;com.google.android.gms.permission.AD_ID&lt;/b&gt; 권한을 추가하세요&lt;/p&gt;
&lt;pre id=&quot;code_1728737482777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;com.google.android.gms.permission.AD_ID&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 빌드 에러 대응</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/571</guid>
      <comments>https://parksh3641.tistory.com/entry/Play-Console%EC%9D%98-%EA%B4%91%EA%B3%A0-ID-%EC%84%A0%EC%96%B8%EC%97%90%EB%8A%94-%EC%95%B1%EC%97%90%EC%84%9C-%EA%B4%91%EA%B3%A0-ID%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C%EB%8B%A4%EA%B3%A0-%EB%AA%85%EC%8B%9C%EB%90%98%EC%96%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry571comment</comments>
      <pubDate>Sat, 12 Oct 2024 22:51:47 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 카메라 안에 마우스 위치로 레이 캐스트 쏘는 방법 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%95%88%EC%97%90-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%9C%84%EC%B9%98%EB%A1%9C-%EB%A0%88%EC%9D%B4-%EC%BA%90%EC%8A%A4%ED%8A%B8-%EC%8F%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;카메라&amp;nbsp;안에&amp;nbsp;마우스&amp;nbsp;위치로&amp;nbsp;레이&amp;nbsp;캐스트&amp;nbsp;쏘는&amp;nbsp;방법&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;pre id=&quot;code_1728025760561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class MouseRaycast : MonoBehaviour
{
    public Camera mainCamera; // 메인 카메라

    void Start()
    {
        if (mainCamera == null)
        {
            mainCamera = Camera.main; // 메인 카메라를 자동으로 할당
        }
    }

    void Update()
    {
        // 마우스 왼쪽 버튼이 눌렸는지 확인
        if (Input.GetMouseButtonDown(0))
        {
            // 마우스 위치에서 카메라 기준 레이 생성
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            // 레이가 충돌하는지 확인
            if (Physics.Raycast(ray, out hit))
            {
                // 충돌된 객체의 정보 출력
                Debug.Log(&quot;Ray hit: &quot; + hit.collider.name);
                
                // 충돌된 객체에 원하는 행동을 추가할 수 있음
                // 예시: 충돌한 객체를 빨간색으로 변경
                hit.collider.GetComponent&amp;lt;Renderer&amp;gt;().material.color = Color.red;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/570</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%95%88%EC%97%90-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%9C%84%EC%B9%98%EB%A1%9C-%EB%A0%88%EC%9D%B4-%EC%BA%90%EC%8A%A4%ED%8A%B8-%EC%8F%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry570comment</comments>
      <pubDate>Fri, 4 Oct 2024 16:09:31 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 스크린샷 찍고 다운로드 폴더에 이미지 저장 방법 간단 구현</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7-%EC%B0%8D%EA%B3%A0-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%8F%B4%EB%8D%94%EC%97%90-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%A0%80%EC%9E%A5-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;스크린샷&amp;nbsp;찍고&amp;nbsp;다운로드&amp;nbsp;폴더에&amp;nbsp;이미지&amp;nbsp;저장&amp;nbsp;방법&amp;nbsp;간단&amp;nbsp;구현&lt;/h2&gt;
&lt;pre id=&quot;code_1728025554851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using System.IO;

public class ScreenshotManager : MonoBehaviour
{
    public string screenshotFileName = &quot;screenshot.png&quot;;

    void Update()
    {
        // 스페이스바를 눌렀을 때 스크린샷을 찍고 저장
        if (Input.GetKeyDown(KeyCode.Space))
        {
            TakeScreenshot();
        }
    }

    // 스크린샷을 찍고 저장하는 함수
    void TakeScreenshot()
    {
        string path = GetScreenshotPath(screenshotFileName);
        ScreenCapture.CaptureScreenshot(path);
        Debug.Log(&quot;Screenshot saved to: &quot; + path);
    }

    // 다운로드 폴더 경로 가져오기
    string GetScreenshotPath(string fileName)
    {
        string folderPath = &quot;&quot;;

        // 각 플랫폼별로 다운로드 폴더 경로 지정
        if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)
        {
            folderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), &quot;Downloads&quot;);
        }
        else if (Application.platform == RuntimePlatform.OSXPlayer || Application.platform == RuntimePlatform.OSXEditor)
        {
            folderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), &quot;Downloads&quot;);
        }
        else if (Application.platform == RuntimePlatform.Android)
        {
            folderPath = &quot;/storage/emulated/0/Download&quot;; // Android의 다운로드 폴더
        }
        else if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            folderPath = Application.persistentDataPath; // iOS에서는 다운로드 폴더 대신 이 경로 사용
        }

        // 폴더가 없으면 생성
        if (!Directory.Exists(folderPath))
        {
            Directory.CreateDirectory(folderPath);
        }

        // 파일 전체 경로 반환
        return Path.Combine(folderPath, fileName);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티 Simple Capture 활용 (에셋)&lt;/h2&gt;
&lt;figure id=&quot;og_1738213773246&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;[유니티 Unity] 유니티로 화면 캡쳐하기 &amp;lt;SimpleCapture&amp;gt;&quot; data-og-description=&quot;유니티로 화면 캡쳐하기 유니티 화면 간단 캡쳐 도구 패키지를 다운 받으면 다음 처럼 창이 생깁니다. 클릭하면 스크린 샷을 사용할 수있는 속성창이 나옵니다. 캡처를 원하는 카메라를 컴포넌&quot; data-og-host=&quot;j2su0218.tistory.com&quot; data-og-source-url=&quot;https://j2su0218.tistory.com/102&quot; data-og-url=&quot;https://j2su0218.tistory.com/102&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgPOe7/hyX7ZakICm/q7ASuDcP2I7yb6XCkFL4s1/img.png?width=232&amp;amp;height=84&amp;amp;face=0_0_232_84,https://scrap.kakaocdn.net/dn/cUiBgO/hyX7PFwSBS/eYy53VulBKDAFeuhQMDQLk/img.png?width=232&amp;amp;height=84&amp;amp;face=0_0_232_84,https://scrap.kakaocdn.net/dn/GJujy/hyX72LFafu/6rAOjgkecQIrQ7KT5Y5dnk/img.png?width=322&amp;amp;height=261&amp;amp;face=0_0_322_261&quot;&gt;&lt;a href=&quot;https://j2su0218.tistory.com/102&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://j2su0218.tistory.com/102&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgPOe7/hyX7ZakICm/q7ASuDcP2I7yb6XCkFL4s1/img.png?width=232&amp;amp;height=84&amp;amp;face=0_0_232_84,https://scrap.kakaocdn.net/dn/cUiBgO/hyX7PFwSBS/eYy53VulBKDAFeuhQMDQLk/img.png?width=232&amp;amp;height=84&amp;amp;face=0_0_232_84,https://scrap.kakaocdn.net/dn/GJujy/hyX72LFafu/6rAOjgkecQIrQ7KT5Y5dnk/img.png?width=322&amp;amp;height=261&amp;amp;face=0_0_322_261');&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;[유니티 Unity] 유니티로 화면 캡쳐하기 &amp;lt;SimpleCapture&amp;gt;&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;j2su0218.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;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/569</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7-%EC%B0%8D%EA%B3%A0-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%8F%B4%EB%8D%94%EC%97%90-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%A0%80%EC%9E%A5-%EB%B0%A9%EB%B2%95-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84#entry569comment</comments>
      <pubDate>Fri, 4 Oct 2024 16:06:08 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 모바일 안에서 웹뷰 띄우는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EC%95%88%EC%97%90%EC%84%9C-%EC%9B%B9%EB%B7%B0-%EB%9D%84%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;모바일&amp;nbsp;안에서&amp;nbsp;웹뷰&amp;nbsp;띄우는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Android 네이티브 코드 (Java)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Unity 프로젝트의 &lt;b&gt;Plugins/Android&lt;/b&gt; 폴더에 WebViewPlugin.java라는 Java 파일을 생성하고 아래 코드를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ C# 으로 코드를 작성한뒤 뒤에 .cs 를 지우고 .java 로 바꾸면 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728025303533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;

public class WebViewPlugin {
    private WebView webView;

    public void showWebView(final Activity activity, final String url) {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 웹뷰 레이아웃 추가
                LinearLayout layout = new LinearLayout(activity);
                layout.setOrientation(LinearLayout.VERTICAL);

                // 웹뷰 생성
                webView = new WebView(activity);
                webView.setWebViewClient(new WebViewClient());
                webView.getSettings().setJavaScriptEnabled(true);

                // 웹사이트 로드
                webView.loadUrl(url);

                // 레이아웃에 웹뷰 추가
                layout.addView(webView);

                // Activity에 웹뷰 레이아웃 설정
                activity.addContentView(layout, new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT, 
                        LinearLayout.LayoutParams.MATCH_PARENT));
            }
        });
    }

    public void closeWebView() {
        if (webView != null) {
            webView.destroy();
            webView = null;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Unity C# 코드에서 Android 네이티브 코드 호출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity C# 코드에서 위의 Java 코드를 호출하여 WebView를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Unity에서 Java 코드를 호출하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728025334092&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class WebViewManager : MonoBehaviour
{
    private AndroidJavaObject webViewPlugin;

    void Start()
    {
        if (Application.platform == RuntimePlatform.Android)
        {
            // Android Java Class 호출
            using (AndroidJavaClass unityPlayer = new AndroidJavaClass(&quot;com.unity3d.player.UnityPlayer&quot;))
            {
                AndroidJavaObject activity = unityPlayer.GetStatic&amp;lt;AndroidJavaObject&amp;gt;(&quot;currentActivity&quot;);

                // WebViewPlugin 클래스의 인스턴스 생성
                webViewPlugin = new AndroidJavaObject(&quot;com.example.webviewplugin.WebViewPlugin&quot;);

                // 웹뷰 열기
                webViewPlugin.Call(&quot;showWebView&quot;, activity, &quot;https://www.example.com&quot;);
            }
        }
    }

    void OnDestroy()
    {
        // 종료 시 웹뷰 닫기
        if (webViewPlugin != null)
        {
            webViewPlugin.Call(&quot;closeWebView&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/568</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EC%95%88%EC%97%90%EC%84%9C-%EC%9B%B9%EB%B7%B0-%EB%9D%84%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry568comment</comments>
      <pubDate>Fri, 4 Oct 2024 16:02:50 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 마이크 데시벨 간단 구현 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%A7%88%EC%9D%B4%ED%81%AC-%EB%8D%B0%EC%8B%9C%EB%B2%A8-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;마이크&amp;nbsp;데시벨&amp;nbsp;간단&amp;nbsp;구현&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1728025022069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class MicrophoneDecibel : MonoBehaviour
{
    public AudioSource audioSource;   // AudioSource 컴포넌트
    private string microphoneDevice;  // 마이크 장치 이름
    private AudioClip microphoneClip; // 마이크에서 입력된 오디오 클립

    void Start()
    {
        // 사용 가능한 마이크 장치 가져오기
        microphoneDevice = Microphone.devices[0];  // 첫 번째 마이크 장치를 사용

        // 마이크에서 오디오 입력을 받아오기 시작
        microphoneClip = Microphone.Start(microphoneDevice, true, 10, 44100); // 10초 길이, 44100Hz
        audioSource.clip = microphoneClip;
        audioSource.loop = true;

        // 마이크 입력이 시작되면 오디오 재생 시작
        while (!(Microphone.GetPosition(microphoneDevice) &amp;gt; 0)) { }
        audioSource.Play();
    }

    void Update()
    {
        // 데시벨 값을 계산하여 출력
        float decibel = GetDecibel();
        Debug.Log(&quot;Current Decibel Level: &quot; + decibel + &quot; dB&quot;);
    }

    // 오디오 샘플을 받아서 RMS를 계산하고 이를 데시벨로 변환하는 함수
    float GetDecibel()
    {
        float[] data = new float[256]; // 오디오 데이터를 저장할 배열
        float sum = 0f;

        // 오디오 데이터를 가져오기 (현재 재생 위치에서 256 샘플)
        audioSource.GetOutputData(data, 0);

        // RMS 계산을 위한 제곱 합 구하기
        foreach (var sample in data)
        {
            sum += sample * sample;
        }

        // RMS 계산 (평균 제곱근)
        float rms = Mathf.Sqrt(sum / data.Length);

        // 데시벨로 변환 (데시벨은 RMS 값의 로그 스케일)
        float decibel = 20 * Mathf.Log10(rms / 0.1f);

        // 데시벨 값이 매우 작은 경우 처리
        if (decibel &amp;lt; -80) decibel = -80;

        return decibel;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/567</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%A7%88%EC%9D%B4%ED%81%AC-%EB%8D%B0%EC%8B%9C%EB%B2%A8-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry567comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:57:15 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 토스트 메시지 간단 구현 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%ED%86%A0%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%8B%9C%EC%A7%80-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;토스트&amp;nbsp;메시지&amp;nbsp;간단&amp;nbsp;구현&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1728024512168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class ToastMessage : MonoBehaviour
{
    public Text toastText;         // UI Text로 사용할 Toast 메시지
    public CanvasGroup canvasGroup; // CanvasGroup을 사용해 페이드 효과 적용
    public float fadeDuration = 0.5f; // 페이드 인/아웃 시간
    public float displayDuration = 2f; // 메시지 표시 시간

    private void Start()
    {
        // 시작할 때 메시지를 숨김
        canvasGroup.alpha = 0;
    }

    // Toast 메시지를 띄우는 함수
    public void ShowToast(string message)
    {
        // 메시지를 설정하고 표시 시작
        toastText.text = message;
        StartCoroutine(FadeToast());
    }

    // Toast 메시지의 페이드 인/아웃 및 표시 유지 시간 관리
    private IEnumerator FadeToast()
    {
        // 페이드 인 (메시지가 서서히 나타남)
        float elapsedTime = 0f;
        while (elapsedTime &amp;lt; fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            canvasGroup.alpha = Mathf.Clamp01(elapsedTime / fadeDuration);
            yield return null;
        }

        // 메시지를 일정 시간 동안 표시
        yield return new WaitForSeconds(displayDuration);

        // 페이드 아웃 (메시지가 서서히 사라짐)
        elapsedTime = 0f;
        while (elapsedTime &amp;lt; fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            canvasGroup.alpha = Mathf.Clamp01(1 - (elapsedTime / fadeDuration));
            yield return null;
        }

        // 메시지 숨김
        canvasGroup.alpha = 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메세지 띄우기&lt;/h2&gt;
&lt;pre id=&quot;code_1728024526440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 예시: Toast 메시지 띄우기
GetComponent&amp;lt;ToastMessage&amp;gt;().ShowToast(&quot;This is a toast message!&quot;);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/566</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%ED%86%A0%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%8B%9C%EC%A7%80-%EA%B0%84%EB%8B%A8-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry566comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:48:56 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 그래프 그리기 간단 구현 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B7%B8%EB%9E%98%ED%94%84-%EA%B7%B8%EB%A6%AC%EA%B8%B0-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;그래프&amp;nbsp;그리기&amp;nbsp;간단&amp;nbsp;구현&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LineRenderer 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728024421402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public class GraphDrawer : MonoBehaviour
{
    // LineRenderer 변수
    private LineRenderer lineRenderer;

    // 그래프의 X축 최소 및 최대 값
    public float xMin = -10f;
    public float xMax = 10f;
    
    // 그래프의 해상도 (즉, 얼마나 세밀하게 그릴지 결정)
    public int resolution = 100;

    void Start()
    {
        // LineRenderer 컴포넌트 가져오기
        lineRenderer = GetComponent&amp;lt;LineRenderer&amp;gt;();
        
        // 그래프 그리기
        DrawGraph();
    }

    // 그래프를 그리는 함수
    void DrawGraph()
    {
        // LineRenderer에 필요한 점의 개수 계산
        lineRenderer.positionCount = resolution;

        // 그래프의 x축 간격 계산
        float step = (xMax - xMin) / (resolution - 1);

        // 각 점의 위치를 계산하여 그래프 그리기
        for (int i = 0; i &amp;lt; resolution; i++)
        {
            float x = xMin + step * i;
            float y = Mathf.Sin(x);  // 예시로 sin 함수를 사용한 그래프
            lineRenderer.SetPosition(i, new Vector3(x, y, 0));
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/565</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B7%B8%EB%9E%98%ED%94%84-%EA%B7%B8%EB%A6%AC%EA%B8%B0-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry565comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:47:21 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 벡터의 각도 구하기 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%B2%A1%ED%84%B0%EC%9D%98-%EA%B0%81%EB%8F%84-%EA%B5%AC%ED%95%98%EA%B8%B0-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;벡터의&amp;nbsp;각도&amp;nbsp;구하기&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1728024317592&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class VectorAngle : MonoBehaviour
{
    void Start()
    {
        // 두 벡터 정의
        Vector3 vectorA = new Vector3(1, 0, 0);  // 예시 벡터 A
        Vector3 vectorB = new Vector3(0, 1, 0);  // 예시 벡터 B

        // 벡터 사이의 각도 구하기
        float angle = CalculateAngleBetweenVectors(vectorA, vectorB);

        // 결과 출력
        Debug.Log(&quot;두 벡터 사이의 각도: &quot; + angle + &quot;도&quot;);
    }

    // 두 벡터 사이의 각도 구하는 함수
    float CalculateAngleBetweenVectors(Vector3 A, Vector3 B)
    {
        // 두 벡터의 내적 계산
        float dotProduct = Vector3.Dot(A, B);

        // 벡터의 크기(길이) 계산
        float magnitudeA = A.magnitude;
        float magnitudeB = B.magnitude;

        // 코사인 값을 구하고 각도(라디안)를 계산
        float cosTheta = dotProduct / (magnitudeA * magnitudeB);
        
        // 코사인의 역함수를 사용해 라디안 값을 도로 변환
        float angleInRadians = Mathf.Acos(cosTheta);

        // 라디안을 도 단위로 변환
        float angleInDegrees = angleInRadians * Mathf.Rad2Deg;

        return angleInDegrees;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/564</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%B2%A1%ED%84%B0%EC%9D%98-%EA%B0%81%EB%8F%84-%EA%B5%AC%ED%95%98%EA%B8%B0-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry564comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:45:28 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 두 배열에 교집합 찾는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%91%90-%EB%B0%B0%EC%97%B4%EC%97%90-%EA%B5%90%EC%A7%91%ED%95%A9-%EC%B0%BE%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;두&amp;nbsp;배열에&amp;nbsp;교집합&amp;nbsp;찾는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1728023649193&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class ArrayIntersection : MonoBehaviour
{
    void Start()
    {
        int[] array1 = { 1, 2, 3, 4, 5 };
        int[] array2 = { 3, 4, 5, 6, 7 };

        // 배열의 교집합을 찾기
        var intersection = array1.Intersect(array2);

        // 결과 출력
        foreach (int num in intersection)
        {
            Debug.Log(num);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/563</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EB%91%90-%EB%B0%B0%EC%97%B4%EC%97%90-%EA%B5%90%EC%A7%91%ED%95%A9-%EC%B0%BE%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry563comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:34:18 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# URP 용 Outline 쉐이더 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-URP-%EC%9A%A9-Outline-%EC%89%90%EC%9D%B4%EB%8D%94-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;URP&amp;nbsp;용&amp;nbsp;Outline&amp;nbsp;쉐이더&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727959701187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Shader &quot;Custom/OutlineShader&quot;
{
    Properties
    {
        _OutlineColor (&quot;Outline Color&quot;, Color) = (1, 1, 0, 1) // 아웃라인 색상
        _OutlineThickness (&quot;Outline Thickness&quot;, Range(0.0, 0.1)) = 0.02 // 아웃라인 두께
    }
    SubShader
    {
        Tags { &quot;RenderType&quot; = &quot;Opaque&quot; }
        Pass
        {
            // Vertex Shader
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include &quot;UnityCG.cginc&quot;

            struct appdata_t
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
            };

            fixed4 _OutlineColor;
            float _OutlineThickness;

            v2f vert(appdata_t v)
            {
                v2f o;
                // vertex 위치를 외부로 밀어냄
                float3 norm = normalize(v.normal);
                v.vertex.xyz += norm * _OutlineThickness;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = _OutlineColor;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return i.color; // 아웃라인 색상 반환
            }
            ENDHLSL
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/562</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-URP-%EC%9A%A9-Outline-%EC%89%90%EC%9D%B4%EB%8D%94-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry562comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:48:39 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 배열 생성 및 정의하는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%B0%B0%EC%97%B4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티 C#&amp;nbsp;배열&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;정의하는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727959051650&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class ArrayExample : MonoBehaviour
{
    // 정수형 배열 정의 및 초기화
    private int[] intArray = { 1, 2, 3, 4, 5 };

    // 문자열 배열 정의 및 초기화
    private string[] stringArray = { &quot;Hello&quot;, &quot;World&quot;, &quot;Unity&quot; };

    // Vector3 배열 정의 및 초기화
    private Vector3[] vectorArray = 
    {
        new Vector3(1f, 2f, 3f),
        new Vector3(4f, 5f, 6f),
        new Vector3(7f, 8f, 9f)
    };

    void Start()
    {
        // 배열의 값 출력
        Debug.Log(&quot;Integer Array:&quot;);
        foreach (int number in intArray)
        {
            Debug.Log(number);
        }

        Debug.Log(&quot;String Array:&quot;);
        foreach (string text in stringArray)
        {
            Debug.Log(text);
        }

        Debug.Log(&quot;Vector3 Array:&quot;);
        foreach (Vector3 vector in vectorArray)
        {
            Debug.Log(vector);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배열 크기 정의 및 값 할당&lt;/h2&gt;
&lt;pre id=&quot;code_1727959080225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class ArrayAssignment : MonoBehaviour
{
    private int[] numbers; // 정수형 배열 정의

    void Start()
    {
        // 배열 크기 정의
        numbers = new int[5];

        // 각 인덱스에 값 할당
        for (int i = 0; i &amp;lt; numbers.Length; i++)
        {
            numbers[i] = i + 1; // 1부터 5까지 값 할당
        }

        // 배열의 값 출력
        Debug.Log(&quot;Assigned Numbers:&quot;);
        foreach (int number in numbers)
        {
            Debug.Log(number);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/561</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%B0%B0%EC%97%B4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry561comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:38:15 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# Vector2 Vector3 정규화 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-Vector2-Vector3-%EC%A0%95%EA%B7%9C%ED%99%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;Vector2&amp;nbsp;Vector3&amp;nbsp;정규화&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규화의 의미&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정규화&lt;/b&gt;: 벡터의 길이를 1로 조정하여 방향만을 나타내는 벡터로 변환합니다. 이는 벡터의 비율을 유지하므로 다른 벡터와의 비교가 용이해집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 예&lt;/b&gt;: 이동 방향, 힘의 방향, 충돌 반응 등을 계산할 때 자주 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Vector2&lt;/h3&gt;
&lt;pre id=&quot;code_1727958927013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class Vector2Normalization : MonoBehaviour
{
    void Start()
    {
        Vector2 originalVector = new Vector2(3f, 4f);
        Vector2 normalizedVector = originalVector.normalized; // 정규화
        Debug.Log(&quot;Original Vector: &quot; + originalVector);
        Debug.Log(&quot;Normalized Vector: &quot; + normalizedVector);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Vector3&lt;/h3&gt;
&lt;pre id=&quot;code_1727958941155&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class Vector3Normalization : MonoBehaviour
{
    void Start()
    {
        Vector3 originalVector = new Vector3(1f, 2f, 2f);
        Vector3 normalizedVector = originalVector.normalized; // 정규화
        Debug.Log(&quot;Original Vector: &quot; + originalVector);
        Debug.Log(&quot;Normalized Vector: &quot; + normalizedVector);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/560</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-Vector2-Vector3-%EC%A0%95%EA%B7%9C%ED%99%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry560comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:35:59 +0900</pubDate>
    </item>
    <item>
      <title>유니티 협업 프로젝트 공유하는 방법 툴 정리</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B3%B5%EC%9C%A0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%ED%88%B4-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티 협업 프로젝트 공유하는 방법 툴 정리&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;216&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; width=&quot;72&quot; height=&quot;22&quot;&gt;툴&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; width=&quot;72&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot; width=&quot;72&quot;&gt;사용 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;4&quot; height=&quot;88&quot;&gt;Git&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;4&quot;&gt;버전 관리 시스템으로 소스 코드 및 에셋 관리에 사용&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. GitHub 또는 GitLab에 리포지토리 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. Unity 프로젝트 폴더에서 Git 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;3. .gitignore 파일 추가하여 불필요한 파일 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;4. 변경 사항을 커밋하고 푸시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;3&quot; height=&quot;66&quot;&gt;Unity Collaborate&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;3&quot;&gt;Unity 내장 버전 관리 툴, 간편하게 팀과 협업 가능&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. Unity에서 프로젝트를 열고 Services 창을 엽니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. Collaborate 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;3. 변경 사항을 커밋하고 동기화하여 팀원과 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;3&quot; height=&quot;66&quot;&gt;Plastic SCM&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;3&quot;&gt;Unity에 최적화된 버전 관리 시스템&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. Plastic SCM 설치 및 계정 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. Unity에서 Plastic SCM 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;3. 변경 사항을 커밋하고 동기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;2&quot; height=&quot;44&quot;&gt;Cloud Storage&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;2&quot;&gt;Google Drive, Dropbox 등 클라우드 스토리지 사용&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. 클라우드 스토리지에 프로젝트 폴더 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. 팀원과 폴더 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;2&quot; height=&quot;44&quot;&gt;Unity Package Manager&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;2&quot;&gt;특정 기능이나 에셋을 패키지로 만들어 공유&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. Packages/manifest.json 파일에 패키지 정보 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. 패키지를 만든 후 팀원과 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot; rowspan=&quot;2&quot; height=&quot;44&quot;&gt;Zip 파일&lt;/td&gt;
&lt;td style=&quot;width: 30.1163%;&quot; rowspan=&quot;2&quot;&gt;간단한 방법으로 프로젝트를 압축하여 공유&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%;&quot;&gt;1. 프로젝트 폴더를 선택하고 압축(zip)합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.3488%;&quot; height=&quot;22&quot;&gt;2. 압축 파일을 이메일 또는 클라우드로 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발/기타 툴 모음 (Tools)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/559</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B3%B5%EC%9C%A0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%ED%88%B4-%EC%A0%95%EB%A6%AC#entry559comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:34:21 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 인스펙터에서 드래그로 값 조절하는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%9D%B8%EC%8A%A4%ED%8E%99%ED%84%B0%EC%97%90%EC%84%9C-%EB%93%9C%EB%9E%98%EA%B7%B8%EB%A1%9C-%EA%B0%92-%EC%A1%B0%EC%A0%88%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;인스펙터에서&amp;nbsp;드래그로&amp;nbsp;값&amp;nbsp;조절하는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727958739341&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header(&quot;Movement Settings&quot;)]
    [SerializeField] private float moveSpeed = 5f; // 이동 속도
    [SerializeField] private float jumpForce = 10f; // 점프 힘

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent&amp;lt;Rigidbody2D&amp;gt;();
    }

    void Update()
    {
        Move();
        Jump();
    }

    void Move()
    {
        float moveInput = Input.GetAxis(&quot;Horizontal&quot;);
        rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y);
    }

    void Jump()
    {
        if (Input.GetButtonDown(&quot;Jump&quot;) &amp;amp;&amp;amp; Mathf.Abs(rb.velocity.y) &amp;lt; 0.001f)
        {
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 설명&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;필드 선언&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;moveSpeed와 jumpForce는 public 또는 [SerializeField]로 선언하여 인스펙터에서 드래그로 값 조절이 가능합니다.&lt;/li&gt;
&lt;li&gt;[Header(&quot;Movement Settings&quot;)]는 인스펙터에서 그룹을 나누어 시각적으로 구분할 수 있게 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rigidbody2D 컴포넌트&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Start() 메서드에서 Rigidbody2D 컴포넌트를 가져옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Update() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Move()와 Jump() 메서드를 호출하여 플레이어를 이동시키고 점프시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이동과 점프&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Move() 메서드는 수평 입력을 받아 Rigidbody2D의 속도를 설정합니다.&lt;/li&gt;
&lt;li&gt;Jump() 메서드는 점프 버튼이 눌렸을 때 점프를 하도록 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유니티 에디터에서 빈 게임 오브젝트를 생성하고 Rigidbody2D 컴포넌트를 추가합니다.&lt;/li&gt;
&lt;li&gt;위의 PlayerController 스크립트를 추가합니다.&lt;/li&gt;
&lt;li&gt;인스펙터에서 moveSpeed와 jumpForce 값을 드래그하여 조정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Play 모드에서 키 입력으로 캐릭터를 이동하고 점프할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/558</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%9D%B8%EC%8A%A4%ED%8E%99%ED%84%B0%EC%97%90%EC%84%9C-%EB%93%9C%EB%9E%98%EA%B7%B8%EB%A1%9C-%EA%B0%92-%EC%A1%B0%EC%A0%88%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry558comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:32:41 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 2d 게임 가속도 제어하는 방법 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-2d-%EA%B2%8C%EC%9E%84-%EA%B0%80%EC%86%8D%EB%8F%84-%EC%A0%9C%EC%96%B4%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;2d&amp;nbsp;게임&amp;nbsp;가속도&amp;nbsp;제어하는&amp;nbsp;방법&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727958663874&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float acceleration = 5f; // 가속도
    public float maxSpeed = 10f; // 최대 속도
    private Vector2 velocity; // 현재 속도

    void Update()
    {
        // 입력을 받아 x축 방향으로 가속도 계산
        float moveInput = Input.GetAxis(&quot;Horizontal&quot;); // -1.0f (왼쪽) 또는 1.0f (오른쪽)

        // 가속도 적용
        if (moveInput != 0)
        {
            velocity.x += moveInput * acceleration * Time.deltaTime; // 가속도 적용
            velocity.x = Mathf.Clamp(velocity.x, -maxSpeed, maxSpeed); // 최대 속도 제한
        }
        else
        {
            // 이동하지 않을 때 속도 감속
            velocity.x = Mathf.MoveTowards(velocity.x, 0, acceleration * Time.deltaTime);
        }

        // 물체의 위치 업데이트
        transform.position += (Vector3)velocity * Time.deltaTime;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 설명&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;변수 설명&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;acceleration: 물체의 가속도를 조절하는 변수입니다.&lt;/li&gt;
&lt;li&gt;maxSpeed: 물체의 최대 속도를 설정합니다.&lt;/li&gt;
&lt;li&gt;velocity: 물체의 현재 속도를 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Update() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Input.GetAxis(&quot;Horizontal&quot;)를 통해 사용자의 입력을 받아 x축 방향으로 가속도를 계산합니다.&lt;/li&gt;
&lt;li&gt;가속도를 적용하고, 속도가 최대 속도를 넘지 않도록 Mathf.Clamp로 제한합니다.&lt;/li&gt;
&lt;li&gt;사용자가 입력하지 않을 경우, Mathf.MoveTowards를 사용하여 속도를 점진적으로 줄여 정지하도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;물체 위치 업데이트&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종적으로 계산된 속도를 사용하여 물체의 위치를 업데이트합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유니티 에디터에서 2D 게임 오브젝트(예: 스프라이트)에 이 스크립트를 추가합니다.&lt;/li&gt;
&lt;li&gt;acceleration과 maxSpeed 값을 조정하여 원하는 가속도와 최대 속도를 설정합니다.&lt;/li&gt;
&lt;li&gt;플레이 모드에서 좌우 방향키를 사용하여 물체를 가속하고 감속할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/557</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-2d-%EA%B2%8C%EC%9E%84-%EA%B0%80%EC%86%8D%EB%8F%84-%EC%A0%9C%EC%96%B4%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry557comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:31:34 +0900</pubDate>
    </item>
    <item>
      <title>유니티 C# 인수와 인자 차이 예시 코드 작성</title>
      <link>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%9D%B8%EC%88%98%EC%99%80-%EC%9D%B8%EC%9E%90-%EC%B0%A8%EC%9D%B4-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니티&amp;nbsp;C#&amp;nbsp;인수와&amp;nbsp;인자&amp;nbsp;차이&amp;nbsp;예시&amp;nbsp;코드&amp;nbsp;작성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인자(Parameter)와 인수(Argument)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인자(Parameter)&lt;/b&gt;: 함수나 메서드를 정의할 때 사용되는 변수입니다. 메서드의 선언 부분에 위치합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인수(Argument)&lt;/b&gt;: 함수를 호출할 때 전달되는 실제 값입니다. 메서드의 호출 부분에 위치합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1727958559369&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class Example : MonoBehaviour
{
    // 인자 (Parameter)
    void Start()
    {
        // 인수를 전달하여 메서드 호출
        Greet(&quot;Alice&quot;); // 여기서 &quot;Alice&quot;는 인수 (Argument)
    }

    // 인자 (Parameter)
    void Greet(string name) // name은 인자
    {
        Debug.Log(&quot;Hello, &quot; + name + &quot;!&quot;); // name을 사용하여 인사 메시지 출력
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;c0472981-c053-449d-9a46-791c904a1b72&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설명&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Greet 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;string name은 인자입니다. 이 메서드가 호출될 때 name이라는 변수에 값이 전달됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Start 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Greet(&quot;Alice&quot;)를 호출할 때 &quot;Alice&quot;는 인수입니다. 이는 Greet 메서드에 전달되어 name 변수에 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인자&lt;/b&gt;: 함수 정의에서 변수로 사용 (예: string name)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인수&lt;/b&gt;: 함수 호출 시 실제로 전달되는 값 (예: &quot;Alice&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발/유니티 C# (Unity)</category>
      <author>SPNK</author>
      <guid isPermaLink="true">https://parksh3641.tistory.com/556</guid>
      <comments>https://parksh3641.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EC%9D%B8%EC%88%98%EC%99%80-%EC%9D%B8%EC%9E%90-%EC%B0%A8%EC%9D%B4-%EC%98%88%EC%8B%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1#entry556comment</comments>
      <pubDate>Thu, 3 Oct 2024 22:29:56 +0900</pubDate>
    </item>
  </channel>
</rss>