<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>GAMEFARM</title>
    <link>https://fammachine.tistory.com/</link>
    <description>Peasant (Game)</description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 05:12:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Farmmachine</managingEditor>
    <image>
      <title>GAMEFARM</title>
      <url>https://tistory1.daumcdn.net/tistory/7508913/attach/cbbd8a38efef486c9396154586ab42b5</url>
      <link>https://fammachine.tistory.com</link>
    </image>
    <item>
      <title>[Unity] 코루틴 (Coroutine)</title>
      <link>https://fammachine.tistory.com/9</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Unity 엔진에서 사용하게 되는 코루틴(Coroutine)에 대해 간단하게 정리하려고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정확한 정보가 아닌, 정리 용도의 글이니, 참고해주시길 바라겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[Unity] Coroutine, 코루틴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. 코루틴의 개념과 정의&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. 특징&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a3&quot;&gt; 3. 코루틴의 생명주기와 제어&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a4&quot;&gt; 4. 코루틴과 가비지 컬렉션&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a5&quot;&gt;5. 결론&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코루틴의 개념과 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.1. 코루틴의 개념과 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코루틴(Coroutine)은 실행을 일시 중지하고 나중에 다시 시작할 수 있는 특별한 종류의 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity에서 코루틴은 MonoBehaviour 클래스에서 제공하는 기능으로, 시간이 걸리는 작업을 여러 프레임에 걸쳐 분산하여 실행할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.2. 작동 원리&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실행 등록
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;StartCoroutine이 호출되면 해당 코루틴이 Unity의 코루틴 관리자에 등록됩니다&lt;/li&gt;
&lt;li&gt;각 코루틴은 IEnumerator 객체로 변환되어 관리됩니다&lt;/li&gt;
&lt;li&gt;MonoBehaviour 컴포넌트와 연결되어 생명주기가 관리됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실행 사이클
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity는 매 프레임마다 등록된 모든 코루틴을 순회합니다&lt;/li&gt;
&lt;li&gt;각 코루틴의 현재 상태(yield return 값)를 확인합니다&lt;/li&gt;
&lt;li&gt;yield return 값에 따라 다음과 같이 처리됩니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null: 다음 프레임에 즉시 실행&lt;/li&gt;
&lt;li&gt;WaitForSeconds: 지정된 시간만큼 대기&lt;/li&gt;
&lt;li&gt;WaitForFixedUpdate: 다음 물리 업데이트까지 대기&lt;/li&gt;
&lt;li&gt;CustomYieldInstruction: 사용자 정의 조건이 만족될 때까지 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실행 흐름
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코루틴은 yield return 문을 만날 때마다 실행을 일시 중단합니다&lt;/li&gt;
&lt;li&gt;중단된 지점의 모든 상태(지역 변수, 실행 위치 등)가 보존됩니다&lt;/li&gt;
&lt;li&gt;다음 실행 시점에 중단된 지점부터 다시 시작됩니다&lt;/li&gt;
&lt;li&gt;이 과정은 코루틴이 완료되거나 수동으로 중지될 때까지 계속됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;yield return 지점마다 약간의 오버헤드가 발생할 수 있습니다&lt;/li&gt;
&lt;li&gt;하지만 일반적으로 스레드 생성/관리 비용보다 훨씬 효율적입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;종료 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코루틴이 마지막 명령을 실행하거나 yield break를 만나면 자동으로 종료됩니다&lt;/li&gt;
&lt;li&gt;MonoBehaviour가 비활성화되거나 제거될 때 연관된 모든 코루틴이 자동으로 종료됩니다&lt;/li&gt;
&lt;li&gt;StopCoroutine이나 StopAllCoroutines 호출로 수동 종료도 가능합니다&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.3. 일반 함수와의 차이점&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738907514973&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 일반 함수: 한 번에 모든 작업 실행
void NormalFunction()
{
    for (int i = 0; i &amp;lt; 1000; i++)
    {
        ProcessHeavyTask(); // 프레임 드롭 발생 가능
    }
}

