<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ramen_kirby.log</title>
        <link>https://velog.io/</link>
        <description>일단 시작해보자</description>
        <lastBuildDate>Fri, 01 Nov 2024 09:28:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ramen_kirby.log</title>
            <url>https://velog.velcdn.com/images/kuronuma_daisy/profile/f16f153a-324a-4da7-be27-d07c70f72cab/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ramen_kirby.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kuronuma_daisy" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[C++] 무방향 그래프에서 순환 요소(사이클) 찾기]]></title>
            <link>https://velog.io/@kuronuma_daisy/C-%EA%B7%B8%EB%9E%98%ED%94%84%EC%97%90%EC%84%9C-%EC%88%9C%ED%99%98-%EC%9A%94%EC%86%8C%EC%82%AC%EC%9D%B4%ED%81%B4-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@kuronuma_daisy/C-%EA%B7%B8%EB%9E%98%ED%94%84%EC%97%90%EC%84%9C-%EC%88%9C%ED%99%98-%EC%9A%94%EC%86%8C%EC%82%AC%EC%9D%B4%ED%81%B4-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Fri, 01 Nov 2024 09:28:39 GMT</pubDate>
            <description><![CDATA[<p>DFS로 덩어리 개수 찾고, BFS로 최단 거리 찾을 줄 알면 된다고 생각했다가 코테에서 사이클 관련 문제가 나와서 큰코다쳤다. 
시험 시간에 즉흥적으로 사이클 찾다가 실패해서 중간에 포기했다. DFS로 될 것 같아서 계속 시도하다가..ㅎㅎ 시간은 날리고 문제는 못풀어서 손해가 컸음!! 사이클 찾는 것도 경험해봐야 시험 시간에도 빨리빨리 기억이 날 것이다.</p>
<h1 id="무방향-그래프에서-순환-요소사이클-찾기">무방향 그래프에서 순환 요소(사이클) 찾기</h1>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/d7d10d48-5079-4e96-bc17-e229b27f6449/image.png" alt="">
우선 그림을 보고 직관적으로 생각해보자면, 시작 노드(여기서는 1)로부터 일렬로 지나가본다.
1 -&gt; 2 -&gt; 3, 그리고 여기서 5를 갈 수도 있고 4를 갈 수도 있다. 각각 가보겠다.
3 -&gt; 5. (끝)
3 -&gt; 4 -&gt; 2? 방문했던 노드를 다시 만났다. 사이클이 있음을 알 수 있다. </p>
<p>이걸 코드로 옮겨야 한다.!! + 사이클에 해당하는 노드를 찾아야 한다.</p>
<ul>
<li>그림을 보고 그래프를 방문해보며 당연하게 생각한 전제조건은 &#39;뒤로 돌아가지 않는다&#39; 이다. 그러므로 부모 노드가 아닌 재방문 노드여야 한다. =&gt; 부모 노드를 알고 있어야 한다.</li>
<li>노드 방문 순서가 깊이 우선 탐색이 되었다.  </li>
<li>사이클을 깨달을 때 사이클의 끝점이 4고, 사이클의 시작점이 2임을 알 수 있음. 이제 사이클이 존재하는 왔던 길을 되돌아가며 시작점(2)이 나올 때까지 모두 사이클에 해당하는 점으로 넣어버리면 된다.</li>
</ul>
<h2 id="dfs로-쭉-들어가다가-사이클-하나-찾으면-끝내는-코드">DFS로 쭉 들어가다가 사이클 하나 찾으면 끝내는 코드.</h2>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

int V, E;
std::vector&lt;std::vector&lt;int&gt;&gt; graph;
std::vector&lt;int&gt; cycle;
std::vector&lt;int&gt; visited;
int cyclestart = 0;
bool Find(int curnode, int parent)
{
    visited[curnode] = 1;

    for (int nextnode : graph[curnode])
    {
        if (nextnode == parent) continue;
        if (visited[nextnode] == 0)
        {
            if (Find(nextnode, curnode))
            {
                if (cyclestart != -1) // 사이클 시작된 경우
                {
                    cycle.push_back(curnode);
                    if (curnode == cyclestart) // 사이클 시작점으로 돌아온 경우 사이클 종료를 의미
                    {
                        cyclestart = -1;
                    }
                }
                return true;
            }
        }
        else if (visited[nextnode] == 1)
        {
            cyclestart = nextnode;
            cycle.push_back(curnode);
            return true;
        }
    }
    return false;
}

int main()
{

    std::cin &gt;&gt; V &gt;&gt; E;
    graph.resize(V + 1);
    visited.resize(V + 1);
    for (int i = 0; i &lt; E; ++i)
    {
        int v1, v2;
        std::cin &gt;&gt; v1 &gt;&gt; v2;
        graph[v1].push_back(v2);
        graph[v2].push_back(v1);
    }
    Find(1, 1);

    std::cout &lt;&lt; &quot;사이클 : &quot;;
    for (int c : cycle)
    {
        std::cout &lt;&lt; c &lt;&lt; &quot; &quot;;
    }
    return 0;
}</code></pre>
<h2 id="추가-정보">추가 정보</h2>
<p>그래프 한 덩어리 외에도 탐색하려면 for문으로 모든 정점을 돌아 &#39;visited[i] == 0&#39; 인 곳을 모두 Find로 들어가줘야 한다.</p>
<ul>
<li>BFS?
만약 BFS로 풀고 싶다면 queue에 pair(curnode, parentnode)를 담도록 하면 될 것 같다. 현재 탐색 중인 노드의 부모 노드가 아닌데 해당 노드에 재방문했다면, 이는 다른 경로를 통해 해당 노드에 도달한 것을 의미하기 때문에 사이클이 발견된 것이다. 
그리고 각 노드들의 부모 노드를 쭉 따라가며 사이클 노드로 담아야 하므로,
1) 탐색하면서 부모 노드를 추가로 기록해뒀어야 하고
2) 사이클 발견 시점에서 while문으로 돌려줘야한다.
DFS가 낫다고 생각한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE] C++로 UObject 파생 클래스를 인스턴스화 하기, UE에서 관리되는 메모리]]></title>
            <link>https://velog.io/@kuronuma_daisy/UE240928</link>
            <guid>https://velog.io/@kuronuma_daisy/UE240928</guid>
            <pubDate>Sat, 28 Sep 2024 11:44:17 GMT</pubDate>
            <description><![CDATA[<p>언리얼 엔진에서 참조 카운트 및 메모리 관리를 받으려면 직접 malloc/free, 또는 new/delete로 생성과 삭제를 하면 안 된다. 자동으로 이뤄지는 메모리 관리를 받기 위해서는 모든 오브젝트의 메모리 할당은 <code>NewObject&lt;&gt;()</code> 또는 <code>SpawnActor&lt;&gt;()</code> 함수를 사용해야 한다.</p>
<h2 id="c로-uobject-파생-클래스를-인스턴스화-하기">C++로 UObject 파생 클래스를 인스턴스화 하기</h2>
<p> <code>NewObject</code> 함수 사용해서 UObject 파생 모델을 인스턴스화한다. 이 함수는 C++ 클래스 이름만 취하는 것이 아니라 C++ 클래스의 블루프린트 클래스 파생 모델(UClass* 참조)도 필요로 한다. UClass* 참조는 블루프린트에 대한 포인터다.</p>
<h3 id="tsubclassof-fsoftclasspath">TSubclassOf, FSoftClassPath</h3>
<p>C++ 코드에서 특정 블루프린트의 인스턴스를 인스턴스화하려면 이름을 알아야 하는데 이 이름은 컴파일 후에만 접근할 수 있기 때문에 이름을 알려줄 방법이 필요함. 이를 위해 <code>TSubclassOf</code> 타입의 변수를 사용. 코드 수준에서 하드코딩하지 않을 수 있다. 특정 리소스의 이름을 코드에서 직접 입력하는 것을 원치 않듯이, 파생된 블루프린트 클래스 이름을 하드코딩하는 것도 원치 않는 방식이다.
또는 <code>FStringClassReference</code>(UE4) 멤버를 사용해 처리할 수 있다. <strong>UE5</strong>에서는 <code>FSoftClassPath</code>임.</p>
<h4 id="예시">예시</h4>
<p>둘은 같은 역할을 함.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/a159860f-a50c-4e10-b76b-cb5faf0b9ea6/image.png" alt=""></p>
<ul>
<li>UObject 파생 UClass를 선택할 수 있게 된다.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/96956ff0-1a32-4393-abe9-dbcdc97ff796/image.png" alt="">  </li>
<li>FSoftClassPath는 MetaClass 태그에 파생될 것으로 예상되는 클래스를 입력해주면 된다. MetaClass를 그냥 두면 모든 블루프린트들을 볼 수 있다.
예시에서는 GameMode 파생된 UCLASS들을 볼 수 있음.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/da4ece2f-0b27-4df9-bb8a-2b8050f452ae/image.png" alt=""></li>
</ul>
<h3 id="newobject">NewObject&lt;&gt;</h3>
<p>AActor 클래스 파생 - GetWorld()-&gt;SpawnActor&lt;&gt; 사용
UObject 파생 클래스 - NewObject&lt;&gt; 사용
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/0ac741f3-df8c-4d14-896c-edfdba41fff8/image.png" alt="">  </p>
<ul>
<li>SpawnActor, NewObject 사용 모습
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/78cfbc40-851b-4443-bb3e-3155c3a69b8f/image.png" alt=""></li>
</ul>
<p>NewObject 함수는 객체지향 프로그래밍에서 &#39;팩토리&#39;라고 부르는 디자인 패턴이라고 한다. 오브젝트를 직접 생성하는 대신 팩토리에 원하는 오브젝트의 생성을 요청하는 방식. 팩토리 패턴을 잘 사용하면 생성되는 오브젝트를 추적하는 일이 가능해진다.</p>
<h2 id="uobject-파생-클래스-파괴">UObject 파생 클래스 파괴</h2>
<p>메모리 관리 기능의 도움을 받으면 메모리 해체를 잊는 실수를 걱정하지 않아도 된다. 오브젝트를 참조하는 포인터의 수를 기억한다. 참조하는 포인터가 없을 때는 자동으로 즉시 지워지거나, 표시한 후에 다음 차례의 가비지 컬렉션 때 지워진다. 
참조 카운트가 0으로 떨어지기 전에 ConditionalBeginDestroy 함수 사용해서 수동으로 메모리에서 해제할 수 있다. ConditionalBeginDestroy() 명령은 메모리 해제 절차를 시작하며, 재정의 가능한 BeginDestroy()와 FinishDestroy() 함수를 호출한다. 
(근데 플젝할 때 ConditionalBeginDestroy함수를 사용한 적이 없다... Actor는 Destroy로 삭제하는 부분이 꽤 있다. 발사체, 스포너 등등.)
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/b0330553-ad2f-48e0-91f1-98300e96d0d7/image.png" alt=""></p>
<h2 id="관리되는-메모리---오브젝트-추적을-위해-스마트-포인터-사용">관리되는 메모리 - 오브젝트 추적을 위해 스마트 포인터 사용</h2>
<blockquote>
<p>&gt;&gt; TSharedPtr, TWeakPtr, TAutoPtr
delete 호출을 잊는 것을 걱정해서 사용하는 스마트 포인터.</p>
</blockquote>
<p>C++ 코드에서 수동으로 UObject 파생이 아닌 오브젝트를 추적하고 삭제하는 상황이라면 TSharedPtr, TSharedRef와 같은 스마트 포인터를 사용. new 키워드를 사용해 동적으로 할당되는 오브젝트를 사용한다면, 이를 참조 카운트를 지원하는 포인터로 감싸서 자동으로 메모리 해제가 일어나도록 할 수 있다. </p>
<p>TSharedPtr 은 모든 커스텀 C++ 오브젝트를 참조 카운트 방식으로 만든다. (UObject는 이미 참조 카운트 방식임. 그 파생 클래스는 TSharedPtr 사용 불가능) 공유 오브젝트에 더 이상 참조가 없을 때 할당 해제된다. 스레드로부터 안전한(참조 카운팅 방식이 atomic하다고 함. 카운트가 0이되어 제거하는 행동을 정확히 한 번만 실행.-&gt; 기본 오브젝트를 별도의 스레드에서 안전하게 조작할 수 있음을 의미.) 참조 카운트 포인터 타입.
TWeakPtr도 참조 카운트 오브젝트를 지원하는데 삭제를 방지할 수 없다는 특징이 있음.
TAutoPtr 스레드로부터 안전하지 않은 공유 포인터. </p>
<h2 id="언리얼의-가비지-컬렉션-시스템과-uproperty">언리얼의 가비지 컬렉션 시스템과 UPROPERTY</h2>
<p>UCLASS의 멤버로 UPROPERTY 같은 오브젝트가 있을 때 블루프린트에서 편집하지 않더라도 UPROPERTY()로 선언해야 한다. 그렇지 않으면 제대로 할당되지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE5] 언리얼 Enhanced Input]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240613UE5</link>
            <guid>https://velog.io/@kuronuma_daisy/20240613UE5</guid>
            <pubDate>Mon, 10 Jun 2024 03:28:45 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 세팅에 보면 기본 입력이 EnhancedInput로 설정돼 있다. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/1d863427-70cc-405c-9fa3-847c7ef5eca2/image.png" alt=""></p>
<p>EnhancedInput(=향상된 입력)을 사용하기 입력 액션, 입력 매핑 컨텍스트를 만든다.<br><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/82c2cb26-6190-45e8-a2b4-8fdc3038193c/image.png" alt=""></p>
<p>입력 액션에서 액션(행동)자체를 정의한다. IA_JUMP의 트리거에 <code>다운</code> 지정해둔 모습. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/9dacf5ab-d6e3-4058-befd-b722e0b54300/image.png" alt=""></p>
<p>입력 컨텍스트에서는 정확히 어떤 키를 다운했을 때 실행할 지 매핑해주면 된다. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/1bfa4cd8-6c2f-4bba-ad0e-92a2f31647cc/image.png" alt=""></p>
<p>그런 액션들이 지정된 컨텍스트를 사용한다는 내용을 알려줘야 한다. 플레이어 컨트롤러에 컨텍스트 매핑 추가. </p>
<ul>
<li>C++로 하는 법<pre><code class="language-cpp">UCLASS()
class GIMAT_API ASideScrollPlayerController : public APlayerController
{
  GENERATED_BODY()
</code></pre>
</li>
</ul>
<p>public:
    void SetupInputComponent() override;</p>
<pre><code>UPROPERTY(EditAnywhere, Category = &quot;Input&quot;)
UInputMappingContext* InputMapping;</code></pre><p>};</p>
<pre><code>```cpp
void ASideScrollPlayerController::SetupInputComponent()
{
    Super::SetupInputComponent();

    UEnhancedInputLocalPlayerSubsystem* InputSystem = ULocalPlayer::GetSubsystem&lt;UEnhancedInputLocalPlayerSubsystem&gt;(GetLocalPlayer());

    // protected는 자신의 input 컴포넌트 자체를 가지고 있다.
    UEnhancedInputComponent* EnhancedInputComponent = Cast&lt;UEnhancedInputComponent&gt;(InputComponent);

    // 모든 컨텍스트를 다 날리는 기능.
    InputSystem-&gt;ClearAllMappings();
    InputSystem-&gt;AddMappingContext(InputMapping, 0);
}</code></pre><ul>
<li>블루프린트로 하는 법 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/e9d1b845-3b0e-4849-9d2a-b58dd5c17ff2/image.png" alt=""></li>
</ul>
<p>어떤 액션에 실제로 캐릭터가 뭐할 건지는 주로 컨트롤러나 캐릭터에서 정해줌. 이벤트 노드 옵션은 다 읽어보면 자세히 나옴. </p>
<ul>
<li>Triggered == 눌리면 계속 실행</li>
<li>Start == 눌렸을 때만 한 번 실행
등등. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/e9f453d3-a1f6-445b-bb7f-62de6ac19684/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE5] 언리얼 240531, 240603, 240604]]></title>
            <link>https://velog.io/@kuronuma_daisy/053106030604UE5</link>
            <guid>https://velog.io/@kuronuma_daisy/053106030604UE5</guid>
            <pubDate>Tue, 04 Jun 2024 08:43:32 GMT</pubDate>
            <description><![CDATA[<h1 id="0531">0531</h1>
<p>무슨 로직이 있게 만들어야 하는 게 아닌이상 그냥 레벨에 끌어다넣는걸로 만들어도 됨(쌤은 이러라 하심)
위치나 크기는 아웃라이너에서 선택해서 직접 입력하거나, 레벨 표시창에서 기즈모를 땡겨서 조절할 수 있다.
액터스폰 로직적 처리  - 블루프린트에서 하는 방법이 있고 CPP에서 하는 방법이있음
게임모드의 BeginPlay는 Pawn의 BeginPlay 실행 전임
블루프린트로 만든 변수를 CPP에서 쓰려고 하지마세요 안알랴드립니다
블루프린트로 변수 선언하고 뭐하고 했으면 컴파일 누르는거 잊지말장 </p>
<h2 id="uclass-및-tsubclassof">UClass 및 TSubclassOf</h2>
<p>UClass 언리얼은 내 프로젝트에서 클래스들을 다 감시함.
언리얼이 빌드툴 및 헤더툴로 내 클래스를 실행하기 전에 다 조사 ⇒ UClass로 만들어서 파일로 저장해둠 ⇒ 로드해서 사용한다 
<code>TSubclassOf&lt;AActor&gt;</code> : UClass 중ㅇ에서 AActor를 상속받는 클래스들만 보이게 만든다. 
TArray&lt;<code>TSubclassOf&lt;AActor&gt;</code> &gt; : AActor를 상속받는 클래스들만 보이는 배열</p>
<p>UClass* 는 모든 클래스의 기본이되는애? 같은 것.</p>
<h3 id="cdo">CDO</h3>
<p>언리얼이 UClass 다 조사하는 작업 자체를 CDO라고 함.</p>
<p>왜조사?
언리얼 GC(가비지콜렉터), 생성방식 등등에 대해 알아야 함.</p>
<p>언제조사? 어떻게 조사?
에디터 켤 때 로딩 75%쯤에 갑자기 내가 만든 UObject 생성자 호출됨. 엔진이 실행도 안 됐는데 생성자가 왜 호출될까? ⇒ 이게 CDO 조사중인거임. 언리얼이 이 클래스를 생성하면서 정확한 크기를 조사하고 있는 것임. </p>
<p>클래스 내에서 동적할당을 많이 하게되면 메모리가 멀리 떨어지게되는 경우가 많음. 같은 클래스끼리는  메모리가 붙어있어야 속력이 효율적이다. 멀리 떨어져있으면 캐시적중률이 떨어짐. 언리얼은 CDO를 하면서 전체 클래스에 필요한 크기를 알아냄.</p>
<p>조사한걸 UCLASS라는거에 저장해둠. 나중에 클래스를 Spawn할 때 메모리가 붙어있을 수 있게 함.</p>
<p>그래서 절대 직접 new하지말고… 엔진에서 제공하는 생성 함수 사용해서 new를 해야함. 엔진 스스로 관리하는 구조를 만들어야 함. </p>
<p>가비지컬렉터(메모리관리자)는 언리얼이 미리 만들어둔 거대한 메모리 덩어리. 언리얼이 그 메모리 덩어리를 최적화하고 정리해서 관리하려고 한다. 가비지 컬렉터는 쓸모없는 메모리를 정리하기도 함.</p>
<p>vector 500만 만들어놓고 클래스 메모리 붙어있을 수 있게 해주는 거임. 그래서 메모리 지울때 그냥 그 vector 한 번 클리어하면 끝. 정확히 이런식이라는 건 아니고 원리가 이렇다는거임. 가비지 컬렉터의 메모리들은 모두 다 레퍼런스 카운트를 가지고 있다. 이때 이 레퍼런스 카운트 관리 방식을 제대로 적용받으려면 UPROPERTY()를 붙여주면 좋다. (가비지컬렉터는 쓸모없는 메모리를 지워버리기도 하기 때문에 내가 잘 쓰고 있는 메모리도 그냥 지워버릴때도 있음.)</p>
<p>그래서 CDO가 있는 거고, 언리얼에서는 UCLASS로 클래스 정보를 갖고 있는거임. 이런 시스템을 갖췄기 때문에 UCLASS 써야 한다는 거임.  </p>
<h2 id="text">TEXT</h2>
<p>언리얼에서는 문자를 표현할 때 <code>TEXT(&quot;&quot;)</code> 로 함.</p>
<ul>
<li>TEXT 붙여야 하는 이유</li>
</ul>
<ol>
<li>필요하면 해시화 ⇒ 8바이트 정수로 바꿔버린다. 문자열 비교가 빨라짐</li>
<li>수집 ⇒ 언리얼에서 수집을 한다. (영문판으로 내야할 때 등등 유용하다)</li>
<li>인코딩 ⇒ 빌드를 하면 언리얼이 문자처리 인코딩을 다 잘 통일해준다. </li>
</ol>
<h2 id="gameinstance">GameInstance</h2>
<p>언리얼에서는 우리 다렉엔진때처럼 레벨이 다 로드되어있는 게 아니고 그때그때 로드되는거임. 항상 존재하는 무언가가 필요하면 어떻게해야하는가?</p>
<p>static은 언리얼 가비지컬렉터나 메모리 관리 방식을 생각해봤을 때 좋지 않다. 그 메모리는 언리얼의 관리 바깥의 존재가 된다. </p>
<p>레벨이랑 상관없이 항상 존재하는 클래스를 제공함. 시작할 때부터 게임이 끝날 때까지 존재하는 애. </p>
<p>언리얼은 우리에게 GameInstance를 제공한다. </p>
<p>얘는 BeginPlay()가 없음. 레벨이 생성되고 시작하는 것과 상관없이 존재하기 때문에 BeginPlay가 의미가 없음. </p>
<p>중요한 건 얘를 GameInstance로 해줘 라는 걸 지정을 해줘야한다. 세팅 &gt; 맵&amp;모드 에 게임인스턴스 지정해주는 곳이 있음 </p>
<p>레벨에서 GetWorld()→GetGameInstance() 또는 GetWorld()→GetGameInstanceChecked() 할 수 있음. 여기서는 로직을 짜는 건 좋지 않고, 모두가 알아야 하는 데이터, 옵션 같은 것들을 위해 쓰는 거임. </p>
<p>근데 UGameInstance형으로 반환되기때문에 GIMATGameInstance(직접만든애)로 형변환해줘야함.</p>
<p><code>UGIMATGameInstance* Ptr = Cast&lt;UGIMATGameInstance&gt;(GetWorld()→GetGameInstanceChecked();</code> </p>
<p>언리얼에서 모든 기능들을 
플러그인 에디터 상태에서 기능 추가
모듈은 C++에서 추가 (build.cs)
플러그인은 메뉴에서 체크만 해주면 바로 적용되거나 엔진 껐다 켜면 간단히 적용됨</p>
<hr>
<h1 id="0603">0603</h1>
<h2 id="캐릭터-기본">캐릭터 기본</h2>
<p>폰을 상속받는 클래스만이 디폴트 폰 클래스가 될 수 있다. (월드 세팅에 디폴트 폰 클래스 - 레벨이 시작되면 디폴트 폰을 1개를 무조건 만듦. 주인공이됨.)</p>
<p>컨트롤러는 왜 따로 있는가. 컨트롤러는 캐릭터마다 따로짜주는게아님. 자세하게짜는게아니라 공통적인부분만 짜는거임 A키누르면 공격해 라고 짜고
궁수면 활을 쏘고 검사면 칼을 휘두르는거임 공격이라는 행위를 하라고만하고 상세하게 무슨 애니메이션인지, 어떤 행동인지까지 정확하게 지시는 X. 개념이 그렇다는 거임. </p>
<p>보통 캐릭터를 기반으로 게임을 만들 때가 많다. 
이유 ⇒ 대부분 언리얼에서 주인공이 3D메쉬이면서 애니메이션이 되는 게임을 만들고 싶어하기 때문.
2D 퍼즐게임같은거는 캐릭터 놓고 한곳만 바라보게만들면됨. </p>
<ul>
<li>부모 클래스 선택 &gt; Character(캐릭터) 상속받는애 만들기</li>
</ul>
<p>그럼 메시가 이미 스켈레탈 메시  에셋이라고 돼있음 </p>
<p>폰에서 애니메이션되는 스켈레탈메시붙여주고 캐릭터 무브먼트 붙여주면 캐릭터랑 똑같음. 
거기 붙는 약간의 설정들이 귀찮으니까 캐릭터 쓰는거임. </p>
<p>캐릭터에서 카메라를 캐릭터 눈에놓는것도함 </p>
<p>캐릭터는 캐릭터무브먼트에 중력이 설정되어있음. 다 세팅돼있음. 마찰력, 언덕올라갈때 느려지기 등등. 중력을 없애고 싶으면 캐릭터 무브먼트에서 수정하면 됨.</p>
<p>폰은 중력없었음. </p>
<p>중력기능 넣었던 곳에 나중에 공격기능들어가고 그러다 어쩔땐 중력끄는기능도들어가고 해야하게됨. 이건 XXX. </p>
<p>중력기능 하나 떼서 컴포넌트, 스테이트기능 컴포넌트, 애니메이션 컴포넌트 등등으로 기능을 다 컴포넌트로 만드는 게 좋다. 그래서 캐릭터에 컴포넌트가 주루룩달리게하는게맞음. </p>
<p>언리얼에서 내가 뭔가를 구현하고싶으면 다음을 따르세요.</p>
<pre><code>1. 내가 지금 뭘 구현하려고 하는지 명확히 한다. 
무조건 직관적으로 질문해야 한다.

1-1. 언리얼이 그 기능을 포함한 액터를 제공해주는지 확인.
1-2. 블루프린트에서 그런 기능을 하는 컴포넌트가 있는지 확인한다.

2-1. 그 기능의 옵션들에 대해 공부해야 한다. 블루프린트적으로 공부하고.
2-2. C++로도 그 기능을 제어할 수 있게 되는 게 좋다. </code></pre><p>캡슐 컴포넌트는 충돌범위를 나타낸다. 박스 컴포넌트나 다른것도 충돌계열이면 상관없음. 캐릭터는 보통을 캡슐을 씀. 아니면 box를 덧붙여써도되고 아무튼.</p>
<p>화살표 컴포넌트는 에디터 전용이다. 이건 빌드가 되면 삭제된다. 딱히 기능이 있는게 아니고, 캐릭터의 전방(바라보는 방향)이 어디 방향인지 알려줌.</p>
<p>디폴트 폰에 자동으로 붙는 카메라의 위치도 조작할 수 있다. 
카메라 컴포넌트 붙여서. </p>
<p>플레이어가 벽에 붙을 때 카메라가 벽을 뚫고가면 벽이 보임. 카메라가 벽을 뚫지는 못하게 하려면.
SpringArm 기능이 있음. 스프링암에 카메라를 끌어다 놔야함. 
== 카메라 컴포넌트를 스프링암의 자식으로 만든다. 
⇒ 그러고나서 위치를 다시초기화</p>
<p>스프링암의 역할은 셀카봉과 비슷. 
웬만하면 넣어주는 게 좋음. 카메라에 타깃 암 길이를 나중에 0 으로 할 수 있으니까 일단 붙이는 게 좋음. 시선만 회전하기 혹은 카메라와 벽의 충돌체크 등의 옵션을 기본으로 제공하기 때문에 웬만하면 카메라의 부모로 스프링암을 넣어주는 게 좋음.</p>
<p>카메라 디테일에서 직교투영, 원근투영 바꿀 수 있음. </p>
<h3 id="실습---쌤꺼-받아서-캐릭터-중력-꺼보기">실습 - 쌤꺼 받아서 캐릭터 중력 꺼보기</h3>
<p>캐릭터 무브먼트에서 중력 스케일 0.0으로 넣어줌. </p>
<h3 id="과제">과제</h3>
<p>CPP로 캐릭터 상속받는 클래스 만들었음. 수업에서 만든 블루프린트 캐릭터의 에디터 창을 연다.</p>
<p>클래스 세팅을 열고 디테일 창으로 가서 내가 만든 C++ 클래스를 부모로 지정해 줄 수 있다. </p>
<p>직접 만든 C++ 클래스로 디폴트 폰이랑 똑같이 움직일 수 있게 해보기.</p>
<p>?</p>
<h2 id="언리얼-리소스-관리선생님">언리얼 리소스 관리(선생님)</h2>
<p>언리얼에서는 툴을 써라. 언리얼을 이용해서 쉽게 툴을 만들 수 있음. </p>
<p>TMap을 쓸때는 웬만하면 UPROPERTY 쓰자. TMap이 메모리가 그냥 이유없이 날아갈 때가 많다. </p>
<ol>
<li><p>일단 Object를 상속받는 아무 클래스를 만든다. 이름 GlobalActorRow 라고 일단 함. (이름 중요하지 X) 그냥 이해쉽게 MonsterDataRow로 보여주심. 내가 뭔가를 데이터적으로 관리하고 싶다. 할 때 만들면 됨. 아무 클래스나 만든다. 다 바꿀거기 때문에 의미를 둘 필요 없음.  (Global 폴더에 데이터테이블 폴더에 넣었음. 그곳에 이런류의 클래스 모아둘거임.) </p>
</li>
<li><p>struct로 바꿔주고… USTRUCT(BlueprintType) 블루프린트로 만든다는것
언리얼에서 struct는 무조건 이름앞에 F붙임. FTableRowBase 상속받아야함.</p>
<p> #include “Engine\DataTable.h” 도 하고.
 ⇒ 한 줄 요약 : FTableRowBase 상속받는 struct 하나만 만들면 되는 거임. </p>
<p> UPROPERTY(EditAnywhere, BluprintReadWrite, Catefoty = “Resourses”)
 TSubClassOf<AActor> Actor;</p>
</li>
<li><p>이 몬스터를 스폰하려면 UClass나 SubClassOf가 필요할 것이기 때문에
내가 원하는 몬스터라는 것을 표현하는 데이터로 구성된 구조체. 
UPROPERTY(<del>)
int HP;
UPROPERTY(</del>)
float Speed;</p>
</li>
</ol>
<p>언리얼에서 제공하는 콘솔 로그 기능</p>
<p><code>UE_LOG(LogTemp, Fatal, TEXT(”어쩌구”))</code> 
로그를 띄울 때 중요한 것 2가지 : LogTemp부분 (로그 분류), Fatal 부분(로그 종류).
로그 종류 - Fatal, Error, Log, Warning </p>
<p><code>UE_LOG(LogTemp, Fatal, TEXT(”%S(%u)”), **FUNCTION**, __**LINE__**);</code> : <strong>FUNCTION</strong> 함수이름으로 변경, LIne 해당 라인 출력 </p>
<p>이제부터 로그뿌릴때 LogTemp대신 GIMATLog 사용한다고함 (헤더 GIMAT.h)</p>
<hr>
<h1 id="0604">0604</h1>
<p>횡스크롤 게임. 러닝 게임. (ex:쿠키런)</p>
<p>게임에서 가장 현실적인 결정은 일단 뷰. ( == 시점, 시야)</p>
<p>언리얼은 CDO때문에 중간에 컴폰넌트를 변경할 수 없다. 다렉때 기형적으로 따라하려고 어거지로 생성자에서만 렌더러 만들 수 있게 했었음. </p>
<p>C++로 만든 컴포넌트는 삭제할 수 없음. </p>
<ul>
<li>언리얼에게 이 스프링암이 이 클래스의 기본사항이라는 것을 인식하게 해줘야 한다.<ul>
<li>멤버 변수여야 함</li>
<li>프로퍼티 붙어있어야 함</li>
</ul>
</li>
</ul>
<p>언리얼에서 충돌 컴포넌트가 부모임. </p>
<p>다렉때처럼 언리얼에서도 USceneComponent를 상속받아야 위치크기회전을 가짐. 
자식 스케일이 3, 부모 스케일이 2이면 월드 스케일은 6 </p>
<p>언리얼 회전에서 벡터사용하지않고
Rotator, Quat 사용. 상호보완적 관계.
우리가 알고 있는 Euler오일러각에서 FQuat, FRotator</p>
<h4 id="빛-관련-공식">빛 관련 공식</h4>
<p>람베르트 조명공식 사용. N내적L</p>
<ul>
<li>면의 반사방향 normal N</li>
<li>빛의 방향 -L  (횡스크롤 어쩌구 ppt에있음)</li>
</ul>
<ul>
<li><p>디렉셔널 라이트 : L이 태양. 어디에나 존재하고 같은 값 같은 방향으로 비춘다. 빛의 시작점이라는 게 존재하지 X. </p>
</li>
<li><p>포인트 라이트 : L은 점에서부터 시작한다. 면의 한 점의 위치 - 빛의 위치 가 빛의 방향. 면마다 빛의 방향이 달라짐</p>
</li>
</ul>
<p>배드 사이즈 : 이 캐릭터가 생성될 때 어떤 물체와 겹쳐서 생성이 안 될 가능성도 있다는 이야기. </p>
<p>가능한 위치 처리해보고 적당한 위치 못찾으면 스폰하지 않음. 스폰 콜리전 처리 메서드를 콜리전과 관계없이 스폰하는 옵션 해두는 게 좋을 수 있음. </p>
<p><code>카메라 콜리전 - 콜리전 테스트 실행</code> 을 키면 스프링암이 땡겨지는 그거 켜는거임. </p>
<p>언리얼에서 크기(스케일) 기준은 자기 리소스 크기 * 설정한 스케일 인거임. 100<em>100</em>100 짜리 큐브 스케일 10으로하면 1000<em>1000</em>1000 인거임.</p>
<p>리플리케이트 : 네트워크 동기화 </p>
<p>게임모드는 서버만 만듦. 클라한테는 게임모드안생김. 그래서 스폰액터는 웬만하면 게임모드에만 넣으라고 하심. 몬스터 게임모드에서 스폰하면 서버만 만들어서 동기화시켜주는거임. 리플리케이트 옵션만 켜주면 동기화 됨. </p>
<p>수업 마지막쯤 상태 : 디폴트 폰에 ScrollPlayer 넣어놓고 얘한테 카메라 달아둠. 그리고 여기서 캐릭터 하나 스폰. 그 캐릭터가 노란 사람. 점프가안댐.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE5] 언리얼 240530]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240530UE5</link>
            <guid>https://velog.io/@kuronuma_daisy/20240530UE5</guid>
            <pubDate>Fri, 31 May 2024 02:56:32 GMT</pubDate>
            <description><![CDATA[<h3 id="uclass내용">UCLASS(내용)</h3>
<p>내 클래스를 좀 특별하게 처리해달라.</p>
<p>내 클래스가 에디터에서 보이지 않았으면 좋겠는 등등. 나중에 협업할 때나 필요할 것임 </p>
<p>클래스 위에 붙여줘야함. 이걸 안넣으면 언리얼 에디터상에서는 사용할 수 없다. </p>
<h3 id="ufunction">UFUNCTION</h3>
<p>내 함수를 에디터에서 좀 특별하게 처리해달라. 대표적으로 에디터에서 노드형식으로 사용하게 해달라.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/97fc877d-f28d-4b4e-94cf-ce7b65e84440/image.png" alt=""></p>
<p>min, max값 설정할 수 있는데 블루프린트에서 설정한 민맥스가 코드상에 적용안될거임 </p>
<p>그냥 그렇게 중요한 값이면 코드상에 치는게 나음.  근데 그렇다고 exec함수에 직접 치지말라. </p>
<h3 id="uproperty내용">UPROPERTY(내용)</h3>
<p>변수에 붙이는 디파인
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/538c895f-e61f-49e3-b398-d9843e06400c/image.png" alt=""></p>
<p>하나의 프로퍼티 옵션들은 <code>,</code> 로 구분되고 </p>
<p>변수에서는 조금 더 중요하게 기억해야할 녀석들이 존재한다.</p>
<p>메모리와 관련이 있기 때문에 중요한 변수들은 꼭 UPROPERTY 붙여주는것이 좋다.</p>
<p>Visible 뭐시기들</p>
<p>어디에서 보일거냐를 정의할 수 있다.</p>
<p>이 클래스를 사용할 때 쓸 수 있냐 없냐와 에디터에서 보일거냐 말거냐를 정의할 수 있음. </p>
<ul>
<li>프로퍼티 및 프로퍼티 창이 뭔가?<ul>
<li>어떠한 블루프린트를 열게되면 블루프린트의 세부사항에 있는 한 항목들을 프로퍼티라고 한다.</li>
</ul>
</li>
</ul>
<p><code>VisibleAnywhere</code>  : 프로퍼티 창에 보임. 보이기만 해라</p>
<p><code>BlueprintReadOnly</code> : Get함수만 가능. 수정 불가</p>
<p><code>BlueprintReadWrite</code> : Get, Set 둘다 가능
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/ef225d32-ea75-4db9-8dc9-5eaf1329841c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/d328e806-1bdd-4349-a063-39a95db1f788/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/0513723f-d148-4605-804c-ce22546f9c96/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/861e2f7e-c1ad-4bdc-b2e0-1ca62a8ce611/image.png" alt=""></p>
<p>언리얼에서 알아서 만들어줌.  ReadOnly, ReadWrite 둘 다 Get함수가 있고 ReadWrite로 설정한 변수만 Set함수가 있음. </p>
<ul>
<li><p>실습 - 내가 친 CPP 코드가 에디터에 어떻게 영향주는지 보기</p>
<p>  중단점 걸어보고 누가 호출했는지 보기 </p>
<p>  블루프린트는 CPP에 영향줄수는없음. </p>
<p>  내가 CPP 고친걸 에디터가 바로 적용하려고하는게 라이브코딩. dll을 다시 다 빌드함.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/27d81a81-1a42-4199-872d-707ab293d6bb/image.png" alt=""></p>
</li>
</ul>
<p>xxxMinimal.h 헤더 내부를 가보면 필수 헤더들 모아놓은 헤더임. 약간 더 기능이 많은 EngineMinimal.h을 사용할 수도 있음.</p>
<p>~~.generated.h 헤더는 위 헤더들을 분석해서 다시 한 번 헤더툴이 정리해주는 헤더. 위쪽 헤더들을 참고해서 또 새로운 헤더에 필요한 코드를 만들어낸 헤더이기 때문에 맨 아래에 놔야함. 어기면 안 됨.</p>
<hr>
<p>언리얼은 이미 모든 프레임워크의 단계를 완성해놨다. </p>
<p>ex) GameMode는 어느 시점에 만들어진다가 이미 정해져 있음. 내가 그걸 바꿀 수 없음.</p>
<p>우리는 그 기존 클래스들을 상속받는 나만의 클래스를 만들어서 언리얼이 하는 일 + 내가 시키는 일을 끼워넣기 식으로 처리하는 것이다.</p>
<p>Super::BeginPlay() 처럼 언리얼이 기본적으로 뭔가 하는 단계를 빼면 문제가 터짐. </p>
<p>ModuleDirectory</p>
<p>그냥 액터는 주인공아님. 입력못바듬. Pawn을 받아야 키보드 입력 받을 수 있다고 정했음. </p>
<p>AddMovementInput MovementComponent에 움직임 예약하는거. 중력, 모양 등등 다 감안한 움직임을 계산하고 움직여줌. </p>
<p>GEngine→AddOnScreenDebugMessage : 화면에 글자 띄워줌  </p>
<p>MoveForward 입력할때만 들어오는게아니고 상시 들어옴??</p>
<p>언리얼은 초당 60프레임 제한걸려있음 그래서 델타타임을 곱해줘야 한다. </p>
<p>레벨에 존재해야한다 ⇒ AActor 생성</p>
<p>위치를 가져야 한다 ⇒ 내부에 SceneComponent를 상속받은 컴포넌트가 하나 들어가 있어야 함.</p>
<p>Static Mesh Renderer ⇒ 애니메이션 없는 매쉬 렌더링하는 렌더러</p>
<p>SkeletalMesh Renderer ⇒ 애니메이션 있는 매쉬를 렌더링하는 렌더러</p>
<p>이미지를 에디터에 끌어다 놓으면 그게 load끝난거임. </p>
<p>텍스처를 사용하기위해 Sprite 만들어야 함. </p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/4ef4ef8b-4482-438b-a54c-1d2efd42edfe/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE5] 언리얼 핵심 오브젝트 몇가지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240529UE5</link>
            <guid>https://velog.io/@kuronuma_daisy/20240529UE5</guid>
            <pubDate>Wed, 29 May 2024 14:06:59 GMT</pubDate>
            <description><![CDATA[<p>블루프린트 사용한다? ⇒ 에디터에서 모든 걸 해결했다. VS를 사용할 필요가 없음. 근데 반복문부터 노드로 만들면 짜증나고 이해하기 힘들다고 함.</p>
<h2 id="핵심-오브젝트클래스">핵심 오브젝트(클래스)</h2>
<h3 id="ulevel">ULevel</h3>
<p>레벨 오픈하면 생성,</p>
<p>레벨 전환하면 파괴</p>
<h3 id="agamemode">AGameMode</h3>
<p>생성 레벨과 함께 생성</p>
<p>레벨과 함께 파괴</p>
<p>생명 주기가 ULevel과 AGameMode는 비슷하다. </p>
<h3 id="apawn">APawn</h3>
<p>AActor를 상속받는 APawn</p>
<p>지형과 상호작용 등등을 지원. 기본 충돌기능, 이동 및 길찾기 등등에 필요한 기능을 내부에 다 보유하고 있다.(이거 안쓸거라고하심) </p>
<p>언리얼에서 플레이어가 이입할 수 있는 주인공으로서 만드는 애. 여러 개 만들 수 있음. 레벨 화면에 끌어다 놓기만 해도 만들어짐. </p>
<p>월드세팅에 <code>디폴트 폰 클래스</code>는 언리얼이 얘가 주인공이겠네- 하고 딱 1개 대신 만들어줌. 그리고 카메라가 걔를 따라다니게 해줌.</p>
<p>GameMode의 BeginPlay가 먼저 실행되고 Pawn의 BeginPlay가 실행됨</p>
<p>lib ⇒ 내 exe파일과 lib의 코드가 완전히 1개가 돼서 exe파일이 나온다.</p>
<p>dll ⇒ os가 dll코드를 가지고 있고 내가 실행될 때 빌려서 사용하는 개념. 중간에 사용하다가 언로드를 할 수가 있다. 그리고 dll로 만든다고 lib로 안나오는게 아님.  dll로 바꾸면 pragma comments 로 읽어오는게 안댐.</p>
<p>dll에 존재하는 함수들에게 선언은 했지만 아래에 공개하고 싶지 않은 함수들이 있을 수 있음. 공개하고 싶은 애들은 클래스명 앞에 <code>__declspec(dllimport)</code> 붙여서 머시기 함…. 그대신 공개할 모든 함수에 붙여야 함.  </p>
<p>그래서 언리얼엔진에 defaultPawn 코드 보면 define으로 줄여서 dllimport들이 붙어있음. (엔진은 dll이니까)</p>
<p>→ 그래서 defaultPawn 베껴올 때 나는 dllimport 안붙여도됨. 내가만든함수 나만쓰니까. 언리얼 엔진은 쓸 가능성들이 있으니까 붙이는거고 나는 붙일필요가 없음. </p>
<p>언리얼에서 불완전한 형식을 보게되면 그냥 구글에 검색하면 바로 공식 문서 나옴. include문까지 다 알려줌. </p>
<p>나중에 CDO라는것도 알려주신다는데 그게 몰까,,,</p>
<h3 id="실습---defaultpawn-베껴서-mypawn-만들어보기">실습 - defaultPawn 베껴서 MyPawn 만들어보기</h3>
<ul>
<li><p>사진 첨부
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/1a32f037-ce8e-4783-a679-b158f8eddb31/image.png" alt=""> </p>
</li>
<li><p>UFUNCTION
  <img src="https://velog.velcdn.com/images/kuronuma_daisy/post/8d3b036a-22f2-4b31-8424-a91a594068cc/image.png" alt=""></p>
<ul>
<li><p>블루프린트에서도 쓰고싶은 함수들을 위해 언리얼이 함수들을 알아야함. 조사를해야함. UFUNCTION이 있으면 그아래에 사용자가 중요하다고 생각하는 함수가 있다고 하는 규칙같은 거임. UFUNCTION 안 해주면 언리얼이 검사를 안 함. BlueprintCallable 넣으면 블루프린트에서 호출하는 execMoveForward 같은 함수 만들어짐.</p>
</li>
<li><p>UFUNCTION은 언리얼에서의 함수의 사용방법을 정의내리는 언리얼 문법이라고 볼 수 있다. 그래서 UFUNCTION을 붙이면 언리얼이 특별히 관리하는 함수가 된다고 보면 된다. </p>
</li>
<li><p>UFUNCTION(내용) ⇒ 내용을 넣으면 이 함수를 내용의 옵션으로 사용하고 싶다는 것.  </p>
</li>
</ul>
</li>
</ul>
<h3 id="실습---mymove함수-만들어서-블루프린트-노드에-뜨게-하기">실습 - MyMove()함수 만들어서 블루프린트 노드에 뜨게 하기</h3>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/93b5ff4c-39c1-4938-ad14-db14e173f47e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/5ad6e3dd-797f-4c1f-ab16-ac55ef7b915b/image.png" alt=""></p>
<h3 id="실습---x-y-z-축-확인">실습 - X, Y, Z 축 확인</h3>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/38d9e9a6-ccae-40e2-9c07-35f07678b84a/image.png" alt="">
MyMove로 알아본거긴한데</p>
<p>Forward로 가는게 X축 좌우가 Y축 위아래가 Z축</p>
<h3 id="integration-설치">Integration 설치</h3>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/db99dae1-d7fe-4374-93f1-a6fd9322f25b/image.png" alt=""></p>
<p>VS 인테그레이션 툴인데 거의 필수로 설치하라고 하심. </p>
<h2 id="금기사항">금기사항?</h2>
<p>자기가 직접 헤더 만들어서 복붙하거나 배우지않은 다른 경로로 C++파일 만들기 → 2주간 하지마세요 </p>
<p><code>#include “MyPawn.generated.h”</code>  언리얼에서 자동으로 만들어줌. 위치를 맘대로 위로 올리면 안됨.</p>
<p><code>UCLASS()</code> , <code>프로젝트명_API</code> , <code>GENERATED_BODY()</code> : 셋다 바꾸지 말기. 헤더툴때문임. 언리얼에서 클래스로 인정(?)하기 위해 필요한것들 </p>
<h3 id="헤더툴">헤더툴</h3>
<p>언리얼 헤더툴이란 코드치는 프로그램. 템플릿과 비슷하다?</p>
<p>지금 컨텐츠 프로젝트의 헤더를 싹다 읽음. </p>
<p>UCLASS()가 있다면 그부분을 바꿔버린다. </p>
<h2 id="레벨-바꾸는-법">레벨 바꾸는 법</h2>
<p><code>편집 &gt; 프로젝트 세팅</code> : 프로젝트의 모든 세부사항에 대해서 설정할 수 있음. </p>
<ul>
<li><code>맵&amp;모드</code> : 에디터 시작맵 (에디터 처음 켜질 때 맵), 게임 기본 맵(빌드해서 만들었을 때의 기본 맵)</li>
</ul>
<p>이벤트그래프 노드에서 뭔가 수정했다면 꼭 컴파일 누르고 저장하고 실행해야 적용됨. </p>
<p>그리고 디버그 중지로 끄지말고 X눌러서 끄는 습관 들이기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UE5] 언리얼 첫수업]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240528UE5</link>
            <guid>https://velog.io/@kuronuma_daisy/20240528UE5</guid>
            <pubDate>Tue, 28 May 2024 09:23:56 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 생성할 때 옵션 뭘 선택하든 나중에 다 다시 설정할 수 있어서 의미없음.</p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/71bd32ab-90f6-4387-9af8-6716e3886cf0/image.png" alt=""></p>
<p>언리얼에서 서버역할 제공. 오브젝트들의 동기화 같은거다지원해줌. 코옵게임정도는 만들수있음. 이거로 MMORPG같은건 안됨.</p>
<p>언리얼에서도 서버면 어캐처리하고 클라면 어캐처리하는지 다르게하는건 필요함.</p>
<p>게임을 만들면서 지속적으로 내가 만든 기능이 네트워크에서도 연계되는지를 확인해야 한다.</p>
<p>sln파일 지우고
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/136e9931-a0d1-40e7-b4eb-1f0c42b928d7/image.png" alt=""></p>
<p>uproject 우클릭, 추가옵션에 보면 Generate Visual Studio project files 가 있음.  언리얼에서는 sln파일이 중요하지 않다. 이게 닷넷을 통해 만들어짐. 닷넷은 C#. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/18dcb566-7c77-41cc-b80e-b369553bdff9/image.png" alt="">
이런거 가능 </p>
<p>Open으로 열면 DebugGame Editor로,</p>
<p>Launch Game으로 열면 DebugGame Client로 여는거랑 같음</p>
<h3 id="언리얼-프로젝트-github에-올리기">언리얼 프로젝트 github에 올리기</h3>
<p>언리얼은 sln파일 올릴필요없음. uproject파일 있으면 되기 때문.</p>
<p>우리는 언리얼 이그노어 설정으로 올리면 됨.  안올려야 하는 파일이 많음.</p>
<h3 id="언리얼엔진-프로그래밍-기초-">언리얼엔진 프로그래밍 기초 ?</h3>
<p>블루프린트가 좋냐 C++로 하는 게 좋냐 ⇒ 이렇게 해도 되고 저렇게 해도 되고,,, 둘다 잘하고 제대로 이해하고 있으면 됨 스타일차이. 선생님의 스타일이 있긴 함. 블루프린트는 기본적으로 느리다. 대부분의 회사는 블루프린트로 만들고 최적화를 위해 블루프린트로 한 작업을 C++로 변경하는 경우가 많다. 그냥 시키는대로하면됨. </p>
<p>기본적으로 선생님 실행 방법은 비쥬얼스튜디오 프로젝트를 열고 빌드 설정을 DebugGame Editor로 변경,</p>
<p>언리얼은 Main을 철저하게 숨기기때문에</p>
<p>(UE5는 우리 여태 한걸로치면 엔진,  Games필터아래에 있는애가 Contents인거임)</p>
<ul>
<li>오전 실습 : 빈프로젝트로 만들고 vs열고 F5눌러서 실행하면 에디터가 나오는지 실습해보기, 깃허브에 올리기</li>
</ul>
<h3 id="엔진에서-주시해야할-구조">엔진에서 주시해야할 구조</h3>
<ul>
<li><p>오브젝트 구조 (게임내에 존재하는 녀석들을 어떻게 표현하는가?)</p>
<ul>
<li>이니셜라이즈 구조 (사용자가 어떻게 시작에 관여할 수 있는가?) EngineCore</li>
<li>업데이트구조(프레임이 어떻게 돌아가는가?<ul>
<li>물리구조</li>
</ul>
</li>
<li>충돌(상호작용)구조</li>
<li>랜더링구조 (랜더링이 어떻게 되는가?)</li>
<li>릴리즈구조 (삭제구조)</li>
</ul>
</li>
<li><p>데이터구조 (언리얼에서만 사용되는 파일입출력 방식)</p>
<p>  내가 한 일을 파일로 다 저장한다.</p>
</li>
</ul>
<h3 id="레벨-만드는-방법">레벨 만드는 방법</h3>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/b01e6dce-0d0e-4744-bd84-e9e3c353709a/image.png" alt=""></p>
<p>컨텐츠 브라우저에서 우클릭 &gt; 레벨 로 바로 만들 수 있음.</p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/37ffe5a9-f7cf-4b16-b533-ee7a15aca42e/image.png" alt=""></p>
<p>파일 &gt; 새 레벨로도 가능. 언리얼에서 제공하는 기본 예제 레벨들 만들 수 있음.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/3bf42df8-79bc-4472-a1be-80e3061171f2/image.png" alt=""></p>
<p>선생님은 기본 조명이랑 발판 제공하는 Basic 레벨로 만듦. 그상태로 컨트롤+S누르면 이 레벨 저장해서 정식으로 파일로 만들겠다는 것. 나중에 다시 불러올 수 있게. </p>
<p>월드세팅 에서 게임 모드 세부사항 열 수 있음.</p>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/4fa34559-7629-4f80-80e3-01217d852eca/image.png" alt=""></p>
<p>게임 모드를 변경하면 내가 만든 게임모드를 이 레벨의 게임모드로 지정할 수 있다.</p>
<p>언리얼에서 말하는 레벨의 개념은</p>
<ol>
<li>레벨은 주인공이 있어야 하고(주인공을 필수 지정해줘야함) - 폰 클래스</li>
<li>UI 담당자가 있어야 한다. - HUD 클래스</li>
<li>그리고 입력담당자가 있어야 한다. - 플레이어 컨트롤러 클래스</li>
<li>그리고 클라이언트의 정보를 저장할 담당자가 있어야 한다. - 게임 스테이트 클래스</li>
</ol>
<p>언리얼이 지정한 담당자를 싹다 무시해도 된다. 하지만 이런 복잡한 구조를 만든 이유는 네트워크때문임. 서버 동기화때문에 이런 구조를 만들어놨다. 서버를 아예 배제하겠다면 언리얼이 만들어둔거 다 무시해도됨. 언리얼 리플리케이트 기능. </p>
<ul>
<li><p>게임 모드</p>
<p>  게임 전체의 룰을 정한다. </p>
<p>  네트워크로 플레이시 클라이언트는 게임모드를 만들지 않는다. 게임의 룰을 정하는건 서버만 해야함. </p>
<p>  게임모드에서는 어떤 코드를 치는게 좋을까? ⇒ 이 스테이지에서는 5초마다 몬스터를 만들어야 한다. 100마리 죽이면 넘어간다.</p>
</li>
<li><p>블루프린트, 네이티브 C++ 코드의 차이</p>
<p>  게임 모드 만들면서 차이 보기</p>
<p>  블루프린트에 대해 정의하자면 C++ 네이티브 코드를 상속받기로 정해진 가상 클래스의 데이터이다. 블루프린트를 만들어보면 에디터가 실행되는 도중에 막 바꿈. 애초에 클래스도 뭐도 아니기 때문임. 그냥 데이터의 집합. </p>
</li>
<li><p>블루프린트</p>
<p>  블루프린트 만들 때 상속시키고 싶은 클래스의 이름을 치면 그 이름을 가진 클래스만 볼 수 있다.</p>
<p>  언리얼도 GameMode를 제공해주고 그보다 상위 클래스인 GameModeBase도 있다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/e9ab24f5-2caa-4d5b-9a36-409d43cc8958/image.png" alt=""></p>
<p>GameMode ⇒ 네트워크 플레이지원기능 탑재<br>GameModeBase ⇒ 그 기능이 빠져있는 기본 클래스</p>
<ul>
<li><p>CPP로 게임모드 만들기</p>
<p>  툴 &gt; 새 C++ 클래스 만들기 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/d2c616ff-db12-426f-a39b-1c40577d539a/image.png" alt=""></p>
</li>
<li><p>언리얼 실행방식 및 디버깅 방식</p>
<p>  언리얼 켜는 법 중 VS열고 F5눌러서 켜는 방법은 우리가 원래 알고있던 C++ 프로그램 실행방식과 동일함. 중간에 뭔가 추가하면 껐다 키기 </p>
<p>  중단점 볼 수 있는 방법 (근데 샘이 보여주기 실패하심) </p>
<ol>
<li>uproject파일 더블클릭해서 실행 </li>
<li>VS 열기, 컨트롤+알트+P 로 언리얼 에디터랑 연결 </li>
<li>라이브코딩 </li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/8daf86f1-b4a6-4feb-9fe2-13ebe028f62d/image.png" alt=""></p>
<p>새로 만든 파일 안뜨면 라이브코딩 버튼 눌러서 컴파일 다시 하면 됨. </p>
<p>블루프린트로 gamemode를 만들어서 지정해주면 캐릭터나 등등을 바꿀 수 있고</p>
<p>내가 만든 C++ 클래스로는 다른 요소들을 변경할 수 없다. 이유? C++은 당연히 중간에 못바꿈. 블루프린트는 클래스가아니고 데이터 덩어리라서 가능한 거임.  코드를 수정하는 게 아님. 코드를 바꿨다고 착각하게 만드는 느낌? 완전히 새로운 함수를 만드는건안됨.</p>
<p>private으로 만든 변수도 블루프린트에서 넣어주는 값으로 값을 바꿔줄 수 있음. 그건 어떻게 했는지는 우리가 알 건 아님. </p>
<p>블루프린트도 f9걸어서 중단점 확인할 수 있음. Super를 꼭 해야함. Super안에서 블루프린트 실행하고있었음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX] 팀 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/DirectX</link>
            <guid>https://velog.io/@kuronuma_daisy/DirectX</guid>
            <pubDate>Fri, 24 May 2024 07:28:53 GMT</pubDate>
            <description><![CDATA[<h1 id="크레이지아케이드">크레이지아케이드</h1>
<p>0523 ~ 0524 
후와 오늘 시연까지 끝 </p>
<h4 id="시연-녹화-중-일부">시연 녹화 중 일부</h4>
<p>아이템도 다양하고 능력치도 모두 다르고 죽이거나 살리기, 바늘아이템도 다 잘 되는데.. 발표를 갑자기 하게 되서 소개를 다 못했던 게 너무 아쉽다. 시연할 때 팀원들이랑 미리 잘 보여줄 수 있도록 계획을 세웠으면 좋았을텐데!!! </p>
<ul>
<li><p>로비 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/94d09727-0c9d-42f2-83ad-e0bd4e32c29c/image.png" alt=""></p>
</li>
<li><p>인게임 (녹화한 사람이 &quot;요기요&quot; 임)
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/a871b4e6-8228-433f-96ec-2628394a26ea/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/333d3a2e-180b-40af-9c80-204d2f0ad982/image.png" alt=""></p>
<h2 id="개발-일지">개발 일지</h2>
<ul>
<li><p>맵팀에서 IsOtherPlayer 만들어주셨다! 이제 플레이어나 게임모드에서도 OtherPlayer벡터 받을 수 있음. </p>
</li>
<li><blockquote>
<p>플레이어 Trap상태에서 같은 팀이 닿으면 Rescue, 다른 팀이 닿으면 Die되도록 만듦!</p>
</blockquote>
</li>
<li><p>팀 구별해야해서 OtherPlayer가 팀타입을 알아야 해서 패킷에 팀타입 추가</p>
</li>
<li><p>플레이어패킷에 보내지고있는 IsDestroy 변수가 의미가 없었음. 의미 있도록 바꿈!</p>
</li>
<li><p>레벨 바뀔때 페이드효과 셰이더 추가 </p>
</li>
<li><p>시체에 죽는 판정 고쳐야함 -&gt; 고침</p>
</li>
<li><p>엔딩레벨 </p>
<ul>
<li>감사인사 띄우고 우리팀 이름 크레딧 띄우기 (5.f초정도)</li>
<li>그 후에 Fade이펙트 Long버전 On하고 이펙트끝나면 윈도우 자동 끄기</li>
</ul>
</li>
<li><p>인게임 UI를 OtherPlayer로 옮기기 오후에 하자</p>
</li>
<li><p>OtherPlayer InGame 프로필이미지, 닉네임 UI 완성</p>
</li>
<li><p>MainPlayer InGame 프로필이미지 UI 완성</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX] 팀 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240522DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240522DX</guid>
            <pubDate>Wed, 22 May 2024 12:16:11 GMT</pubDate>
            <description><![CDATA[<h1 id="크레이지아케이드">크레이지아케이드</h1>
<h2 id="개발일지">개발일지</h2>
<p>왼쪽 서버, 오른쪽 클라이언트
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/d49e4f9d-ebea-4501-9821-3bc36b367343/image.png" alt=""></p>
<ul>
<li><p>오늘 6시반 6명 동접 테스트 </p>
</li>
<li><p>서버 연결했을때 OtherPlayer들이 왼쪽만 보는 현상</p>
<ul>
<li>원인 : 패킷에 넣는 정보중에 CurFrame이 애니메이션에서의 순서 즉, 상대적 Frame번호였음. 우리가 원한건 전체 Sprite에서의 번호. </li>
<li>해결 : 그래서 아예 엔진에서 Frame[CurFrame]을 Get하는 함수 만들고 FSpriteInfo에 SpriteNum 변수 추가해서 패킷에 넣는 값 바꿈 -&gt; 해결 </li>
</ul>
</li>
<li><p>엔진쪽에서 물풍선 Kick하는거 같이 입코딩만 함.ㅋㅋ </p>
</li>
<li><p>Shoes아이템 먹으면 Kick되게 함. 클라에서 혼자하면 잘 되긴하는데 서버랑 동기화할 때 문제생겨서 Shoes아이템을 잠시 빼기로 함..</p>
</li>
<li><p>Move 값 계산하는 MoveUpdate함수에서 체크포인트 3개가 다 Zero가 되는 버그가 가끔 발생. 초기값을 FVector::Zero가 아닌 GetActorLocation()으로 변경해서 해결.</p>
</li>
<li><p>이펙트 사운드 조금 넣음</p>
</li>
<li><p>플레이어 위에 네임태그 띄우는거 하려다가 서버에 패킷 안보내면 각자 자기 캐릭터에만 보이는 특성 활용해서 솔로플레이어 표시해주는 화살표 띄움!</p>
</li>
<li><p>Tab키 누르면 팀 바꾸는 치트키 만듦</p>
<ul>
<li>=&gt; 두 번 이상 팀 바꿨을 때 즉, 해봤던 팀으로 다시 바꾸면 IsEnd가 바로 켜짐. SpriteRenderer에서 Reset()함수에 <code>IsEnd = false;</code> 추가해주면 정상작동하긴 하는데 치트키일뿐이니까 당장 필요한 것도 아니고.. 엔진팀 바빠보여서 내일 물어봐야징...</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX] 팀 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/DirectX-%ED%8C%80-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EA%B0%9C%EB%B0%9C-%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@kuronuma_daisy/DirectX-%ED%8C%80-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EA%B0%9C%EB%B0%9C-%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 21 May 2024 09:55:30 GMT</pubDate>
            <description><![CDATA[<h1 id="크레이지아케이드">크레이지아케이드</h1>
<p>참고로 캐릭터팀이 하는 거만 쓰는 거임 </p>
<h2 id="고민">고민</h2>
<ul>
<li>Trap 상태에서 한 번 빠져나오면 1초? 무적상태여야하지않나? (근데 지금 물줄기 터지는 시간이 좀 길어서 약간 쩔수임)</li>
<li>탈것에 탄 상태 애니메이션 추가해야 함.</li>
<li>탈것에 탄 상태에서 신발먹어도 안늘어나야함?.<ul>
<li>먹어지는지? ㅇㅇ</li>
<li>빨라지는지? ㄴㄴ 내렸을때의 플레이어 능력치만 늘어남</li>
<li>내렸을때라도 적용되는지? </li>
</ul>
</li>
<li>Shoes 아이템 먹고 물풍선 밀면 밀리는 것  </li>
<li>플레이어에 닿았는지 (또는 같은팀인지 다른팀인지까지) </li>
</ul>
<h2 id="개발-일지">개발 일지</h2>
<h4 id="0518">0518</h4>
<ul>
<li><p>플레이어 - Idle, Move 상태에서만 물풍선 놓을 수 있도록 수정</p>
</li>
<li><p>바늘 아이템 먹으면 Ctrl키로 사용 가능</p>
</li>
<li><p>Die State 깜빡이는 효과 Alpha값 사용하는 것으로 수정</p>
<h4 id="0519">0519</h4>
</li>
<li><p>Owl, Turtle 탈것 아이템 먹으면 SetRideType 해주고, 탈것에 탄 상태로 물줄기 맞으면 내려오도록 로직 추가함. 내릴 때 3초 무적상태.  </p>
<h4 id="0521">0521</h4>
</li>
<li><p>배찌, 다오 애니메이션 GameOn2에서 갑자기 대두되는 버그 수정</p>
</li>
<li><p>Owl 타고 있을 때 Turtle 먹으면 어캐됨? -&gt; 먹어지는데 아무것도안됨</p>
</li>
<li><p>탈것에 탄 상태에서 신발먹으면 내렸을때의 속도만 빨라지도록 </p>
</li>
<li><p>플레이어 죽었을 때 그림자 안 사라지는 버그 수정</p>
</li>
<li><p>탈것 아이템 먹을 때 플레이어 위치 부자연스러운거 해결(아이템위치로 옮기도록)</p>
</li>
<li><p>UI에서 CtrlItem 업데이트 해주심 </p>
<ul>
<li>바늘 UI 확인해야함 OK!!</li>
</ul>
</li>
<li><p>RideMove상태에서도 물풍선놓기 가능 </p>
</li>
<li><p>물풍선 놓는 코드가 상태 4개에 반복되기 때문에 함수로 묶기로 함</p>
</li>
<li><p>물풍선 개수 제한</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX] 팀 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240517DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240517DX</guid>
            <pubDate>Fri, 17 May 2024 10:39:19 GMT</pubDate>
            <description><![CDATA[<h2 id="크레이지아케이드-개발-일지">크레이지아케이드 개발 일지</h2>
<ul>
<li>Die 스테이트 애니메이션 추가</li>
<li>캐릭터별 Default능력치, Max능력치 Static const 변수로 추가</li>
<li>깊이버퍼 추가되면서 RenderOrder가 의미없어짐. -&gt; 앞에 나오냐 뒤에 나오냐를 Z값으로 결정하는 것으로 변경되기 때문임. </li>
<li>깊이버퍼 추가 시 Y값을 Z값으로 넣어주면 됨. Y값이 더 큰 게 뒤로 들어가는 게 맞으니까. 근데 캐릭터의 그림자는 캐릭터보다 뒤에 있어야 함 즉, Z값이 더 커야 함. 알잘딱.</li>
<li>카메라에서 DepthOn()하는 순간 깊이버퍼 옵션 켜지는 것. + 한 번 켜지면 켜지는 거고 어떤 컨텐츠에서는 꺼져야한다면 구조상 이상함.</li>
</ul>
<p>원래 기본 배찌, 기본 다오, 기본 마리드만 만들려고 했는데
팀별로 구분되게 세 캐릭터에 각각 Red, Blue색 추가하기로 함. 
-&gt; 리소스 편집 중 ... -&gt; 후아 드디어 OK.</p>
<ul>
<li><p>근데 깊이버퍼 추가 이후로 alpha값 있는 이미지에 윈도우 Clear 컬러인 파란색이 비침...-&gt; 엔진님들이 해결해주심(SetMulColor로 하지말고 SetAlpha로 해야함, 그리고 RenderOrder 설정 다시 필요해짐) OK. </p>
</li>
<li><p>처음 게임에 들어갈때 등장State추가 (GameOn State) OK.</p>
</li>
<li><p>UI에서 선택한 정보대로 플레이어에게 적용 OK.</p>
<ul>
<li>ConstValue::MainPlayerTeamType, ConstValue::MainPlayerCharacterType 추가</li>
</ul>
</li>
<li><p>ItemFluid 만들어줭 -&gt; OK</p>
</li>
<li><p>부시에 숨어지게 해줭 -&gt; OK</p>
</li>
</ul>
<h4 id="다음주-까먹으면-안되는거">다음주 까먹으면 안되는거</h4>
<ul>
<li><p>직접 사용하는 아이템 어떻게 가질지?
먹으면 ctrl로 사용할 수 있도록 뜸. 이미 있는데 또먹으면 대체가 됨. 인벤토리는 게임 밖에서 캐시템 장착했을 때만 채워지는것같은데 이건 어캐할지?
+) 1 누르면 1번에 있는 아이템이 ctrl로 사용할 수 있도록 자리 바뀜</p>
</li>
<li><p>부엉이 거북이 타는것도 해보자</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX11] 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240509DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240509DX</guid>
            <pubDate>Thu, 09 May 2024 09:44:23 GMT</pubDate>
            <description><![CDATA[<h2 id="바바이즈유">바바이즈유</h2>
<h3 id="할-일">할 일</h3>
<ul>
<li><p>✔️  타이틀(게임시작화면) 만들기</p>
<ul>
<li>✔️  “BABA IS YOU” 타이틀 띄울거임 알파벳 리소스 B, I, Y만 더 따면 됨</li>
<li>✔️  Start the Game, Exit the Game 버튼만 만들어도 될듯</li>
</ul>
</li>
<li><p>✔️  발먼지 색 자동으로 바꾸는 거 시도해보기</p>
<ul>
<li>✔️  그냥 오브젝트 Info에 MyColor값 추가해서 렌더러 MulColor곱해주는방식으로함</li>
</ul>
</li>
<li><p>✔️  버그 ) 이미 사라진 SINK 에도 빠져죽는 현상!!</p>
</li>
<li><p>✔️  레벨 7까지깨면 마지막 섬 갈수있게하기?</p>
</li>
<li><p>✔️  게임이랑 똑같이 깬 스테이지의 양옆 스테이지 둘 다 열리게 하기 (지금은 1→2→3… 순으로 열리게 해둠)</p>
<ul>
<li>✔️  1→23, 2→45, 3→4, 4→67, 5→ 7 (이미 생긴 스테이지넘버는 안만들어도 되도록)</li>
</ul>
</li>
<li><p>✔️  Congratulations 띄우기?</p>
</li>
<li><p>✔️  Bridge 액터로 만들고 스테이지 넘버 넘어갈때 생기게하는거 해보기……</p>
<ul>
<li>✔️  라인 리소스 따기</li>
<li><input disabled="" type="checkbox"> 만들었는데 구조 바꿔야함(미리 만들어놓고 렌더러 껐다 키는 걸로)→포기❌</li>
</ul>
</li>
<li><p>✔️  SelectMap레벨에서 라인이나 새로운 스테이지말고는 이동자체가 불가능하도록</p>
</li>
<li><p>✔️  클리어한 스테이지 번호 색 바꾸기</p>
</li>
<li><p>✔️  스테이지별 제목</p>
</li>
<li><p>✔️  Stage8 (마지막 스테이지) 만들기. 어캐만들지 고민중</p>
<p>  일단 제목은 Victory로 했음 </p>
</li>
<li><p><input disabled="" type="checkbox">  소리 넣기</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX11] 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240507DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240507DX</guid>
            <pubDate>Tue, 07 May 2024 09:33:09 GMT</pubDate>
            <description><![CDATA[<h2 id="바바이즈유">바바이즈유</h2>
<h3 id="앞으로-할-일">앞으로 할 일</h3>
<ul>
<li>✔  타이틀(게임시작화면) 만들기<ul>
<li>✔  “BABA IS YOU” 타이틀 띄울거임 알파벳 리소스 B, I, Y만 더 따면 됨</li>
<li>✔  Start the Game, Exit the Game 버튼만 만들어도 될듯</li>
</ul>
</li>
<li>✔  발먼지 색 자동으로 바꾸는 거 시도해보기<ul>
<li>✔  그냥 오브젝트 Info에 MyColor값 추가해서 렌더러 MulColor곱해주는방식으로함</li>
</ul>
</li>
<li>✔  버그 ) 이미 사라진 SINK 에도 빠져죽는 현상!!</li>
<li>✔  레벨 7까지깨면 마지막 섬 갈수있게하기?</li>
<li>✔  게임이랑 똑같이 깬 스테이지의 양옆 스테이지 둘 다 열리게 하기 (지금은 1→2→3… 순으로 열리게 해둠)<ul>
<li>✔  1→23, 2→45, 3→4, 4→67, 5→ 7 (이미 생긴 스테이지넘버는 안만들어도 되도록)</li>
</ul>
</li>
<li><input disabled="" type="checkbox"> Stage8 (마지막 스테이지) 만들기. 어캐만들지 고민중</li>
<li><input disabled="" type="checkbox"> 소리 넣기</li>
</ul>
<p>모야 벨로그 지금 체크박스 마크다운이 안먹힘</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX11] 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240429DirectX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240429DirectX</guid>
            <pubDate>Mon, 29 Apr 2024 12:48:42 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유">바바이즈유</h1>
<h2 id="할-일">할 일</h2>
<ul>
<li><p>문장 하나만 찾음. (OK)</p>
<ul>
<li>동사체크 함수에서 목적어 발견하면 리턴하는 게 아니고 목적어 발견하면 queue에 넣는 것으로 변경함.</li>
</ul>
</li>
<li><p>게임끝나고나면 움직이면안됨 (OK)</p>
<ul>
<li>게임 승리, 패배 시에 YOU속성 오브젝트 입력못받게해줌.</li>
</ul>
</li>
<li><p>바닥에 깔려있는 Tile 오브젝트 추가 (OK)</p>
</li>
<li><p>Stage2 만들기 (OK)</p>
</li>
<li><p>스테이지 선택하는 곳 만들기? (OK)</p>
</li>
<li><p>스테이지3 사이즈 가로 -1, 세로 -2 칸 해야 함</p>
<ul>
<li>864 - 36, 648 - 72 ⇒ 828, 576</li>
</ul>
</li>
</ul>
<p>내일 스테이지마다 클래스 생성 안 해도 되게 바꿔야겠당..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DirectX11] 0425, 0426 메모]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240426DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240426DX</guid>
            <pubDate>Thu, 25 Apr 2024 10:02:01 GMT</pubDate>
            <description><![CDATA[<h2 id="바바이즈유">바바이즈유</h2>
<ul>
<li>GUI</li>
</ul>
<p>마우스 위치 인덱스로 바꾸는 거 OK</p>
<p>클릭한 곳 인덱스 가져오는 걸로 했더니 다른 버튼 누를 때도 들어가져서 더블클릭으로 바꿈.</p>
<p>계획 : 더블클릭한 곳 + 버튼(ex:바바버튼)의 오브젝트 정보 한 줄씩 저장. → 바바게임모드에서 그 정보 읽어와서 AutoCreate함수에 하나씩 넣어서 맵으로 불러올 수 있도록.</p>
<p>일단 저장하는 것부터 하자.</p>
<ul>
<li><p>FadeIn은 이미지 스케일로 해결</p>
</li>
<li><p>FadeOut은 쉐이더 복붙해서 이펙트로 해결</p>
<ul>
<li>근데 이펙트 끄는거 어디서 만들어야하지?</li>
</ul>
</li>
<li><p>게임 승리나 종료 시에 잠깐 다른일할수있는 뭔가를 넣어야하나?</p>
<ul>
<li>승리 ⇒</li>
</ul>
</li>
<li><p>더 할 것 :</p>
<ul>
<li>문장 하나만 찾음. dfs하든가 동사체크에서 문장완성하게하든가</li>
<li>게임끝나고나면 움직이면안됨</li>
</ul>
</li>
</ul>
<hr>
<h2 id="수업">수업</h2>
<p>어떤 데이터를 읽거나 쓰는 것을 관리하기 위해서 iocp를 관리한다.</p>
<p>쓰레드를 써서 무슨 일을 한다는 것은 기본적으로 그 일이 끝날때까지 맡긴다는 것이다.</p>
<p>FOpen은 동기 함수. 함수가 실행되고 끝날 때까지 내가 기다리는 걸 동기라고 한다.</p>
<p>비동기는 언제 함수가 끝날지 모르는 거임.</p>
<p>iocp</p>
<p>서버통신이든 파일입출력이든</p>
<p>너한테 뭐가 왔어, 너 파일 다 읽었어 등등을 알려주는 시스템을 iocp라고 한다.</p>
<p>iocp는 이 용도 외에도 다양하게 이용할 수 있다. 이걸 사용하면 쓰레드를 효율적으로 이용할 수 있다. Window에서만 가능. (리눅스는 epoll이라는 걸 지원)</p>
<p>EngineThread</p>
<p>이름지정가능</p>
<p>RR방식 (라운드로빈 스케쥴 방식)</p>
<p>걍 순서대로 하나씩 넣어주는거</p>
<ul>
<li>쓰레드 풀 Thread Pool</li>
</ul>
<p>IOCP의 역할은 각각 입출력 데이터를 처리하는 일들이 어느쪽이 여유가 있는지 확인해주고 몰려드는 데이터의 버퍼역할도 해주고</p>
<p>일이 100개, 쓰레드는 5개가 있다고 해보자.</p>
<p>IOCP는 자신에게 등록된 쓰레드들을 waiting, release, paused 상태로 구분.</p>
<p>최초의 각 쓰레드 상태</p>
<p> Waiting Queue [waiting][waiting][waiting][waiting][waiting]</p>
<p>일이 1개 들어옴</p>
<p>Waiting Queue [waiting][waiting][waiting][waiting]</p>
<p>Release Queue [release[일]]</p>
<p>Paused Queue </p>
<p>일 끝나면</p>
<p>Waiting Queue [waiting][waiting][waiting][waiting]</p>
<p>Release Queue </p>
<p>Paused Queue [paused]</p>
<p>근데 일이 다시 들어오면 waiting을 안깨우고 paused를 다시 깨움. 캐시 적중률 때문!</p>
<p>일을 처리하려면 컴퓨터에 앉아야한다고 할 때</p>
<p>waiting은 아직 자리로 가지도 않은 상태(바깥에서 기다리는 사람)</p>
<p>release 컴퓨터 자리에 앉아있는 사람</p>
<p>paused 컴퓨터 자리에 앉아있는데 끝나서 일끝났다고 손든 사람</p>
<p>쓰레드가 일을 하기 위해서 뭔가 준비를 하는 작업을 컨텍스트 스위칭이라고 한다. 컨텍스트 스위칭이 일어나지 않는 쓰레드를 busy쓰레드라고 한다.</p>
<p>IOCPHandle = CreateIoCompletionPort(어쩌구); 이렇게 쓰면 iocp를 만들겠다는 뜻이 됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DX11] 0423 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240423DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240423DX</guid>
            <pubDate>Tue, 23 Apr 2024 09:39:28 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유-개발-일지">바바이즈유 개발 일지</h1>
<h2 id="할-일">할 일</h2>
<ul>
<li>SKULL Object, SKULL Text OK</li>
<li>LAVA Text, LAVA Tile OK</li>
<li>Hot (X)</li>
<li>LAVA Tile 닿아있는 부분 체크해서 이미지 바꾸는거…. OK</li>
</ul>
<h3 id="타일-방향-자동-업데이트-구현">타일 방향 자동 업데이트 구현!!!</h3>
<p>타일 오브젝트들은 각각 16가지 방향 존재함. (WALL, WATER, LAVA 등등..) 그때그때 붙어있는 타일은 붙어있는 모양새로 자동 업데이트 해주는 기능 오늘 구현함.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/872b550a-84ae-4545-8742-e1c5081a0a0e/image.png" alt=""></p>
<ul>
<li>상하좌우 방향에 타일이 붙어있는지를 0과 1로 표현할 수 있음. 그래서 네 자리의 2진수라고 생각하고 계산 =&gt; 각각 0~15의 번호 생김. 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/b5dffa90-b7d7-4dcf-9205-4917c89243ab/image.png" alt=""></li>
<li>근데 이미지 애니메이션 방향이랑 다르니까 map으로 매칭해줌.
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/09f7ee8b-fab1-46b2-bc11-f5a7653a8e44/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DX11] 0419, 0422 개발 일지, 수업]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240422DX11</link>
            <guid>https://velog.io/@kuronuma_daisy/20240422DX11</guid>
            <pubDate>Mon, 22 Apr 2024 09:35:58 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유-개발-일지">바바이즈유 개발 일지</h1>
<h2 id="240419">24.04.19</h2>
<h3 id="할-일">할 일</h3>
<ul>
<li><p>STOP 목적어 만들자</p>
<ul>
<li>어제 해놓고갔네?ㅋㅋ</li>
<li>WALL IS STOP 했더니 WALLTEXT도 STOP이 됨<ul>
<li>Info에 MyObjectiveType말고 연결된 텍스트의 목적어를 저장하는 TextObjective를 추가해서 구분해서 씀.</li>
</ul>
</li>
</ul>
</li>
<li><p>FLAG, FLAGTEXT, WIN 리소스 추가</p>
</li>
<li><p>FLAGTEXT</p>
</li>
<li><p>FLAG 플레이어</p>
</li>
<li><p>WIN TEXT</p>
</li>
<li><p>flag 애니메이션 on으로해놨다고해도 OFF로바껴있어야하지않나</p>
<ul>
<li>시작할때 AniOnOff함수 실행하면 되니까 ㄱㅊ</li>
</ul>
</li>
<li><p>GUI로 맵찍는거</p>
<ul>
<li>버튼으로 액터 선택할 수 있게하고, 화면 인덱스 위치가져와서 그 인덱스위치에 생성되게하면되나?</li>
<li>걔를 어캐 저장해야하지? 이미지가 아닌디</li>
<li>[오브젝트 종류 - 오브젝트 인덱스 위치] 가지는 맵 정보를 저장하고 맵 불러올 때 파일읽어서 불러오는걸로?</li>
<li>나중에</li>
</ul>
</li>
</ul>
<h3 id="이펙트-나중에-하고싶다">이펙트 나중에 하고싶다</h3>
<ul>
<li>문장 완성되거나 깨질 때 이펙트</li>
<li>바바 이동할 때 이펙트</li>
<li>flag is win하면 깃발에 반짝이같은 이펙트</li>
</ul>
<h2 id="240422">24.04.22</h2>
<h3 id="오늘-목표">오늘 목표</h3>
<ul>
<li><p>03 스테이지 캡처
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/503c0c6a-379b-44bb-9060-7ecd927c1e53/image.png" alt=""></p>
</li>
<li><p>WIN이랑 DEFEAT 대충 OK</p>
</li>
<li><p>게임 끝을 만들면 YOU가 한개도없을때 끝나는 것도 가능 OK</p>
</li>
<li><p>PUSH, SINK, WATER, ROCK</p>
</li>
<li><p>게임모드에 오브젝트 자동으로 생성하는 함수 만들자… OK</p>
</li>
</ul>
<h3 id="기록">기록</h3>
<ul>
<li><p>게임모드에 오브젝트 자동으로 생성하는 함수</p>
</li>
<li><p>Win, Defeat인 곳에 YOU가 간걸 언제검사해야하지?</p>
</li>
<li><p>MyObjectiveType이 YOU인 애가 MyObjectiveType이  DEFEAT인 애를 만나면 죽어야 함. 근데 둘다 PlayerObject임.</p>
</li>
<li><p>파괴상태를 어디에만들어야되지? 텍스트도 파괴될 수 있으니까 Object에 넣어야할것같ㅊ은데 애니메이션 설정을 어캐해야하징?</p>
</li>
<li><p>DEFEAT속성인 애한테 올라간 YOU속성 개체 죽음. 롤백하면 살아나야함.</p>
</li>
<li><p>SINK는 YOU속성 개체 죽지만 자기도 파괴됨.</p>
</li>
<li><p>생각해보니까 Stack에 얘네가 죽는지 마는지도 넣어야할듯!? ⇒ 아니다.. Defeat상태나 Sink상태면 안보이게 하는거로만 해도 되나? 아 그것도 바꿔줘야하는구나..</p>
<ul>
<li>모든 오브젝트 파괴여부 Stack을 들고있는 것도 나쁘지 않을듯함. 이유는 텍스트 타일을 파괴시키면서 깨는 경우도 있고, Player오브젝트들도 모두 가능.</li>
</ul>
</li>
</ul>
<h3 id="짜잔">짜잔</h3>
<p><img src="https://velog.velcdn.com/images/kuronuma_daisy/post/aeb01def-7cb7-4ae1-beb4-15eb49effaa4/image.png" alt=""></p>
<hr>
<h2 id="240422-수업낙서">24.04.22 수업낙서</h2>
<p>1000개 원소 중 find탐색을 할 때 vector vs map?</p>
<p>직접 실행해보면 1000개따리 했을때 벡터가 항상 빠름. 한 만개이상부터나 map이 더 빠르다. 
이론상 map이 빨라야하는데… 왜?</p>
<p>1000개중에 999번째를 찾을 경우 vector에게는 최악의 상황인데도 벡터가 더 빨랐음. </p>
<ul>
<li>우리 눈에 보이는 코드는 진짜 코드가 아님. 어셈블리로 된 게 진짜 코드임. 어셈블리 코드가 실제 연산량을 보기 가장 쉬운 방법이다. ⇒ 이게 소프트웨어적인 이유이다.
소프트웨어적으로는 맵의 코드가 더 빠른 게 맞다. 찾으러 들어가는 횟수만 생각하면 map이 빠르다. 소프트웨어적인 설계빼문에 맵이 느렸던 걸까? 아님. map이 더 이성적인게 맞다.</li>
</ul>
<p>==보다 &gt;연산이 더 빠름. ==는 비트 끝까지 가서 확인함, &gt;는 1이먼저나오는 곳이 큰거임. 벡터가 느려야함..</p>
<ul>
<li>하드웨어적 이유
⇒ 
캐시는 연산을 하기 전에(cpu에 보내기 전에) 보관을 해놓는 위치. CPU는 같다(=)를 가지고 있음. 연산자의 왼쪽과 오른쪽을 채우기 위해서 RAM에 있는 값을 바로 CPU로 가져오는 개념이 아님. Ram에서 캐시로, 캐시에서 CPU로 보내는 개념이다. </li>
</ul>
<p>근데 캐시로 옮길 때 값만 옮기는 게 아니고 특정 지역을 통째로 뜯어서 가져온다. 캐시의 크기에 따라 달라진다. </p>
<p>예를 들어 1과 3을 비교해야할 때 가져온 값 중에 1을 왼쪽값으로서 CPU에 넘긴다. 그리고 내부에서 오른쪽 값인 3이 있는지 찾아본다. 없으면 기존 캐시데이터를 지우고 3이 있는 부분을 또 가져와야 함. </p>
<p>cpu가 요구하는 값을 한 번에 가져오는 것을 적중률이라고 한다. 캐시 적중률이 높을수록 당연히 빠르다.
한마디로 캐시히트가 벡터가 더 잘되는 차이네.!</p>
<ul>
<li>int v1 = ++a;
int v2 = a++;
둘 중에 ++a가 더 빠름.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DX11] 포트폴리오 개발 일지 (04.17, 04.18)]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240418DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240418DX</guid>
            <pubDate>Tue, 16 Apr 2024 10:25:49 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유-개발일지">바바이즈유 개발일지</h1>
<p>YOU끼리 겹쳐질 수는 없어야 함.</p>
<p>근데 YOU가 있으면 못 가게 막는건 안 됨..</p>
<p>쭉 갈 수 있는지 확인 할 때, YOU가 못가면 나도 못가야함. </p>
<p>문장체크</p>
<ol>
<li>주어텍스트가 목적어 바뀌었을때 주어그림에도 목적어 바꿔줘야함.</li>
<li>문장체크하고 동사 ON하는걸 어캐해야함?<ul>
<li>Object에 있는 SentenceOn으로 켜게.</li>
</ul>
</li>
</ol>
<p>지금 문장검사 끝까지 안감 일단몰라</p>
<p>→ 문장검사 OK</p>
<ul>
<li><p>텍스트들도 다 PUSH되게 바꿨음</p>
</li>
<li><p>BABA TEXT가 문장ON되고 목적어가 @이면 BABA플레이어의 목적어타입이@가 되어야 함.</p>
</li>
<li><p>문장검사했을 떄 아닌애들은 SentenceON을 false로 바꿔줘야 함</p>
<ul>
<li>검사할 때 마다 한 번씩 다 꺼주는 걸로 해결.</li>
</ul>
</li>
<li><p>Z로 했을때 문장 업데이트 안됨</p>
<ul>
<li>롤백시 CurToNext로 데이터 바로 바꿔주는거로 한줄추가해서 해결.</li>
</ul>
</li>
<li><p>문장 꺼졌을 때 주어텍스트에 연결된 플레이어객체들이 꺼져야 함</p>
</li>
<li><p>WALL IS YOU일 떄 WALL 플레이어로 BABATEXT를 밀었을 떄 롤백이 BABATEXT만 안됨.</p>
<ul>
<li>왜 WALL로 밀면 스택에 false로 들어가지?</li>
<li>WALL플레이어로 밀면 왜 TEXT들이 롤백이안됨?</li>
<li>Push당하는애들 객체에 직접 접근해서 <strong>EachMoveCheck_ForStack=true; 를 해줘서 해결.</strong></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DX11] 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240415DX11</link>
            <guid>https://velog.io/@kuronuma_daisy/20240415DX11</guid>
            <pubDate>Mon, 15 Apr 2024 08:04:31 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유-개발-일지">바바이즈유 개발 일지</h1>
<ul>
<li><p>이동 롤백기능 여러 마리 움직이다가 일부 벽에 걸릴 때 롤백하면 걔네는 가만히 있어야 함 -&gt; 수정 OK</p>
</li>
<li><p>롤백에서 애니메이션 꼬이는 거 해결 OK</p>
</li>
<li><p>LerpMoveObject 클래스랑 PlayerObject 클래스랑 기능 모호한 부분 다시 분리하기 OK 대충 한듯.</p>
</li>
<li><p>GameMode 부모 만들기 OK</p>
</li>
<li><p>미는거해보자 
미는거 하려면 얘네가 움직일 때 MM에 있는 정보도 바꿔줘야함!!! OK
밀리려면 일단 Push상태인지를 static으로 모든 WallObject가 같이 공유해야함 -&gt; Push상태일 때 YOU인 애가 나한테 다가오면 밀려야 함...
```
순서 생각해보면
YOU가 이동 </p>
</li>
<li><blockquote>
<p>이동할 곳에 Push인 애가 있으면 걔의 NextIndex가 이동 가능한 곳인지 확인해야함 </p>
</blockquote>
</li>
<li><blockquote>
<p>가능하면 YOU부터 이동 </p>
</blockquote>
</li>
<li><blockquote>
<p>Push 당할 애가 자기 자리에 YOU가 같이 있으면 밀려줘야함? (방향어캐알아?)
미는 게 연쇄적이어야 함...</p>
</blockquote>
</li>
</ul>
<p>YOU가 이동 
-&gt; 이동할 곳에 Push인 애가 있으면 걔의 NextIndex가 이동 가능한 곳인지 확인해야함
-&gt; 불가능하면 YOU도 못움직임.</p>
<p>```
정우왈 재귀로 계속 옆을 찾아서 못움직이는 애가 발견되면 안가고 발견되지 않으면 가도록 하라 함</p>
<ul>
<li>STOP 블록에 막히는거 구현함</li>
</ul>
<p>지금 !!!! 아무 오브젝트도 못 움직일 때는 MoveStack 안 넣어도 되는데 다 들어감!!!!!!!!!!!!!!!!!!!!!  그리고 ...
그리고 ......... 밀기 아직 안 됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DX11] 포트폴리오 개발 일지]]></title>
            <link>https://velog.io/@kuronuma_daisy/20240415DX</link>
            <guid>https://velog.io/@kuronuma_daisy/20240415DX</guid>
            <pubDate>Fri, 12 Apr 2024 10:03:11 GMT</pubDate>
            <description><![CDATA[<h1 id="바바이즈유-개발-일지">바바이즈유 개발 일지</h1>
<ul>
<li><p>Graph에 인덱스로 넣어줄 때 실제로 그 위치에 생기게 만들어야 함 -&gt; 자동으로 생기는건 아닌데 어쨋든 인덱스로 넣어주는거 대충 OK</p>
</li>
<li><p>못갈곳은 못가게 막는거 만들자 OK</p>
</li>
<li><p>되돌리기 수정해야 할듯... 두 마리 이상 생성해서 한 마리만 벽에 막혔다가 되돌리면 다른 애 이상함!!!</p>
<ul>
<li>바바 두 개일 때 하나는 움직이고 하나는 막힐 때를 생각해야 함. 하나라도 움직였다면 MoveStack에 쌓아줘야함.</li>
</ul>
</li>
<li><p>GameMode 부모 만드는거, LerpMoveObject 클래스랑 PlayerObject 클래스랑 기능 모호한 부분 다시 분리하기 담주에 할거임.</p>
</li>
<li><p>InputCheck를 static으로 바꾸려 했는데,,, 각각오브젝트의 InputCheck도 필요함.... 커밋안하길 잘했다!! 
<img src="https://velog.velcdn.com/images/kuronuma_daisy/post/eedc4c2f-2518-4da3-91f5-cb523accc435/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>