// 코루틴: 작업을 여러 프레임에 분산
IEnumerator CoroutineFunction()
{
    for (int i = 0; i &amp;lt; 1000; i++)
    {
        ProcessHeavyTask();
        if (i % 10 == 0)
            yield return null; // 다음 프레임에 계속
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.1. 비동기 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메인 게임 로직을 차단하지 않고 백그라운드에서 작업 실행 가능&lt;/li&gt;
&lt;li&gt;프레임 드랍 없이 무거운 작업 처리 가능&lt;/li&gt;
&lt;li&gt;자연스러운 시간 기반 동작 구현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.2. 실행 제어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 일시 중지 및 재개 가능&lt;/li&gt;
&lt;li&gt;특정 조건이나 시간 간격으로 실행 제어&lt;/li&gt;
&lt;li&gt;여러 코루틴의 동시 실행 및 관리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.3. 메모리 효율&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;Unity의 이벤트 루프 내에서 실행되어 동기화 문제 없음&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코루틴의 생명주기와 제어&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.1. 코루틴 시작 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738907708986&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CoroutineExample : MonoBehaviour
{
    void Start()
    {
        // 1. 메서드 참조로 시작
        StartCoroutine(MyCoroutine());
        
        // 2. 문자열로 시작
        StartCoroutine(&quot;MyCoroutine&quot;);
        
        // 3. 파라미터와 함께 시작
        StartCoroutine(ParameterizedCoroutine(5f));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.2. 대기(Wait) 처리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738907786990&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private IEnumerator WaitingExample()
{
    // 1. 다음 프레임까지 대기
    yield return null;

    // 2. 지정된 시간(초) 대기
    yield return new WaitForSeconds(2f);

    // 3. 실제 시간으로 대기 (타임스케일 영향 받지 않음)
    yield return new WaitForSecondsRealtime(2f);

    // 4. 조건이 충족될 때까지 대기
    yield return new WaitUntil(() =&amp;gt; someCondition);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.3. 코루틴 종료&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738907876813&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CoroutineTermination : MonoBehaviour
{
    private Coroutine myCoroutine;

    void StopCoroutineExample()
    {
        // 1. 특정 코루틴 정지
        if (myCoroutine != null)
            StopCoroutine(myCoroutine);

        // 2. 이름으로 코루틴 정지
        StopCoroutine(&quot;MyCoroutine&quot;);

        // 3. 모든 코루틴 정지
        StopAllCoroutines();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.4. 중첩 코루틴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩 코루틴은 한 코루틴 내에서 다른 코루틴을 시작하고 관리하는 패턴을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 복잡한 시퀀스를 구조화하고 제어할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738907948880&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NestedCoroutineExample : MonoBehaviour
{
    // 1. 순차적 중첩
    IEnumerator ParentCoroutine()
    {
        Debug.Log(&quot;부모 코루틴 시작&quot;);
        yield return StartCoroutine(ChildCoroutine());
        Debug.Log(&quot;자식 코루틴 완료 후 실행&quot;);
    }

    // 2. 병렬 중첩
    IEnumerator ParallelParentCoroutine()
    {
        StartCoroutine(ChildCoroutine1());
        StartCoroutine(ChildCoroutine2());
        yield return StartCoroutine(ChildCoroutine3());
    }

    // 3. 조건부 중첩
    IEnumerator ConditionalNestedCoroutine()
    {
        while (true)
        {
            if (someCondition)
                yield return StartCoroutine(ChildCoroutine());
            yield return null;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중첩 코루틴의 제어 흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;yield return StartCoroutine()은 자식 코루틴이 완료될 때까지 대기&lt;/li&gt;
&lt;li&gt;StartCoroutine() 만 호출하면 비동기적으로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코루틴과 가비지 컬렉션&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity의 코루틴 시스템은 게임 개발에서 강력한 도구이지만, 잘못 사용하면 가비지 컬렉션(GC)으로 인한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제를 야기할 수 있습니다. 특히 모바일 게임이나 대규모 시스템에서는 이러한 문제가 두드러질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 원인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복적인 객체 생성:
&lt;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;yield 인스트럭션 객체의 무분별한 생성&lt;/li&gt;
&lt;li&gt;코루틴 내부에서의 임시 객체 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;delegate와 람다 표현식 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리소스 관리 미흡:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;종료되지 않은 코루틴 누적&lt;/li&gt;
&lt;li&gt;미사용 객체의 지연된 정리&lt;/li&gt;
&lt;li&gt;순환 참조로 인한 메모리 누수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방지 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 코루틴 캐싱&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;코루틴 캐싱은 자주 사용되는 yield 인스트럭션 객체를 재사용하는 기법입니다. 매번 새로운 객체를 생성하는 대신,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번 생성한 객체를 계속 재사용함으로써 가비지 생성을 줄일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 특징:&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;자주 사용되는 대기 시간을 가진 WaitForSeconds 객체를 미리 생성&lt;/li&gt;
&lt;li&gt;고정된 시간 간격으로 실행되는 코루틴에서 특히 효과적&lt;/li&gt;
&lt;li&gt;MonoBehaviour 클래스의 멤버 변수로 선언하여 재사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단하고 직관적인 구현&lt;/li&gt;
&lt;li&gt;즉각적인 메모리 사용량 감소&lt;/li&gt;
&lt;li&gt;특히 반복적으로 실행되는 코루틴에서 효과적&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1738908711999&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CoroutineExample : MonoBehaviour
{
    // 자주 사용하는 yield 인스트럭션 캐싱
    private readonly WaitForSeconds oneSecondWait = new WaitForSeconds(1f);
    private readonly WaitForFixedUpdate waitForFixed = new WaitForFixedUpdate();

    // 캐시된 인스트럭션 사용
    IEnumerator CachedCoroutine()
    {
        while (true)
        {
            // 캐시된 객체 재사용
            yield return oneSecondWait;
            DoSomething();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 풀링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코루틴 객체 풀링은 여러 개의 코루틴을 미리 생성하여 재사용하는 패턴입니다. 동적으로 코루틴을 생성하고 파괴하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, 미리 생성된 코루틴을 재사용함으로써 가비지 생성을 최소화합니다.&lt;/p&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 코루틴을 미리 생성하여 풀에 보관&lt;/li&gt;
&lt;li&gt;필요할 때 풀에서 가져와 사용&lt;/li&gt;
&lt;li&gt;사용이 끝나면 다시 풀로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적 할당 횟수 감소&lt;/li&gt;
&lt;li&gt;메모리 단편화 감소&lt;/li&gt;
&lt;li&gt;대량의 코루틴을 사용하는 시스템에서 효과적&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1738908792594&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CoroutinePool : MonoBehaviour
{
    private Queue&amp;lt;IEnumerator&amp;gt; coroutinePool = new Queue&amp;lt;IEnumerator&amp;gt;();
    private int poolSize = 10;

    void Start()
    {
        // 코루틴 객체 미리 생성
        for (int i = 0; i &amp;lt; poolSize; i++)
        {
            coroutinePool.Enqueue(CreateCoroutine());
        }
    }

    IEnumerator GetCoroutineFromPool()
    {
        if (coroutinePool.Count &amp;gt; 0)
            return coroutinePool.Dequeue();
        return CreateCoroutine();
    }

    void ReturnToPool(IEnumerator coroutine)
    {
        coroutinePool.Enqueue(coroutine);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 이러한 최적화 기법들을 통해 성능을 가비지 생성을 줄이고, 게임 성능을 향상 시킬 수 있을 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코루틴은&amp;nbsp; 시간 기반 작업들인 애니메이션 효과, 타이머, 스킬 쿨다운 관리 등의 기능을 효과적으로 구현할 수 있게 도와줍니다. 또한, 게임 로직과 비동기 작업 처리에 있어서는 필수적이라고도 할 수 있습니다. AI 캐릭터의 패턴과, 이벤트의 진행, 게임 리소스의 로딩 등을 효과적으로 처리할 수 있도록 도와줍니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서, 코루틴은 Unity 개발에서 없어서는 안 될 중요한 도구입니다. 시간에 따른 동작이나 비동기 처리가 필요한 상황에서 코루틴을 활용하면, 깔끔하고 효율적인 코드를 작성할 수 있습니다. 다만 최적화와 관리에 주의를 기울여야만 그 장점을 최대한 활용할 수 있습니다. &lt;/b&gt;&lt;/p&gt;</description>
      <category>Game Dev./Unity</category>
      <category>ARCANA</category>
      <category>Coroutine</category>
      <category>dev</category>
      <category>Farm</category>
      <category>game</category>
      <category>game dev</category>
      <category>unity #game develop</category>
      <category>게임 개발</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/9</guid>
      <comments>https://fammachine.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 7 Feb 2025 15:24:19 +0900</pubDate>
    </item>
    <item>
      <title>[ARCANA] 아르카나 긴급! 뉴스 속보!</title>
      <link>https://fammachine.tistory.com/8</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Unity 엔진으로 개발 중인, ARCANA 게임 프로젝트의 스토리 콘셉에 맞는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;영상을 하나 만들어 봤습니다. 재미있게 봐주셨으면 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[ARCANA] 아르카나 긴급! 뉴스 속보! ACTV BREAKING!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차 &lt;/b&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. ACTV 긴급 속보&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. 마무리&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 목차를 클릭하면 해당 글로 자동 이동 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ACTV 긴급 속보&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;[NEWS] 긴급 뉴스 속보!&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[NEWS]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아르카나 공영 방송 (ACTV)는 아르카나 인류 연방 정부의 요청에 따라,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;긴급 속보를 보내드립니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연방군 대변인이 직접 뉴스를 전해드리겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;신이시여, 인류에게 축복을!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/452550662&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Eb5hm/hyX4oaXF8d/q49lmnYvGwcBIrdpKzhlHK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/pE1rK/hyX7TtAM7I/cq69urLzrcFUxAgYMDeRI0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;'GAMEFARM'에서 업로드한 동영상&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/452550662?service=daum_tistory&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;아르카나 공영 방송 긴급 속보, ACTV Breaking News&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자유와 평등을 위한 인류의 성전이 시작되었습니다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 마무리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ARCANA는 Unity 엔진을 활용해, 개발 중인 덱 빌딩 로그라이크 카드 게임입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인류의 지도자로서, 용족에게 억압받는 인류에게 구원을 가져다 주십시오!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게임 스토리와 관련된 영상을 하나 만들어 보았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아무쪼록, 재미있게 시청하셨으면 좋겠습니다!&lt;/b&gt;&lt;/p&gt;</description>
      <category>Game Dev./ETC</category>
      <category>ARCANA</category>
      <category>Development</category>
      <category>Farm</category>
      <category>game</category>
      <category>Game Develop</category>
      <category>gamefarm</category>
      <category>NewS</category>
      <category>Story</category>
      <category>unity</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/8</guid>
      <comments>https://fammachine.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 24 Jan 2025 05:59:12 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] ScriptableObject, 스크립터블 오브젝트</title>
      <link>https://fammachine.tistory.com/7</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Unity의 ScriptableObject에 대해 간단하게 정리해보려 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;잘 못 알고있는 정보가 있을 수 있으니, 참고해주시길 바라겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[Unity]&amp;nbsp;ScriptableObject,&amp;nbsp;스크립터블&amp;nbsp;오브젝트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차 &lt;/b&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. 개요&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. ScriptableObject&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a3&quot;&gt; 3. 예제&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a4&quot;&gt; 4. 결론&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity로 게임을 만들다 보면 다양한 데이터를 관리해야 합니다. 캐릭터의 체력, 아이템의 정보, 스킬의 효과 등 수많은 정보들을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 효율적으로 관리할 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 개발자들이 처음에는 이런 방식을 사용합니다:&lt;/p&gt;
&lt;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;li&gt;MonoBehaviour 컴포넌트에 일일이 값을 넣기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이런 방식들은 다음과 같은 불편함이 있을 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 수정이 필요할 때마다 코드를 변경해야 함&lt;/li&gt;
&lt;li&gt;같은 데이터를 여러 번 복사해야 함&lt;/li&gt;
&lt;li&gt;기획자가 직접 데이터를 수정하기 어려움&lt;/li&gt;
&lt;li&gt;버전 관리가 복잡해짐&lt;/li&gt;
&lt;li&gt;메모리 사용이 비효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제들을 해결하기 위해 Unity는 ScriptableObject를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ScriptableObject&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; ScriptableObject는 Unity에서 제공하는 특별한 데이터 저장소입니다. 엑셀 시트처럼 게임에 필요한 데이터를 저장하고 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;관리할 수 있는 도구라고 생각하면 됩니다. &lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ScriptableObject는 다음과 같은 장점을 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터를 에셋으로 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity 에디터에서 직접 데이터 수정 가능&lt;/li&gt;
&lt;li&gt;프로그래머가 아닌 기획자도 쉽게 데이터 수정 가능&lt;/li&gt;
&lt;li&gt;버전 관리 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 효율성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 데이터를 여러 번 복사하지 않음&lt;/li&gt;
&lt;li&gt;한 번 메모리에 로드하면 여러 곳에서 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 형식을 미리 정의할 수 있음&lt;/li&gt;
&lt;li&gt;실수로 잘못된 데이터를 입력하는 것을 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 방식과 비교하여, 한 번 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 데이터 관리 방식 [ex. 무기 정보]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. MonoBehaviour에 직접 입력&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737104089732&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Weapon : MonoBehaviour
{
    public string weaponName = &quot;기본 검&quot;;
    public int damage = 10;
    public int durability = 100;
}&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;2. 변수에 직접 하드코딩&lt;/p&gt;
&lt;pre id=&quot;code_1737104158866&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class WeaponData
{
    public static Dictionary&amp;lt;string, int&amp;gt; weaponDamage = new Dictionary&amp;lt;string, int&amp;gt;()
    {
        {&quot;기본 검&quot;, 10},
        {&quot;강화된 검&quot;, 20}
    };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 방식을 사용했을 때, 불편한 점이 어떤 것이 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 여러 무기를 만들 때마다 같은 내용을 반복해서 입력하여야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드를 수정하지 않고는 데이터를 변경할 수 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 불편한 점이 발생하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 아래 예제에서 설명할 방식으로 ScriptableObject를 사용한다면, 위의 불편함을 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[무기 정보]를 예를 들어 각각의 방식의 차이에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;MonoBehaviour 사용 방식&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 무기 정보&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737105178111&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// WeaponMonoBehaviour.cs
public class WeaponMonoBehaviour : MonoBehaviour 
{
    public string weaponName = &quot;기본 검&quot;;
    public int damage = 10;
    public float attackSpeed = 1.0f;
    public Sprite weaponIcon;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ex) 여러 검이 필요하다면 [기존 검 데이터 공유]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737105358063&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 여러 검이 필요한 경우
public class Sword1 : MonoBehaviour { public int damage = 10; }
public class Sword2 : MonoBehaviour { public int damage = 15; }
public class Sword3 : MonoBehaviour { public int damage = 20; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터의 중복 (모든 데이터가 인스턴스마다 복제됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 낭비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;ScriptableObject 방식&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 무기 정보&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737105528749&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// WeaponData.cs
[CreateAssetMenu(fileName = &quot;New Weapon&quot;, menuName = &quot;Game/Weapon Data&quot;)]
public class WeaponData : ScriptableObject
{
    [Header(&quot;기본 정보&quot;)]
    public string weaponName;
    public Sprite weaponIcon;
    
    [Header(&quot;무기 스탯&quot;)]
    public int damage;
    public float attackSpeed;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;- ex) 여러 검이 필요하다면 [기존 검 데이터 공유]&lt;/b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737105673867&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// WeaponInstance.cs
public class WeaponInstance : MonoBehaviour 
{
    public WeaponData weaponData; // ScriptableObject 참조
    private int currentDamage;    // 이 무기 인스턴스의 현재 데미지

    private void Start()
    {
        // weaponData의 기본 데미지 값으로 초기화
        currentDamage = weaponData.damage;
        
        // 이후 currentDamage는 독립적으로 변경 가능
        // 예: 강화, 버프 등으로 인한 데미지 변경
    }

    public void UpgradeDamage(int amount)
    {
        // 각 무기 인스턴스별로 독립적으로 데미지 수정 가능
        currentDamage += amount;
    }

    public int GetDamage()
    {
        return currentDamage;
    }
}&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;- 기본 데이터(이름, 아이콘, 공격 속도 등)는 ScriptableObject에서 공유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개별 상태(데미지 등)는 각 인스턴스가 별도 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, 다음과 같은 차이점이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MonoBehaviour 방식: 모든 데이터가 인스턴스마다 복제됨&lt;/li&gt;
&lt;li&gt;ScriptableObject 방식: 공통 데이터는 공유하고, 변경되는 데이터만 인스턴스가 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리를 효율적으로 사용하며너 각 무기의 독립적인 상태 관리가 가능하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;주요 차이점&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각자 인스턴스를 생성하는 것에는 큰 차이가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 다음과 같은 차이가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;ScriptableObject: 하나의 데이터를 여러 곳에서 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 효율&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 방식: 인스턴스마다 메모리 할당&lt;/li&gt;
&lt;li&gt;ScriptableObject: 데이터 공유로 메모리 절약&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 방식: 각 프리팹마다 수정 필요&lt;/li&gt;
&lt;li&gt;ScriptableObject: 한 곳에서 수정하면 전체 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 예제와 비교를 통해 ScriptableObject가 제공하는 이점을 실제로 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 대규모 프로젝트에서 크게 체감할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity의 ScriptableObject (스크립터블 오브젝트)에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 프로젝트에서 공통으로 사용되는 데이터들을 관리하기 편리하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음과 같은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이템 정보&lt;/li&gt;
&lt;li&gt;캐릭터 스탯&lt;/li&gt;
&lt;li&gt;스킬 효과&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분에서 효과적으로 공통 데이터들을 관리할 수 있을 것입니다.&lt;/p&gt;
&lt;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; ScriptableObject는 Unity에서 데이터를 관리하는 강력한 도구입니다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;처음에는 설정이 조금 번거로울 수 있지만, 한번 구축해 놓으면 데이터 관리가 매우 편리해집니다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특히 팀 프로젝트에서 기획자와 프로그래머가 효율적으로 협업할 수 있게 해주는 중요한 도구입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘도, 방문해주셔서 감사하며, 틀린 정보가 많을 수 있지만, 키워드라도 얻어가셨으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다!&lt;/p&gt;</description>
      <category>Game Dev./Unity</category>
      <category>ARCANA</category>
      <category>c#</category>
      <category>dev</category>
      <category>farmmachine</category>
      <category>gamedevelop</category>
      <category>gamefarm</category>
      <category>ScriptableObject</category>
      <category>unity</category>
      <category>게임</category>
      <category>게임개발</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/7</guid>
      <comments>https://fammachine.tistory.com/7#entry7comment</comments>
      <pubDate>Fri, 17 Jan 2025 18:44:01 +0900</pubDate>
    </item>
    <item>
      <title>[ARCANA] ARCANA 개발일지 EP.1 Map_1</title>
      <link>https://fammachine.tistory.com/6</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;덱 빌딩 로그라이크 게임 [ARCANA]를 개발하며&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;맡은 파트를 정리하는 용도로 작성하는 글입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[ARCANA] ARCANA 개발일지 EP.1 Map_1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차&lt;/b&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. Map?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. 참고할 맵&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a3&quot;&gt; 3. 맵 구조&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a4&quot;&gt; 4. 개발사항&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a5&quot;&gt;참조&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Map?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵은 플레이어가 게임 내에서 활동하는 공간적 영역과 그 안에서의 이동 경로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호 작용 가능한 요소들을 정의한 게임의 기본 구조입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심적인 요소는 다음과 같이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공간적 구성 : 플레이어가 상호작용할 수 있는 물리적 공간&lt;/li&gt;
&lt;li&gt;게임플레이 요소 : 시작과 끝 지점, 리소스의 분포, 이벤트 및 적의 배치, 상호작용 가능한 게임 오브젝트의 위치&lt;/li&gt;
&lt;li&gt;진행구조 : 게임 진행을 위한 동선&lt;/li&gt;
&lt;li&gt;시각적 요소 : 이동 가능한 경로의 시각화, 게임 오브젝트의 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 요소들이 모여 전체적인 맵 시스템을 구성하며, 게임의 장르와 목적에 따라 다양하게 구현됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면, 어떤 맵들이 있을까요?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;선형 맵&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 단순한 형태의 맵 구조로, 플레이어가 정해진 하나의 경로로만 진행 할 수 있는 맵을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게, 아래와 같은 구조로 이루어져 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Start&amp;nbsp; ~&amp;gt;&amp;nbsp; A&amp;nbsp; ~&amp;gt;&amp;nbsp; B&amp;nbsp; ~&amp;gt;&amp;nbsp; C&amp;nbsp; ~&amp;gt;&amp;nbsp; End&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 선형 맵은 다음과 같은 구조적 특징을 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 포인트 부터 끝 포인트까지 하나의 고정된 경로만 존재&lt;/li&gt;
&lt;li&gt;다른 경로로의 분기는 거의 없음&lt;/li&gt;
&lt;li&gt;순차적인 진행방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제작자가 의도한 대로 이끌어가기 좋음.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;장 점&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;단 점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;명확한 게임 진행 방향 제시&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;선택의 자유도가 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;스토리 전개가 용이&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;재플레이시 재미가 상대적으로 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;난이도 조절이 쉬움&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;탐험 요소는 제한적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;게임에 익숙해지기 쉬움&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&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;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 특징들을 가지며, 대표적인 게임은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crxhmt/btsLKCrAoqm/HiTJtfNPpK2ef4TPFD3Ig1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crxhmt/btsLKCrAoqm/HiTJtfNPpK2ef4TPFD3Ig1/img.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;563&quot; data-is-animation=&quot;false&quot; width=&quot;378&quot; height=&quot;213&quot; data-widthpercent=&quot;49.98&quot; style=&quot;width: 49.3967%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crxhmt/btsLKCrAoqm/HiTJtfNPpK2ef4TPFD3Ig1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrxhmt%2FbtsLKCrAoqm%2FHiTJtfNPpK2ef4TPFD3Ig1%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;1000&quot; height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B9J2I/btsLKCLUfTq/kqK6HxUnCoUkXs1T6Ekfck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B9J2I/btsLKCLUfTq/kqK6HxUnCoUkXs1T6Ekfck/img.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot; data-is-animation=&quot;false&quot; width=&quot;469&quot; height=&quot;264&quot; style=&quot;width: 49.4406%;&quot; data-widthpercent=&quot;50.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B9J2I/btsLKCLUfTq/kqK6HxUnCoUkXs1T6Ekfck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB9J2I%2FbtsLKCLUfTq%2FkqK6HxUnCoUkXs1T6Ekfck%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;1920&quot; height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;슈퍼마리오와 콜오브듀티&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;분기 맵&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임에서 플레이어에게 여러 경로 선택지를 제공하는 맵 구조를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 다음과 같은 구조로 이루어져 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;B --- D -------- X&lt;br /&gt;A&amp;nbsp; &amp;lt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; E ------- X&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;C --&amp;lt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; F ------- END&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 분기맵은 다음과 같은 구조적 특징을 가집니다.&lt;/p&gt;
&lt;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;각 분기점마다 2개 이상의 경로 선택 가능&lt;/li&gt;
&lt;li&gt;여러 경로가 다시 하나로 합쳐질 수도 있음&lt;/li&gt;
&lt;li&gt;최종 목적지는 하나 또는 여러 개일 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;플레이어의 선택에 따라 다른 경험을 할 수 있음&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;장 점&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;단 점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;플레이어에게 전략적 선택권&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;일부 경로의 콘텐츠는 사용률 낮음 등의 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;재플레이시 재미가 높음&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;다른 경로 콘텐츠를 위해 재플레이 해야하는 피로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;다양한 게임 경험 제공&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;플레이어의 의사결정이 게임 진행에 영향을 줌&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 특징을 가지며, 대표적인 게임은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ip0Z/btsLKGU4J0w/5hAOo9rKcQlsJCrrl8shx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ip0Z/btsLKGU4J0w/5hAOo9rKcQlsJCrrl8shx1/img.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;627&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;35.56&quot; style=&quot;width: 35.1426%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ip0Z/btsLKGU4J0w/5hAOo9rKcQlsJCrrl8shx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ip0Z%2FbtsLKGU4J0w%2F5hAOo9rKcQlsJCrrl8shx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ot3XS/btsLKumXNc6/KtYUcLKL7ASIYrY5Ua71Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ot3XS/btsLKumXNc6/KtYUcLKL7ASIYrY5Ua71Xk/img.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;424&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.6946%;&quot; data-widthpercent=&quot;64.44&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ot3XS/btsLKumXNc6/KtYUcLKL7ASIYrY5Ua71Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOt3XS%2FbtsLKumXNc6%2FKtYUcLKL7ASIYrY5Ua71Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Slay the Spire와 Frostpunk&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;오픈월드 맵&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어가 광범위한 가상 세계를 자유롭게 탐험하고 상호작용 할 수 있는 게임 형식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 특징으로는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유로운 이동: 플레이어가 원하는 방향으로 자유롭게 이동 가능&lt;/li&gt;
&lt;li&gt;비선형적 진행: 메인 스토리나 사이드 퀘스트를 원하는 순서로 진행&lt;/li&gt;
&lt;li&gt;상호작용: 환경, NPC, 오브젝트 등과 다양한 상호작용 가능&lt;/li&gt;
&lt;li&gt;광활한 맵: 다양한 지형과 환경이 하나로 연결된 거대한 맵&lt;/li&gt;
&lt;/ul&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;환 경 적 요 소&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;게 임 플 레 이 요 소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;도시, 마을, 숲, 산, 바다 등 다양한 지형&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;자유로운 탐험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;낮 / 밤 주기, 날씨 변화&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;다양한 이동 수단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;자연스러운 생태계&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;다양한 활동 (전투, 수집, 제작 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어가 상당히 자유롭게 가상 세계를 경험하며 플레이 할 수 있는 형식이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 게임은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXPll4/btsLKqSydsu/43LLzp7iS4KtbDHuAi1Lv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXPll4/btsLKqSydsu/43LLzp7iS4KtbDHuAi1Lv1/img.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;891&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.8262%; margin-right: 10px;&quot; data-widthpercent=&quot;54.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXPll4/btsLKqSydsu/43LLzp7iS4KtbDHuAi1Lv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXPll4%2FbtsLKqSydsu%2F43LLzp7iS4KtbDHuAi1Lv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CMd01/btsLKuHjAGd/vuk6X4wRPce3QZrrYVl1h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CMd01/btsLKuHjAGd/vuk6X4wRPce3QZrrYVl1h0/img.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;465&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.011%;&quot; data-widthpercent=&quot;45.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CMd01/btsLKuHjAGd/vuk6X4wRPce3QZrrYVl1h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCMd01%2FbtsLKuHjAGd%2Fvuk6X4wRPce3QZrrYVl1h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;GTA 5, The Elder Scrolls V: Skyrim&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참고할 맵&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Slay the Spire&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arcana는 로그라이크 덱 빌딩 게임입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 장르의&amp;nbsp; 개척자인 Slay the Spire의 맵 시스템과 비슷한 맵 시스템을 구축하기로 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xzqEX/btsLKJqGNAf/Y8Rr4E9ZPCk4xgM7RDN7L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xzqEX/btsLKJqGNAf/Y8Rr4E9ZPCk4xgM7RDN7L1/img.png&quot; data-alt=&quot;Slay the Spire 맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xzqEX/btsLKJqGNAf/Y8Rr4E9ZPCk4xgM7RDN7L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxzqEX%2FbtsLKJqGNAf%2FY8Rr4E9ZPCk4xgM7RDN7L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;365&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Slay the Spire 맵&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;Slay the Spire의 맵 특징을 참고하여,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arcana의 맵을 구성할 것이며, 큰 특징은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수직적 진행 구조 (아래에서 위로)&lt;/li&gt;
&lt;li&gt;각 층마다 3-4개의 선택 가능한 경로&lt;/li&gt;
&lt;li&gt;랜덤하게 생성되는 노드 배치&lt;/li&gt;
&lt;li&gt;시각적으로 명확한 경로 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;맵 구조&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;ARCANA MAP&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아르카나의 맵은 위에서 말한 특징을 가지고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 노드들로 이루어 질 것입니다.&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;이 미 지&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;노 드&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;설 명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca3wo5/btsLKnO4r5j/UEtiYZn3Wjm0u0pKztQnok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca3wo5/btsLKnO4r5j/UEtiYZn3Wjm0u0pKztQnok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca3wo5/btsLKnO4r5j/UEtiYZn3Wjm0u0pKztQnok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca3wo5%2FbtsLKnO4r5j%2FUEtiYZn3Wjm0u0pKztQnok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;170&quot; height=&quot;123&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;전투&lt;br /&gt;(일반)&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;하위 종족부터 상위 종족까지&lt;br /&gt;인류의 밑에서 민주주의에 대해&lt;br /&gt;배울 것입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFBifL/btsLKB7nwGZ/S60Rdg2COb5fxCs3cuIT51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFBifL/btsLKB7nwGZ/S60Rdg2COb5fxCs3cuIT51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFBifL/btsLKB7nwGZ/S60Rdg2COb5fxCs3cuIT51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFBifL%2FbtsLKB7nwGZ%2FS60Rdg2COb5fxCs3cuIT51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;170&quot; height=&quot;120&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;이벤트&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;온갖 음해와 모함 혹은 행운이 찾아옵니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sc2Hv/btsLKqLNr4L/6OYMdOiGDZquhyTxPfEg90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sc2Hv/btsLKqLNr4L/6OYMdOiGDZquhyTxPfEg90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sc2Hv/btsLKqLNr4L/6OYMdOiGDZquhyTxPfEg90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsc2Hv%2FbtsLKqLNr4L%2F6OYMdOiGDZquhyTxPfEg90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;170&quot; height=&quot;111&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;휴식&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;고난한 행군 중에도 휴식이 필요하니까요.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br6LZm/btsLJwTu4Qe/qZCkIsHfCzhrI4kKubzyjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br6LZm/btsLJwTu4Qe/qZCkIsHfCzhrI4kKubzyjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br6LZm/btsLJwTu4Qe/qZCkIsHfCzhrI4kKubzyjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr6LZm%2FbtsLJwTu4Qe%2FqZCkIsHfCzhrI4kKubzyjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;170&quot; height=&quot;120&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;상점&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;폭리를 취하는 인성 나쁜&lt;br /&gt;사장과의 거래입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.6279%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGBkH/btsLKFaQdbT/7UpQBMUSIzp2tUXkow4Bhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGBkH/btsLKFaQdbT/7UpQBMUSIzp2tUXkow4Bhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGBkH/btsLKFaQdbT/7UpQBMUSIzp2tUXkow4Bhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGBkH%2FbtsLKFaQdbT%2F7UpQBMUSIzp2tUXkow4Bhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;170&quot; height=&quot;124&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 31.0464%; text-align: center;&quot;&gt;전투&lt;br /&gt;(용, 보스)&lt;/td&gt;
&lt;td style=&quot;width: 32.3257%; text-align: center;&quot;&gt;최종 라운드, 용을 제거하고&lt;br /&gt;ARCANA 행성에 민주주의를&lt;br /&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;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 노드들로 이루어져있으며, 각 노드들은 각 역할에 맡는 씬으로의 이동을 담당하게 될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NmjCu/btsLJCznh5M/UWzGpKEUk5WXp92lCpXKXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NmjCu/btsLJCznh5M/UWzGpKEUk5WXp92lCpXKXk/img.png&quot; data-alt=&quot;자유를 향한 길&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NmjCu/btsLJCznh5M/UWzGpKEUk5WXp92lCpXKXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNmjCu%2FbtsLJCznh5M%2FUWzGpKEUk5WXp92lCpXKXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;977&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자유를 향한 길&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 맵 시스템은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드 - 각 씬으로 이동하여 스토리를 진행할 수 있게 함&lt;/li&gt;
&lt;li&gt;경로 - 각 노드별 연결된 경로이며, 해당 경로에서 벗어난 노드들은 선택이 불가능하게 제한함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 맵 구조로 다양한 재미를 느끼실 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발사항&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, Slay the Spire의 맵 구조와 비슷한 시스템을 구성하신 분의 자료를 참고하여, 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 중요한 부분은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵의 생성 - 노드 및 경로의 제약 규칙 및 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어 움직임 추적 - 플레이어가 경로를 벗어난 노드를 클릭했는지, 정상적인 경로의 노드라면 씬을 이동하는 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵의 관리 - 맵의 생성 시점 및 저장, 로드 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음의 사항이 핵심이 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분들을 중심으로 자료를 참고하여, 맵 시스템의 개발이 이루어질 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ARCANA의 맵 시스템에 대해 소개해드렸습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맵은 게임의 뼈대를 이루는 핵심 요소이며, 플레이어의 경험을 좌우하는 중요한 구성 요소입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게임의 컨셉과 목적에 따라 다양한 맵 시스템이 선택될 수 있지만,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 가장 중요한 것은 플레이어에게 최고의 게임 경험을 제공하는 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;앞으로도 ARCANA는 플레이어 여러분께 더 나은 게임 경험을 제공하기 위해 노력하겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 id=&quot;a5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slay the Spire Map : &lt;a href=&quot;https://www.youtube.com/watch?v=P9ogBkLWmPQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=P9ogBkLWmPQ&lt;/a&gt;&lt;/p&gt;</description>
      <category>Game Dev./ARCANA</category>
      <category>ARCANA</category>
      <category>dev</category>
      <category>Development</category>
      <category>Farm</category>
      <category>farmmachine</category>
      <category>game</category>
      <category>it</category>
      <category>unity</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/6</guid>
      <comments>https://fammachine.tistory.com/6#entry6comment</comments>
      <pubDate>Fri, 10 Jan 2025 16:38:30 +0900</pubDate>
    </item>
    <item>
      <title>[ARCANA] ARCANA 개발일지 EP.0</title>
      <link>https://fammachine.tistory.com/5</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;덱 빌딩 로그라이크 게임 [ARCANA]를 개발하며&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;맡은 파트를 정리하는 용도로 작성하는 글입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[ARCANA] ARCANA 개발일지 EP.0&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차 &lt;/b&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. ARCANA?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. 개발환경&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a3&quot;&gt; 3. Part&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a4&quot;&gt; 4. Team&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a5&quot;&gt;결론&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ARCANA?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ar1.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDIAa3/btsLDm393SP/hauYXCHypiSxeYsu3vgg9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDIAa3/btsLDm393SP/hauYXCHypiSxeYsu3vgg9k/img.png&quot; data-alt=&quot;시작화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDIAa3/btsLDm393SP/hauYXCHypiSxeYsu3vgg9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDIAa3%2FbtsLDm393SP%2FhauYXCHypiSxeYsu3vgg9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;ar1.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시작화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;ARCANA&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARCANA의 개요에 대해서 간단하게 설명하겠습니다.&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;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;분 류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;장르&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;덱 빌딩, 로그라이크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;PC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;엔진&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;가격&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Free&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;스토리&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼 미래, 환경오염으로 더 이상 지구에서 머물 수 없던 인류는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 고향을 찾아 멀고도 험한 여정을 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다, 용이 지배하는 ARCANA(아르카나) 행성에 도달하게 되었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용에게 자비를 바라며, 행성의 변방에 난민으로 정착하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZBFVM/btsLCZVZIVk/ZiIBTd0dh2LdYU4WjPElgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZBFVM/btsLCZVZIVk/ZiIBTd0dh2LdYU4WjPElgk/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1077&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar3.png&quot; width=&quot;328&quot; height=&quot;184&quot; style=&quot;width: 49.4644%; margin-right: 10px;&quot; data-widthpercent=&quot;50.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZBFVM/btsLCZVZIVk/ZiIBTd0dh2LdYU4WjPElgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZBFVM%2FbtsLCZVZIVk%2FZiIBTd0dh2LdYU4WjPElgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1077&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7fCSj/btsLDkSQCZh/uVsxQD9NzBrMqkZEcvoCBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7fCSj/btsLDkSQCZh/uVsxQD9NzBrMqkZEcvoCBK/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar2.png&quot; width=&quot;551&quot; height=&quot;310&quot; style=&quot;width: 49.3728%;&quot; data-widthpercent=&quot;49.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7fCSj/btsLDkSQCZh/uVsxQD9NzBrMqkZEcvoCBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7fCSj%2FbtsLDkSQCZh%2FuVsxQD9NzBrMqkZEcvoCBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;인류는 ARCANA에서 용족에게 자비를 부탁합니다.&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;p data-ke-size=&quot;size16&quot;&gt;가슴 속 뜨거운 불씨가 점점 불을 키우게 됩니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZuV0/btsLDgiSBJh/MLG22loCA7Kubc1vK8p6r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZuV0/btsLDgiSBJh/MLG22loCA7Kubc1vK8p6r1/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar4.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZuV0/btsLDgiSBJh/MLG22loCA7Kubc1vK8p6r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZuV0%2FbtsLDgiSBJh%2FMLG22loCA7Kubc1vK8p6r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c81Thh/btsLBykpMHD/u4RgW3tuhopoNykiWaPvwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c81Thh/btsLBykpMHD/u4RgW3tuhopoNykiWaPvwK/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar5.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c81Thh/btsLBykpMHD/u4RgW3tuhopoNykiWaPvwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc81Thh%2FbtsLBykpMHD%2Fu4RgW3tuhopoNykiWaPvwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;인류는 평등의 가치에 대해 논하고자 합니다. 가장 인류다운 방식으로 말이죠!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 이상, 참을 수 없던 인류는!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평등의 가치를 가장 인류다운 방식으로 알리고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MYhAM/btsLDLCGFyS/XjJGUlkJKsagXkWb9M1eE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MYhAM/btsLDLCGFyS/XjJGUlkJKsagXkWb9M1eE1/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar6.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MYhAM/btsLDLCGFyS/XjJGUlkJKsagXkWb9M1eE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMYhAM%2FbtsLDLCGFyS%2FXjJGUlkJKsagXkWb9M1eE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IPb6t/btsLEKJNTW3/aREPU3KrRkGaElJN95o5XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IPb6t/btsLEKJNTW3/aREPU3KrRkGaElJN95o5XK/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar7.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IPb6t/btsLEKJNTW3/aREPU3KrRkGaElJN95o5XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIPb6t%2FbtsLEKJNTW3%2FaREPU3KrRkGaElJN95o5XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;평등의 가치를 위해 일어선 자랑스런 인류의 전사들!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일어선 인류는 잊고 살았던 본성을 깨닫습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신들이 한 행성의 개척자이자 혁명가이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;&quot;지배자&quot;&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&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HazuX/btsLDNmYmPN/emxio8XDcERrjySLiyNp6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HazuX/btsLDNmYmPN/emxio8XDcERrjySLiyNp6K/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar8.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HazuX/btsLDNmYmPN/emxio8XDcERrjySLiyNp6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHazuX%2FbtsLDNmYmPN%2Femxio8XDcERrjySLiyNp6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgewmB/btsLC5BAdNP/7m94Pj8FKccWvGXhro4hh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgewmB/btsLC5BAdNP/7m94Pj8FKccWvGXhro4hh0/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;ar9.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgewmB/btsLC5BAdNP/7m94Pj8FKccWvGXhro4hh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgewmB%2FbtsLC5BAdNP%2F7m94Pj8FKccWvGXhro4hh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;과연?? 인류는 철권통치의 용족들에게 억압받는 ARCANA에 자유를 찾아 줄 수 있을까요?&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;드디어, 인류는 ARCANA의 지배자이자 철권통치를 하는 용족에게,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당당히, 맞서게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과연, 인류는 용족에게 억압받는 ARCANA에 자유와 평등을 찾아 줄 수 있을까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러분은 인류의 지도자로서 자유의 빛을 ARCANA에 찾아주어야 하는 임무를 수행해야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;게임 시스템&amp;nbsp;&lt;/blockquote&gt;
&lt;p id=&quot;a2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARCANA는 덱 빌딩, 로그라이크 게임입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 시스템 구성은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메인페이지 &amp;amp; 시작페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FxwuF/btsLE0eCB3R/6iT4511NRcwJENSdogk0Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FxwuF/btsLE0eCB3R/6iT4511NRcwJENSdogk0Yk/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;arm1.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FxwuF/btsLE0eCB3R/6iT4511NRcwJENSdogk0Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFxwuF%2FbtsLE0eCB3R%2F6iT4511NRcwJENSdogk0Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5FVT/btsLBZB9CtH/ouOz7a5ogdxRnObHvgnF20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5FVT/btsLBZB9CtH/ouOz7a5ogdxRnObHvgnF20/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot; data-is-animation=&quot;false&quot; data-filename=&quot;arm2.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5FVT/btsLBZB9CtH/ouOz7a5ogdxRnObHvgnF20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5FVT%2FbtsLBZB9CtH%2FouOz7a5ogdxRnObHvgnF20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;메인 페이지 &amp;amp; 시작페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맵&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arm3.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbsMHX/btsLDVZsilP/58RakAkosJ6z3sMXOZLaAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbsMHX/btsLDVZsilP/58RakAkosJ6z3sMXOZLaAK/img.png&quot; data-alt=&quot;맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbsMHX/btsLDVZsilP/58RakAkosJ6z3sMXOZLaAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbsMHX%2FbtsLDVZsilP%2F58RakAkosJ6z3sMXOZLaAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;arm3.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;맵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전투&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arm4.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T92T8/btsLEpTvtmk/QZ1MFVaXhT8ymmreunXtVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T92T8/btsLEpTvtmk/QZ1MFVaXhT8ymmreunXtVK/img.png&quot; data-alt=&quot;실키와의 전투, 해방을 위한 희생..?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T92T8/btsLEpTvtmk/QZ1MFVaXhT8ymmreunXtVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT92T8%2FbtsLEpTvtmk%2FQZ1MFVaXhT8ymmreunXtVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;arm4.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실키와의 전투, 해방을 위한 희생..?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arm5.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lsA87/btsLEJ5fhbr/9OTzptjbNLCmPJbcvZpxg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lsA87/btsLEJ5fhbr/9OTzptjbNLCmPJbcvZpxg1/img.png&quot; data-alt=&quot;까칠한 주인장.. 경제 사범으로 처벌해야..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lsA87/btsLEJ5fhbr/9OTzptjbNLCmPJbcvZpxg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlsA87%2FbtsLEJ5fhbr%2F9OTzptjbNLCmPJbcvZpxg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;arm5.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;까칠한 주인장.. 경제 사범으로 처벌해야..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arm6.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X7v15/btsLCJS7WR1/8S4DKCvAXfHagaAG6xU4b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X7v15/btsLCJS7WR1/8S4DKCvAXfHagaAG6xU4b0/img.png&quot; data-alt=&quot;검은 거래를 원하는가..?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X7v15/btsLCJS7WR1/8S4DKCvAXfHagaAG6xU4b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX7v15%2FbtsLCJS7WR1%2F8S4DKCvAXfHagaAG6xU4b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;arm6.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;검은 거래를 원하는가..?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;휴식&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arm7.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vCycG/btsLEHM9gW0/4uINnB8xLlNahTI6I5b1bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vCycG/btsLEHM9gW0/4uINnB8xLlNahTI6I5b1bK/img.png&quot; data-alt=&quot;잘 쉬는 것도 중요하겠죠..?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vCycG/btsLEHM9gW0/4uINnB8xLlNahTI6I5b1bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvCycG%2FbtsLEHM9gW0%2F4uINnB8xLlNahTI6I5b1bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1079&quot; data-filename=&quot;arm7.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘 쉬는 것도 중요하겠죠..?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 구성으로 게임은 진행이 될 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵은 랜덤으로 노드의 배치가 바뀌게되어 매번 회차마다, 다양한 경로를 탐험하게 될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전투는 덱에 있는 카드를 기반으로 랜덤으로 플레이어의 손(카드를 낼 수 있는 부분)에 들어오게 되고, 게임을 진행하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발환경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경은 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 66px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;분 류&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;내 용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;플랫폼&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;PC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;엔진&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 22px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Part&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 맡은 파트는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 맵 시스템 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save &amp;amp; Load 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Game Data 관련 로직&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Computer Player의 AI 패턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 파트를 맡게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도, 다음 파트에 관한 내용이 주가 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Team&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임에 미쳐있는 열정적인 팀원들과 함께하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 재미있고 멋있는 팀과 하게되어, 기분이 아주 좋습니다!!!&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 119px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;Team&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;Part&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;헛햇훗&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Leader, Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;놔요&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Unity, Marketing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;김세진&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;가야수&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;마늘기사&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;FarmMachine&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Unity&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;총 6명의 팀원들과 즐거운 게임을 만들어 보겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게, 개발을 시작하는 저희 게임을 소개하게 되어 반갑습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종종 방문하셔서, 저희의 여정을 지켜봐 주십시오!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도, 종종 소식을 올리겠습니다!!&lt;/p&gt;</description>
      <category>Game Dev./ARCANA</category>
      <category>ARCANA</category>
      <category>dev</category>
      <category>farmmachine</category>
      <category>game</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/5</guid>
      <comments>https://fammachine.tistory.com/5#entry5comment</comments>
      <pubDate>Fri, 3 Jan 2025 17:11:25 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Object Pooling, 오브젝트 풀링</title>
      <link>https://fammachine.tistory.com/4</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;최적화 기법 중 하나인, 오브젝트 풀링(Object Pooling)에 대해, 정확하지는 않지만, 정리를 해보고자 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;[Unity] 오브젝트 풀링 (Object Pooling)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a1&quot;&gt; 1. 개요&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a2&quot;&gt; 2. 오브젝트 풀링?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a3&quot;&gt; 3. Unity 공식 오브젝트 풀링&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a4&quot;&gt; 4. 예제&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a5&quot;&gt;5. 성능분석&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#a5&quot;&gt;6. 결론&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;게임 개발에서 오브젝트의 생성과 파괴는 매우 빈번하게 발생하는 작업입니다. 총알을 발사하거나, 적을 생성하거나, 이펙트를 표시하는 등의 상황에서 새로운 오브젝트를 생성하고 불필요해지면 제거하는 작업이 계속됩니다. 하지만 이러한 작업들은 상당한 시스템 리소스를 소모하며, 특히 모바일 환경에서는 심각한 성능 저하를 초래할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #666666;&quot;&gt;오브젝트 풀링은 이러한 문제를 해결하기 위한 최적화 기법으로, Unity 2021부터는 엔진 차원에서 공식적으로 지원되고 있습니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오브젝프 풀링?&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;오브젝트 풀링&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트 풀링은 게임 오브젝트들을 미리 생성하여 풀(pool)에 보관해두고, 필요할 때마다 이를 재사용하는 메모리 관리 기법입니다. 이는 다음과 같은 상황에서 특히 유용합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총알이나 투사체 발사&lt;/li&gt;
&lt;li&gt;파티클 효과나 시각적 효과&lt;/li&gt;
&lt;li&gt;적 캐릭터 스폰&lt;/li&gt;
&lt;li&gt;아이템 드롭&lt;/li&gt;
&lt;li&gt;UI 요소의 동적 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그러면, 기존의 방식인 생성과 파괴와는 어떻게 다를까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIsBd/btsLAZm7SHl/S76gQKVnd8va03U5ZNcm0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIsBd/btsLAZm7SHl/S76gQKVnd8va03U5ZNcm0K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;1332&quot; data-filename=&quot;inde.png&quot; width=&quot;400&quot; height=&quot;453&quot; style=&quot;width: 50.4684%; margin-right: 10px;&quot; data-widthpercent=&quot;51.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIsBd/btsLAZm7SHl/S76gQKVnd8va03U5ZNcm0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIsBd%2FbtsLAZm7SHl%2FS76gQKVnd8va03U5ZNcm0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eo7cCQ/btsLz4imWN5/p03h79guTjixmrZ8Hx9HRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eo7cCQ/btsLz4imWN5/p03h79guTjixmrZ8Hx9HRK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;1391&quot; data-filename=&quot;objpool.png&quot; width=&quot;400&quot; height=&quot;473&quot; style=&quot;width: 48.3688%;&quot; data-widthpercent=&quot;48.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eo7cCQ/btsLz4imWN5/p03h79guTjixmrZ8Hx9HRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feo7cCQ%2FbtsLz4imWN5%2Fp03h79guTjixmrZ8Hx9HRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1177&quot; height=&quot;1391&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;(좌) 기존의 생성/파괴 방식, (우) 오브젝트 풀링 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;기존의 Instantiate/Destroy 방식은 다음과 같은 문제를 가지고 있습니다:&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;높은 CPU 부하&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 오브젝트 생성 시 메모리 할당 필요 (Instantiate)&lt;/li&gt;
&lt;li&gt;사용 후 메모리 해제 (Destroy)&lt;/li&gt;
&lt;li&gt;컴포넌트 초기화에 따른 오버헤드&lt;/li&gt;
&lt;li&gt;파괴 시 가비지 컬렉터 유발&lt;/li&gt;
&lt;li&gt;리소스 비용이 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;/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;장시간 실행 시 성능 저하 누적&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;가비지 컬렉션으로 인한 끊김 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;반면에, 오브젝트 풀링 (Object Pooling)은 다음과 같은 장점을 가집니다.&lt;/blockquote&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;/li&gt;
&lt;li&gt;미리 생성된 객체들의 풀&lt;/li&gt;
&lt;li&gt;활성/비활성 상태 전환으로 재사용&lt;/li&gt;
&lt;li&gt;메모리 할당/해제 최소화&lt;/li&gt;
&lt;li&gt;가비지 컬렉터 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/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;메모리 단편화 방지&lt;/li&gt;
&lt;li&gt;예측 가능한 리소스 관리&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;일관된 성능 제공&lt;/li&gt;
&lt;li&gt;더 나은 사용자 경험&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;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Unity 공식 오브젝트 풀링&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터는 Unity 2021 부터 제공하는 오브젝트 풀링 (Object Pooling)에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity 공식 오브젝트 풀링 시스템은 다음과 같은 특징을 제공합니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;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;IObjectPool&amp;lt;T&amp;gt; 인터페이스 제공&lt;/li&gt;
&lt;li&gt;Unity 컴포넌트 시스템과의 원활한 통합&lt;/li&gt;
&lt;li&gt;타입 안정성 보장&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;최대 용량 제한 기능&lt;/li&gt;
&lt;li&gt;스레드 안전성&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;다양한 오브젝트 타입 지원&lt;/li&gt;
&lt;li&gt;이벤트 콜백 제공&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 예제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 간단한 예제를 통해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[총알 오브젝트 풀]&lt;/p&gt;
&lt;pre id=&quot;code_1735281048197&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using UnityEngine.Pool;

// 총알 오브젝트 풀을 관리하는 매니저 클래스
// 오브젝트 풀링을 통해 총알의 생성/파괴를 최적화합니다.
public class BulletPoolManager : MonoBehaviour
{
    // 풀에서 생성할 총알 프리팹
    [Tooltip(&quot;풀에서 관리할 총알 프리팹을 할당하세요&quot;)]
    public GameObject bulletPrefab;
    
    // 총알 오브젝트들을 관리할 풀 인스턴스
    // IObjectPool 인터페이스를 통해 Get/Release 등의 기능 사용
    private IObjectPool&amp;lt;GameObject&amp;gt; bulletPool;

    // 컴포넌트 초기화 시 오브젝트 풀을 생성합니다.
    private void Start()
    {
        // createFunc: 새 오브젝트 생성 시 호출될 함수
        // actionOnGet: 풀에서 오브젝트를 가져올 때 호출될 함수
        // actionOnRelease: 풀에 오브젝트를 반환할 때 호출될 함수
        // actionOnDestroy: 풀에서 오브젝트가 제거될 때 호출될 함수
        // defaultCapacity: 풀의 초기 크기 (미리 생성할 오브젝트 수)
        // maxSize: 풀이 보유할 수 있는 최대 오브젝트 수
       
       bulletPool = new ObjectPool&amp;lt;GameObject&amp;gt;(
            createFunc: CreateBullet,        // 새 총알 생성
            actionOnGet: OnGetBullet,        // 총알 활성화
            actionOnRelease: OnReleaseBullet, // 총알 비활성화
            actionOnDestroy: OnDestroyBullet, // 총알 파괴
            defaultCapacity: 20,              // 초기에 20개 생성
            maxSize: 100                      // 최대 100개까지 허용
        );
    }

    // 새로운 총알 오브젝트를 생성하고 초기화하는 함수
    // return은 생성된 총알 게임오브젝트
    private GameObject CreateBullet()
    {
        // 프리팹으로부터 새 총알 인스턴스 생성
        GameObject bullet = Instantiate(bulletPrefab);
        // 총알 컨트롤러 컴포넌트 가져오기
        BulletController controller = bullet.GetComponent&amp;lt;BulletController&amp;gt;();
        // 컨트롤러에 풀 참조 전달 (나중에 반환할 때 사용)
        controller.SetPool(bulletPool);
        return bullet;
    }

    // 풀에서 총알을 가져올 때 실행되는 함수
    // bullet은 활성화할 총알 오브젝트
    private void OnGetBullet(GameObject bullet)
    {
        // 총알 오브젝트 활성화
        bullet.SetActive(true);
    }

    // 총알을 풀에 반환할 때 실행되는 함수
    private void OnReleaseBullet(GameObject bullet)
    {
        // 총알 오브젝트 비활성화
        bullet.SetActive(false);
    }

    // 풀에서 총알이 완전히 제거될 때 실행되는 함수
    // maxSize 초과 시 호출될 수 있음
    private void OnDestroyBullet(GameObject bullet)
    {
        // 실제로 총알 오브젝트 파괴
        Destroy(bullet);
    }

    // 지정된 위치와 방향으로 총알을 발사하는 함수
    // position 발사 시작 위치
    // direction 발사 방향
    public void FireBullet(Vector3 position, Vector3 direction)
    {
        // 풀에서 총알 가져오기
        GameObject bullet = bulletPool.Get();
        // 총알 위치 설정
        bullet.transform.position = position;
        // 총알 초기화 (방향 설정 등)
        bullet.GetComponent&amp;lt;BulletController&amp;gt;().Initialize(direction);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[총알 제어 컨트롤러]&lt;/p&gt;
&lt;pre id=&quot;code_1735281466002&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 개별 총알의 동작을 제어하는 컴포넌트
public class BulletController : MonoBehaviour
{
    // 이 총알이 속한 오브젝트 풀 참조
    private IObjectPool&amp;lt;GameObject&amp;gt; pool;
    // 총알 이동 속도
    private float speed = 10f;
    // 총알 활성화 시간
    private float lifetime = 3f;
    // 총알 이동 방향
    private Vector3 direction;

    // 총알에 풀 참조를 설정하는 함수
    // bulletPool 총알이 속한 오브젝트 풀
    public void SetPool(IObjectPool&amp;lt;GameObject&amp;gt; bulletPool)
    {
        pool = bulletPool;
    }

    // 총알 발사 시 초기화하는 함수
    // newDirection 총알의 진행 방향
    public void Initialize(Vector3 newDirection)
    {
        // 방향 정규화
        direction = newDirection.normalized;
        // 총알 활성화 시간 코루틴 시작
        StartCoroutine(LifetimeRoutine());
    }

    // 매 프레임 총알을 이동시키는 함수
    private void Update()
    {
        // 설정된 방향과 속도로 총알 이동
        transform.Translate(direction * speed * Time.deltaTime);
    }

    // 총알 활성화 시간을 관리하는 코루틴
    private IEnumerator LifetimeRoutine()
    {
        // 지정된 시간만큼 대기
        yield return new WaitForSeconds(lifetime);
        // 시간이 다 되면 풀로 반환
        ReturnToPool();
    }

    // 충돌 발생 시 처리하는 함수
    // collision 충돌 정보
    private void OnCollision(Collision collision)
    {
        // 충돌 시 풀로 반환
        ReturnToPool();
    }

    // 총알을 풀로 반환하는 함수
    private void ReturnToPool()
    {
        // 풀이 존재하는 경우에만 반환
        if (pool != null)
        {
            pool.Release(gameObject);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 간단하게 구현해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;성능분석&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 생성/파괴 방식과 비교했을 때의 성능 차이는 다음과 같다고 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU 사용량&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Instantiate/Destroy: 평균 8-15ms&lt;/li&gt;
&lt;li&gt;Object Pooling: 평균 0.1-0.5ms&lt;/li&gt;
&lt;li&gt;개선율: 약 95%&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;풀링 방식: 초기 할당 후 추가 할당 최소화&lt;/li&gt;
&lt;li&gt;가비지 컬렉터 호출 감소: 약 90%&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;평균 프레임 시간 편차 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chartperfo.png&quot; data-origin-width=&quot;2167&quot; data-origin-height=&quot;1565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbsHe9/btsLAtBX8lp/ezjSa8Olc0QDCsvp63Ljik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbsHe9/btsLAtBX8lp/ezjSa8Olc0QDCsvp63Ljik/img.png&quot; data-alt=&quot;일반적으로 이 정도의 성능차이가 난다고 합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbsHe9/btsLAtBX8lp/ezjSa8Olc0QDCsvp63Ljik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbsHe9%2FbtsLAtBX8lp%2FezjSa8Olc0QDCsvp63Ljik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;289&quot; data-filename=&quot;chartperfo.png&quot; data-origin-width=&quot;2167&quot; data-origin-height=&quot;1565&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적으로 이 정도의 성능차이가 난다고 합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;a5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 권장&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빈번한 생성/파괴가 필요한 게임 요소&lt;/li&gt;
&lt;li&gt;모바일 게임 최적화&lt;/li&gt;
&lt;li&gt;대규모 파티클 시스템&lt;/li&gt;
&lt;li&gt;탄막 슈팅 게임&lt;/li&gt;
&lt;li&gt;다수의 적 캐릭터 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Unity의 공식 오브젝트 풀링 시스템을 활용하면 게임의 성능을 크게 향상시킬 수 있습니다. 특히 모바일 게임이나 많은 오브젝트를 다루는 게임에서는 필수적인 최적화 기법이라 할 수 있습니다. 적절한 설계와 구현을 통해 안정적이고 효율적인 게임 개발이 가능합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오늘은, 오브젝트 풀링에 대해 부정확하고, 잘 알지는 못하지만 알고 있는 것을 정리해보았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부족한 정보나마 키워드라도 얻어 가셨으면 합니다. 감사합니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Game Dev./Unity</category>
      <category>ARCANA</category>
      <category>develop</category>
      <category>Farm</category>
      <category>farmachine</category>
      <category>game</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/4</guid>
      <comments>https://fammachine.tistory.com/4#entry4comment</comments>
      <pubDate>Fri, 27 Dec 2024 15:49:03 +0900</pubDate>
    </item>
    <item>
      <title>FrostPunk 리뷰</title>
      <link>https://fammachine.tistory.com/3</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;FrostPunk 리뷰를 간단하게 작성해보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;FrostPunk 리뷰.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;목차 &lt;/b&gt;
&lt;p data-ke-size=&quot;size3&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;#a1&quot;&gt; 1. 게임소개&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;#a2&quot;&gt; 2. 재미 포인트&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;#a3&quot;&gt; 3. 후기&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;들어가며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스팀펑크 풍의 시티빌더 생존 게임. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;갑작스럽게 다가온 빙하기에서 생존하며, 발전기를 중심으로, 인류 최후의 도시를 만드는 재미있는 게임입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(플레이 타임 : 145시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;게임 소개&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=qqEpSOFDXGA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/DVtk6/hyXKnw8ZYi/xh1Nwv8S9O8s8R7ZLtSKZk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/csFQuP/hyXKuQEjDo/gYqRk4kCQwzrPh8CZZLkK1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Frostpunk | Official Launch Trailer&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qqEpSOFDXGA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Frostpunk 공식 트레일러&lt;/figcaption&gt;
&lt;/figure&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;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;게임명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;Frostpunk&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;개발사&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;11Bit Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;장르&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;생존, 시티빌더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;PC, PS4, Xbox One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;출시일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;2018년 4월 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;가격&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;32,000 KRW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;엔진&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스토리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;19세기 말, 화산 폭발과 기후 변화로 인한 극한의 한파가 전 세계를 덮치며 인류 문명이 붕괴된다. 영국의 생존자들은 마지막 희망을 안고 거대한 증기 발전기가 설치된 북쪽 정착지를 향해 떠난다. 플레이어는 이 정착지의 지도자가 되어 혹한 속에서 마지막 생존자들을 이끌어가야 한다.&lt;/p&gt;
&lt;h3 id=&quot;a2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;재미 포인트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생존&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c42r8e/btsLlRJsJms/2ErJKiHuD2geYvFkUcfGa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c42r8e/btsLlRJsJms/2ErJKiHuD2geYvFkUcfGa1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;352&quot; data-filename=&quot;fp1.png&quot; style=&quot;width: 48.4342%; margin-right: 10px;&quot; data-widthpercent=&quot;49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c42r8e/btsLlRJsJms/2ErJKiHuD2geYvFkUcfGa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc42r8e%2FbtsLlRJsJms%2F2ErJKiHuD2geYvFkUcfGa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;352&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwTtb9/btsLkbP3OH1/kCra9oqtOh8d27U5ZzFdj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwTtb9/btsLkbP3OH1/kCra9oqtOh8d27U5ZzFdj1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;451&quot; data-filename=&quot;fp2.png&quot; style=&quot;width: 50.403%;&quot; data-widthpercent=&quot;51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwTtb9/btsLkbP3OH1/kCra9oqtOh8d27U5ZzFdj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwTtb9%2FbtsLkbP3OH1%2FkCra9oqtOh8d27U5ZzFdj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;생존&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불만 - 시민들의 희생이 강요될때 누적이 되고, 최악의 경우에는 최후통첩을 받게 된다. 해소하지 못한다면 게임오버.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희망 - 시민들의 요구사항이 들어주면 올라간다. 0이 되면, 불만과 마찬가지로 게임 오버.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;발전기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 도시의 핵심이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연구소에서 기술 개발을 통해, 업그레이드를 할 수 있으며, &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단계가 올라갈수록 난방구역과 수준을 설정할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 발전기가 꺼진다면, 도시는 무너진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도시 건설&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Cu3Z/btsLkWY25w1/hDoBt048ixqdn7MkRrp6V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Cu3Z/btsLkWY25w1/hDoBt048ixqdn7MkRrp6V0/img.png&quot; data-alt=&quot;발전기를 중심으로 한 도시 전경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Cu3Z/btsLkWY25w1/hDoBt048ixqdn7MkRrp6V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Cu3Z%2FbtsLkWY25w1%2FhDoBt048ixqdn7MkRrp6V0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;319&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발전기를 중심으로 한 도시 전경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시는 난방의 핵심인 발전기를 중심으로 원형으로 건설이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난방 및 전력 공급을 위해 도로를 연결해야 하며,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시민(주거 &amp;amp; 복지), 보건, 식량, 자원, 기술, 목적 건물 (질서, 신앙)이 있다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;법률과 정책&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bevE1r/btsLlaQtoil/xLrFrRxpedfK0rMLRv7cVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bevE1r/btsLlaQtoil/xLrFrRxpedfK0rMLRv7cVK/img.png&quot; data-alt=&quot;법률&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bevE1r/btsLlaQtoil/xLrFrRxpedfK0rMLRv7cVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbevE1r%2FbtsLlaQtoil%2FxLrFrRxpedfK0rMLRv7cVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;259&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;법률&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 적응과 목적(신앙 or 질서) 두 가지로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각, 법률은 건물 해금, 희망 및 불만 조절 등 게임에 필요한 정책들을 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적응&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임이 시작하자마자 사용이 가능한 법률서로, 기초적인 법령들로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시 노동력 구성, 식단, 의료시설 및 환자 처리 등 가장 기본적이고 중요한 법률로 생존 및 도시관리에 적합.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희망과 불만을 관리하는데 적합한 법률로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시의 통치 방향을 정한다고 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 질서(독재), 신앙(종교)으로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;목적법의 최종 법안들은 상당히 무시무시하다. 하지만, 새로운 세상도 열어줄 것이다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;a3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어려운 점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초반 진입장벽이 높음&lt;/li&gt;
&lt;li&gt;실수에 대한 패널티가 강함&lt;/li&gt;
&lt;li&gt;일부 시나리오의 난이도 격차&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이러한 어려움을 극복하고 나면 매력적인 게임성이 기다리고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;극한의 환경에서 살아남기 위해 내리는 선택들, 그리고 그 선택들이 가져오는 결과들을 지켜보는 것은 독특한 재미를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 이 게임은 우리에게 '생존을 위해서라면 어디까지 갈 수 있는가'라는 질문을 던진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 게임을 넘어서 하나의 예술 작품으로서도 충분한 가치가 있다고 평가하고 싶다.&lt;/p&gt;</description>
      <category>Game Dev./Game Review</category>
      <category>game</category>
      <category>Review</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/3</guid>
      <comments>https://fammachine.tistory.com/3#entry3comment</comments>
      <pubDate>Tue, 17 Dec 2024 11:33:06 +0900</pubDate>
    </item>
    <item>
      <title>FARM MACHINE ON</title>
      <link>https://fammachine.tistory.com/1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Game Farm Online.&lt;/p&gt;</description>
      <category>Free.</category>
      <category>Farm</category>
      <category>game</category>
      <author>Farmmachine</author>
      <guid isPermaLink="true">https://fammachine.tistory.com/1</guid>
      <comments>https://fammachine.tistory.com/1#entry1comment</comments>
      <pubDate>Tue, 10 Dec 2024 13:48:27 +0900</pubDate>
    </item>
  </channel>
</rss>