<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BreadMushroom</title>
    <link>https://myview34032.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 19:25:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BreadMushroom</managingEditor>
    <image>
      <title>BreadMushroom</title>
      <url>https://tistory1.daumcdn.net/tistory/8615959/attach/4a5bc97d40bb4a019349b19a82748625</url>
      <link>https://myview34032.tistory.com</link>
    </image>
    <item>
      <title>2026/06/26</title>
      <link>https://myview34032.tistory.com/104</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] 접근 제어자 (private / public)★ &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;★&lt;/b&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;★&lt;/b&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;★&lt;/b&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&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; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt; 자판기로 비유하면 클래스 내부 멤버 변수를 유리(private)로 숨기고, 안전한 동전 구멍(public 함수)을 통해서만 값을 바꾸게 강제하여 버그를 막는 설계&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 중요한지:&lt;/b&gt;변수에 말도 안 되는 예외 값(예: HP가 음수가 되거나, 소지 골드가 마이너스가 되는 현상)이 들어와서시스템이 터지는 것을 막고 싶을 때.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782435225866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ❌ [Before] 변수가 public으로 열려있어 데이터가 오염되는 경우
class APlayer {
public:
    int HP = 100;
    int Defense = 10; 
};

void ApplyDamage(APlayer&amp;amp; Player, int RawDamage) {
    // 강력한 보스 몬스터가 공격력 200으로 공격한 상황
    Player.HP -= (RawDamage - Player.Defense); 
    
    //   결과: Player.HP가 -90이 됨! 
    // 변수가 public이라 제동 장치 없이 음수가 그대로 대입되어 버그 발생.
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1782435274053&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//  [After] 변수를 private으로 숨기고 안전장치(함수)를 구축한 경우
class APlayer {
private:
    int HP = 100;
    int Defense = 10;

public:
    // 외부에서는 오직 이 함수를 통해서만 데미지를 줄 수 있음
    void TakeDamage(int RawDamage) {
        int FinalDamage = RawDamage - Defense;
        if (FinalDamage &amp;lt; 0) FinalDamage = 0; // 음수 데미지 방지

        HP -= FinalDamage;

        //  ️ 최소 보장선(방어벽) 구축
        if (HP &amp;lt; 0) {
            HP = 0; 
        }
    }

    // 값을 안전하게 읽어갈 수 있도록 Getter 제공
    int GetHP() const { return HP; }
};

// 이제 외부(전투 시스템 등)에서는 안전하게 함수만 호출하면 됨
void ApplyDamage(APlayer&amp;amp; Player, int RawDamage) {
    Player.TakeDamage(RawDamage); 
    
    //  결과: RawDamage가 200이 들어와도 Player.HP는 안전하게 0에서 멈춤!
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/104</guid>
      <comments>https://myview34032.tistory.com/104#entry104comment</comments>
      <pubDate>Fri, 26 Jun 2026 20:56:42 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/25</title>
      <link>https://myview34032.tistory.com/103</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt; [트러블 슈팅] 플러그인 모듈이 로드되지 않는 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt;(Plugin 'Temporary' failed to load because module 'Temporary' could not be initialized successfully after it was loaded.)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;문제:&lt;/b&gt; 플러그인 DLL은 찾았고 로드까지 시도했지만, 모듈 초기화 과정에서 실패&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0&quot;&gt;원인 (이유):&lt;/b&gt; IMPLEMENT_MODULE&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;을 통해 엔진의 모듈 시스템에 등록하지 않아서 생긴 문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,2,0&quot;&gt;해결 방법:&lt;/b&gt; 플러그인 모듈 구현부(.cpp)파일 하단에 IMPLEMENT_MODULE(클래스명, 모듈이름) 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782354573488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Temporary.h&quot;

void FTemporaryModule::StartupModule()
{
	UE_LOG(LogTemp, Warning, TEXT(&quot;Start Module!&quot;));
}

void FTemporaryModule::ShutdownModule()
{
	UE_LOG(LogTemp, Warning, TEXT(&quot;End Module!&quot;));
}

IMPLEMENT_MODULE(FTemporaryModule, Temporary)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&lt;b data-path-to-node=&quot;5,0&quot; data-index-in-node=&quot;0&quot;&gt;[알고리즘]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;5,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;문제:&lt;/b&gt; 배열의 평균값&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;배운점:&lt;/b&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;배열의 인덱스는 항상 0부터 시작한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;따라서 길이가 N인 배열의 마지막 인덱스는 N이 아니라 N - 1이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782348147742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// numbers_len은 배열 numbers의 길이입니다.
double solution(int numbers[], size_t numbers_len) {
    double answer = 0;
    double average = 0;
    
    for(int i=0; i &amp;lt; numbers_len; i++)
    {
        average += numbers[i];
    }
    
    average = average / numbers_len;
    answer = average;
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/103</guid>
      <comments>https://myview34032.tistory.com/103#entry103comment</comments>
      <pubDate>Thu, 25 Jun 2026 20:39:48 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/24</title>
      <link>https://myview34032.tistory.com/102</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&lt;b data-path-to-node=&quot;5,0&quot; data-index-in-node=&quot;0&quot;&gt;[질문]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;5,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;내가 몰랐던 것:&lt;/b&gt; void OnRep_ServerRotationYaw(); 함수는 어디서도 호출되지 않았는데 어떻게 액터에 적용 된 걸까??&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;원인 (이유):&lt;/b&gt; Replication Notify 시스템에 등록된 콜백 함수&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;라서 자동으로 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782263531613&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//h
UFUNCTION()
void OnRep_ServerRotationYaw();

UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
float ServerRotationYaw;

//cpp
void ADXBox::OnRep_ServerRotationYaw()
{
	SetActorRotation(FRotator(0.f, ServerRotationYaw, 0.f));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] NetLoadOnClient&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt; 레벨에 정적으로 배치된 액터를 서버 복제 없이 클라이언트가 맵 로딩 시 로컬에서 함께 로드하도록 하는 옵션&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&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;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;게임 중 상태가 거의 변하지 않는 액터&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;블루프린트에서 설정하는게 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] Property&amp;nbsp;Replication &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt; 서버에 존재하는 변수의 특정 속성값을 클라이언트들에게 자동으로 동기화하는 기능&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;체력, 점수, 위치값처럼 &lt;/span&gt;서버가 기준이 되어 모든 클라이언트가 같은 값을 알아야 할 때&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로퍼티 레플리케이션 설정 방법&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;액터의 Replicates 속성을 true로 설정합니다.&lt;/li&gt;
&lt;li&gt;네트워크로 복제할 액터의 속성을 키워드로 지정합니다.해당 속성의 UPROPERTY()에 Replicated 키워드 추가합니다.&lt;/li&gt;
&lt;li&gt;GetLifetimeReplicatedProps() 함수에 네트워크로 복제할 속성을 추가합니다.#include &amp;ldquo;Net/UnrealNetwork.h&amp;rdquo; 헤더파일 추가합니다.DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782264855538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//h

생성자();

UPROPERTY(Replicated)
float ServerRotationYaw;

virtual void GetLifetimeReplicatedProps(TArray&amp;lt;class FLifetimeProperty&amp;gt;&amp;amp; OutLifetimeProps) const override;

//cpp
#include &amp;ldquo;Net/UnrealNetwork.h&amp;rdquo;

생성자()
{
    bReplicates = true;
}

void 클래스이름::GetLifetimeReplicatedProps(TArray&amp;lt;class FLifetimeProperty&amp;gt;&amp;amp; OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ThisClass, ServerRotationYaw);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] UE_DISABLE_OPTIMIZATION&amp;nbsp;&amp;amp;&amp;nbsp;UE_ENABLE_OPTIMIZATION &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt; 디버깅을 쉽게 하기 위해 특정 코드 구간의 컴파일 최적화를 끄고 다시 켜는 매크로&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;특정 코드 구간에만 최적화를 끄면 &lt;/span&gt;디버깅에서 흐름을 더 정확히 추적&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782265168912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UE_DISABLE_OPTIMIZATION

//디버깅 할 코드부분

UE_ENABLE_OPTIMIZATION&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] Replication&amp;nbsp;Notify&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt; 복제된 변수가 클라이언트에서 &lt;b&gt;갱신될 때&lt;/b&gt; 자동으로 후처리 함수를 호출해주는 기능&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;변수 값만 동기화하는 것으로 끝나지 않고, 값이 바뀐 뒤에 추가 동작이 필요할 때 사용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체력 값이 바뀌면 UI 갱신&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;회전 값이 바뀌면 액터 회전 적용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;코드&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;:&lt;/b&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1782265375970&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;//h
UFUNCTION()
void OnRep_ServerRotationYaw();

UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
float ServerRotationYaw;

//cpp
void ADXBox::OnRep_ServerRotationYaw()
{
	SetActorRotation(FRotator(0.f, ServerRotationYaw, 0.f));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] NetUpdateFrequency&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 서버가 이 액터의 변경 정보를 클라이언트에게 얼마나 자주 보낼지 정하는 값 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?: &lt;/b&gt;굳이 자주 동기화 할 필요 없는 액터일 경우 값을 조절하여 최적화 할 때&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] Relevancy&lt;/b&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&amp;nbsp; 액터의 정보를 특정 클라이언트에게 보낼 필요가 있는지 판단하는 기준 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?: &lt;/b&gt;클라이언트에 연관된 액터만 복제해줌으로 최적화 할 때&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt; [함수 족보] SpawnActor&amp;lt;&amp;gt;()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt; 게임 실행 중에 원하는 Actor를 특정 위치와 회전값으로 동적으로 생성할 때 사용하는 함수&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;이미 레벨에 배치된 Actor가 아니라, &lt;/span&gt;게임 도중 새 Actor를 만들어야 할 때&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 사용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;캐릭터가 총알을 발사할 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;몬스터를 일정 위치에 소환할 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;void AMyCharacter::BeginPlay()
{
    Super::BeginPlay();

    FVector SpawnLocation = GetActorLocation() + FVector(200.f, 0.f, 0.f);
    FRotator SpawnRotation = GetActorRotation();
    FActorSpawnParameters SpawnParams;

    ATestActor* SpawnedActor = GetWorld()-&amp;gt;SpawnActor&amp;lt;ATestActor&amp;gt;
    (
        SpawnLocation,
        SpawnRotation,
        SpawnParams
    );&lt;/code&gt;&lt;/pre&gt;
&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/102</guid>
      <comments>https://myview34032.tistory.com/102#entry102comment</comments>
      <pubDate>Wed, 24 Jun 2026 20:52:51 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/19</title>
      <link>https://myview34032.tistory.com/99</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] &lt;span data-token-index=&quot;0&quot;&gt;NetLoadOnClient 속성&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt; 레벨에 배치된 액터를 클라이언트에서도 로드할지 결정하는 네트워크 속성&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;레벨에 정적으로 배치되어 동기화 해줄 필요 없는 액터(&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;맵에 배치된 문, 상자, 장식물, 트리거)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드: &lt;/b&gt;에디터에서 엑터 블루프린트로 설정하는게 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] &lt;span&gt;&lt;/span&gt;Replication Notify&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; Replicated 변수 값이 클라이언트에서 변경되었을 때 자동으로 호출되는 알림 함수 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;서버에서 바뀐 값이 클라이언트에 전달된 뒤, 클라이언트 쪽에서 추가 처리가 필요할 때( 값이 바뀐 순간에 반응해야 할 때&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; color: #2e2f36; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;체력이 바뀌면 HP UI 갱신&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781830653116&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//헤더파일

UPROPERTY(ReplicatedUsing = OnRep_IsOpen) //변경할 속성의 UPROPERTY() 매크로에는 ReplicatedUsing 키워드
bool bIsOpen;

UFUNCTION()
void OnRep_IsOpen(); //콜백함수에는 UFUNCTION() 매크로와 OnRep_ 접두사가 붙음

//cpp파일

void AMyDoorActor::OnRep_IsOpen()
{
    //문 열림 애니메이션 재생, UI 갱신, 사운드 재생
}

void AMyDoorActor::GetLifetimeReplicatedProps(TArray&amp;lt;FLifetimeProperty&amp;gt;&amp;amp; OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME(AMyDoorActor, bIsOpen);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념]&lt;span&gt; NetUpdateFrequency-최적화 기법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 액터의 Replication 정보를 1초에 최대 몇 번까지 클라이언트에 보낼지 정하는 값(단, 최대값이지 그 값을 계속 유지한다는 보장은 없음)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;멀티플레이에서 액터의 상태를 &lt;/span&gt;얼마나 자주 동기화할지 조절&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;할 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;AMyCharacter::AMyCharacter()
{
    bReplicates = true;

    // 1초에 최대 60번 네트워크 업데이트 시도
    NetUpdateFrequency = 60.0f;
}

SetNetUpdateFrequency() //함수로도 변경가능&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념]&lt;span&gt;&lt;span&gt; UPROPERTY(Meta=(AllowPrivateAccess))&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt; C++ private인데 블루프린트에 보이게 예외처리 해주는 메타 키워드 &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;디자이너들이 블루프린트에서 편집가능하게 할 변수들&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781854086970&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta=(AllowPrivateAccess))
TObjectPtr&amp;lt;USceneComponent&amp;gt; SceneRoot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념]&lt;span&gt;&lt;span&gt;&lt;span&gt; TSubclassOf&amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 맵에 배치된 액터가 아니라, 스폰할 '블루프린트 원본 에셋' 지정용 주머니 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;디자이너들이 블루프린트에서 편집가능하게 할 변수들&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781856721347&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TSubclassOf&amp;lt;AActor&amp;gt; LandMineClass;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/99</guid>
      <comments>https://myview34032.tistory.com/99#entry99comment</comments>
      <pubDate>Fri, 19 Jun 2026 20:30:57 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/18</title>
      <link>https://myview34032.tistory.com/98</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] 로그 매크로 정의&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;반복해서 쓰는 로그 형식을 &lt;/span&gt;매크로로 묶어&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;, 필요한 정보를 자동으로 붙여 출력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 써?:&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;같은 형태의 로그를 여러 번 찍을 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;#define MY_LOG(Category, Verbosity, Format, ...) \
    UE_LOG(Category, Verbosity, TEXT(&quot;[Prefix] %s&quot;), \
        *FString::Printf(Format, ##__VA_ARGS__))&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] 새로운 로그 카테고리 선언&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 로그를 기능별로 구분&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;언제 써?: &lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;UE_LOG에서 내가 만든 카테고리를 사용하고 싶을 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;// .h
DECLARE_LOG_CATEGORY_EXTERN(LogMyCategory, Log, All);

// .cpp
DEFINE_LOG_CATEGORY(LogMyCategory);

//DECLARE_LOG_CATEGORY_EXTERN(카테고리이름, 기본로그레벨, 컴파일시최대로그레벨);

DECLARE_LOG_CATEGORY_EXTERN은 보통 헤더 파일에 작성해서
&amp;ldquo;이런 로그 카테고리를 사용할 것이다&amp;rdquo;라고 선언
그리고 실제 정의는 .cpp 파일에서 해줘야한다.&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/98</guid>
      <comments>https://myview34032.tistory.com/98#entry98comment</comments>
      <pubDate>Thu, 18 Jun 2026 10:48:24 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/16</title>
      <link>https://myview34032.tistory.com/97</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt; [질문]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;내가 몰랐던 것 (문제):&lt;/b&gt; FString 자료형 변수인데 어떻게 배열처럼 인덱스로 접근 할 수 있을까?&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0&quot;&gt;원인 (이유):&lt;/b&gt; FString&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;은 문자들의 모음이기 때문에 배열처럼 인덱스로 접근할 수 있고, &lt;/span&gt;문자열[i]&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;는 i번째 문자 하나를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;정답이 &quot;123&quot;, 입력이 &quot;132&quot;라면&lt;/span&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 78.3801%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;height: 25px; width: 12.5604%;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;height: 25px; width: 22.2222%;&quot;&gt;정답&lt;/td&gt;
&lt;td style=&quot;height: 25px; width: 22.2222%;&quot;&gt;입력&lt;/td&gt;
&lt;td style=&quot;height: 25px; width: 19.9413%;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 12.5604%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 19.9413%;&quot;&gt;스트라이크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f9f9fa; height: 25px;&quot;&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 12.5604%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 19.9413%;&quot;&gt;볼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 12.5604%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 22.2222%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;color: #40414b; height: 25px; width: 19.9413%;&quot;&gt;볼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,2,0&quot;&gt;코드 :&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781576951239&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FString AHWGameModeBase::JudgeResult(const FString&amp;amp; InNumberString, const FString&amp;amp; InGuessNumberString)
{
	int32 StrikeCount = 0;

	for (int32 i = 0; i &amp;lt; 3; ++i)
	{
		if (InNumberString[i] == InGuessNumberString[i])
		{
			StrikeCount++;
		}
	}
	return FString();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[개념] TSet &amp;lt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 중복을 허용 하지않는 주머니&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt; 같은 값이 여러 번 들어오면 안 되는 상황&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;에서 사용&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;FString Input = TEXT(&quot;112&quot;);

TSet&amp;lt;TCHAR&amp;gt; UniqueDigits;

for (TCHAR C : Input)
{
    UniqueDigits.Add(C);
}

if (UniqueDigits.Num() != Input.Len())
{
    UE_LOG(LogTemp, Warning, TEXT(&quot;중복된 문자가 있습니다.&quot;));
}
else
{
    UE_LOG(LogTemp, Log, TEXT(&quot;모든 문자가 서로 다릅니다.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[개념] TCHAR 변수명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt; 문자 하나를 담는 자료형&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt; FString&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 같은 문자열을 한 글자씩 순회하면서 검사하거나 처리할 때 사용&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;코드&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;:&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;FString Input = TEXT(&quot;ABC&quot;);

for (TCHAR C : Input)
{
    UE_LOG(LogTemp, Log, TEXT(&quot;현재 문자: %c&quot;), C);
}&lt;/code&gt;&lt;/pre&gt;
&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수족보] FChar::IsDigit()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;전달받은 문자가 &lt;/span&gt;숫자 문자인지 확인하는 함수 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;문자열 입력값을 검사할 때, 각 문자가 숫자인지 확인(사용자 입력은 보통 문자열로 들어오기 때문에, 입력값이숫자로만 구성되어 있는지 확인할 때 유용하다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;코드&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;:&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;FString Input = TEXT(&quot;12A&quot;);

for (TCHAR C : Input)
{
    if (FChar::IsDigit(C) == false)
    {
        UE_LOG(LogTemp, Warning, TEXT(&quot;숫자가 아닌 문자가 포함되어 있습니다.&quot;));
        break;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] do{...} while(false)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;중간에 조건이 틀리면 break로 빠져나가기 위한 구조&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;많은 조건&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;중 하나라도 실패하면 바로 밖으로 내보내고 싶을 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;do 
{
    ...
} while (false);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보] FString::Printf()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 값을 원하는 형식의 문자열로 만들어주는 함수 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;숫자, 문자, 변수 값을 조합해서 &lt;/span&gt;하나의 FString 문자열로 만들고 싶을 때&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 사용&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;
&lt;div style=&quot;background-color: #f9f9fa; color: #2e2f36; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;int32 StrikeCount = 1;
int32 BallCount = 2;

FString Result = FString::Printf(TEXT(&quot;%dS%dB&quot;), StrikeCount, BallCount);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보] Contains()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 문자열 안에 특정 문자열이 포함되어 있는지 확인하는 함수 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;어떤 문자열 안에 내가 찾는 값이 들어있는지 검사할 때 사용&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;
&lt;pre class=&quot;excel&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;FString SecretNumber = TEXT(&quot;123&quot;);
FString GuessChar = TEXT(&quot;2&quot;);

if (SecretNumber.Contains(GuessChar))
{
    UE_LOG(LogTemp, Log, TEXT(&quot;정답 안에 해당 숫자가 있습니다.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] FString::Len()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt; 문자열에 들어있는 글자 개수를 반환하는 함수 &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;문자열이 몇 글자인지 알아야 할 때 사용&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;FString InChatMessageString = TEXT(&quot;Player0:123&quot;);
int Index = InChatMessageString.Len() - 3;
FString GuessNumberString = InChatMessageString.RightChop(Index);
UE_LOG(LogTemp, Log, TEXT(&quot;GuessNumberString: %s&quot;), *GuessNumberString);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보] RightChop()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 문자열의 왼쪽에서 지정한 개수만큼 잘라내고, 남은 오른쪽 문자열을 반환하는 함수 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;문자열 앞부분은 버리고, &lt;/span&gt;뒤쪽에 있는 필요한 내용만 가져오고 싶을 때&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt; 사용(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&quot;Player: 123&quot;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;123&quot;만 분리할 때)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드: &lt;/b&gt;&lt;/b&gt;FString::Len()함수 코드참고&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/97</guid>
      <comments>https://myview34032.tistory.com/97#entry97comment</comments>
      <pubDate>Tue, 16 Jun 2026 20:03:25 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/15</title>
      <link>https://myview34032.tistory.com/96</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt; [질문] 왜&lt;span&gt;&amp;nbsp;&lt;/span&gt;FText를&lt;span&gt;&amp;nbsp;&lt;/span&gt;FString으로 바꿀까?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;내가 몰랐던 것 (문제):&lt;/b&gt; SetChatMessageString(Text.ToString()); 왜 입력받은 채팅의 Text 매개변수 자료형을 FText에서 FString으로 변경하는걸까?&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0&quot;&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;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&lt;b&gt;FText&lt;/b&gt;는 화면에 보여주기 위한 텍스트에 가깝다.&lt;br /&gt;비유하면 &lt;b&gt;사용자에게 보여주는 문장&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&lt;b&gt;FString&lt;/b&gt;은 C++에서 문자열을 저장하거나 가공하기 쉬운 형태.&lt;br /&gt;비유하면 &lt;b&gt;프로그램 내부&lt;/b&gt;에서 처리하기 좋은 문자열.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;UI 표시용 텍스트를 내부로직으로 돌릴 문자열로 변경하기 위함.(변수에 저장해서 서버에 보내줘야 하기 때문)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781493781934&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UHWUserWidget::OnChatInputTextCommitted(const FText&amp;amp; Text, ETextCommit::Type CommiMethod)
{
	if (CommiMethod == ETextCommit::OnEnter)
	{
		APlayerController* OwningHWPlayerController = GetOwningPlayer();
		if (IsValid(OwningHWPlayerController) == true)
		{
			AHWPlayerController* OwningHWPlayerController = Cast&amp;lt;AHWPlayerController&amp;gt;(OwningHWPlayerController);
			if (IsValid(OwningHWPlayerController) == true)
			{
				OwningHWPlayerController-&amp;gt;SetChatMessageString(Text.ToString());

				EditableTextBox_ChatInput-&amp;gt;SetText(FText());
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&lt;b data-path-to-node=&quot;5,0&quot; data-index-in-node=&quot;0&quot;&gt;[질문] 왜 FString-&amp;gt;&lt;span&gt;FText&lt;/span&gt;으로 바꿀땐 .ToText()가 아닐까?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;5,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;내가 몰랐던 것 (문제):&lt;/b&gt;&lt;span&gt; FString 자료형 변수를 FText 자료형으로 사용하는 매개변수에 넘겨주기 위해 변환을 시도 저번에 FText-&amp;gt; FString 변환시 .ToString() 이라는 함수를 사용했으니 이것도 .ToText()함수로 사용하면 되겠지? -&amp;gt;안됨&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;원인 (이유):&lt;/b&gt;FString&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;은 그냥 &lt;/span&gt;문자열 데이터이지만 FText&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;는 언리얼에서 &lt;/span&gt;UI 표시용 텍스트&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;, &lt;/span&gt;현지화/다국어 처리&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;까지 고려하는 타입 즉, FText범주 안에 FString이 포함되어 있는 것이기 때문에 FString-&amp;gt;FText 더 작은 단위에서 큰 단위로 변환하기 때문&lt;/span&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnx3NU/dJMcagFVJOe/5EDwu6YAqzGUsYGAcQTvb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnx3NU/dJMcagFVJOe/5EDwu6YAqzGUsYGAcQTvb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnx3NU/dJMcagFVJOe/5EDwu6YAqzGUsYGAcQTvb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnx3NU%2FdJMcagFVJOe%2F5EDwu6YAqzGUsYGAcQTvb0%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;262&quot; height=&quot;272&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1781522784183&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AHWPlayerController::PrintChatMessageString(const FString&amp;amp; InChatMessageString)
{
	//UKismetSystemLibrary::PrintString(this, InChatMessageString, true, true, FLinearColor::Red, 10.0f);
	if (IsValid(ChatInputWidgetInstance) == true)
	{
		ChatInputWidgetInstance-&amp;gt;AddChatMessage(FText::FromString(InChatMessageString));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;5,0&quot;&gt;&lt;b data-path-to-node=&quot;5,0&quot; data-index-in-node=&quot;0&quot;&gt;[디버깅] 왜&lt;span&gt; PIE 실행시 오류가 생길까?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;5,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;내가 몰랐던 것 (문제):&lt;/b&gt;&lt;span&gt; 채팅기능을 구현하고 PIE 실행시 ensure 델리게이트 오류 발생&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;5,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;원인 (이유):&lt;/b&gt;AddDynamic&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;으로 동적 델리게이트에 함수를 연결하려 했지만,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;연결 대상 함수(OnChatInputTextCommitted)가 &lt;/span&gt;UFUNCTION()&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;으로 언리얼 리플렉션 시스템에 등록되어 있지 않아서 발생한 오류&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781507292134&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//언리얼 CallStack 창에서 발견한 오류로그

Ensure condition failed: this-&amp;gt;IsBound() [File:F:\UE_5.5\Engine\Source\Runtime\Core\Public\Delegates\DelegateSignatureImpl.inl] [Line: 1147] 
Unable to bind delegate to 'OnChatInputTextCommitted' (function might not be marked as a UFUNCTION or object may be pending kill)

2026.06.15-07.03.37:598][443]LogOutputDevice: Error: Ensure condition failed: this-&amp;gt;IsBound() 
[File:F:\UE_5.5\Engine\Source\Runtime\Core\Public\Delegates\DelegateSignatureImpl.inl] [Line: 1147]&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;[개념] meta / TObjectPtr&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781487201056&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UPROPERTY(meta = (BindWidget))
TObjectPtr&amp;lt;UEditableTextBox&amp;gt; EditableTextBox_ChatInput;&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;meta: 언리얼에게 알려주는 추가 설명서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TObjectPtr: UObject계열 객체를 가리킬 때 사용하는 언리얼식 포인터&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BindWidget:&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;&amp;nbsp;UMG 위젯 이름과 C++ 변수 이름을 맞춰 자동 연결하는 옵션&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;코드 설명: UMG 블루프린트에 있는 EditableTextBox_ChatInput이라는 입력창 위젯을 C++에서 사용할 수 있도록 연결해 둔 변수 선언&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의 할점: UMG에 있는 위젯 이름과 C++ 변수명이 다르면 BindWidget 연결이 안될 수 있다.&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;[개념] TSubclassOf&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781488557824&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UPROPERTY(EditDefaultsOnly)
TSubclassOf&amp;lt;UHWUserWidget&amp;gt; ChatInputWidgetClass;

UPROPERTY()
TObjectPtr&amp;lt;UHWUserWidget&amp;gt; ChatInputWidgetInstance;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSubclassOf: 특정 부모 클래스를 상속한 클래스만 담을 수 있게 제한하는 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이 코드에선 UHWUserWidget 클래스로 제한)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;코드 설명: &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;1.&amp;nbsp;어떤&amp;nbsp;위젯을&amp;nbsp;만들지&amp;nbsp;정한다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr; ChatInputWidgetClass&lt;br /&gt;2.&amp;nbsp;실행&amp;nbsp;중에&amp;nbsp;그&amp;nbsp;클래스로&amp;nbsp;실제&amp;nbsp;위젯을&amp;nbsp;만든다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr; ChatInputWidgetInstance&lt;br /&gt;3.&amp;nbsp;만든&amp;nbsp;위젯을&amp;nbsp;화면에&amp;nbsp;추가하거나&amp;nbsp;조작한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;ChatInputWidgetClass 생성할 UI의 설계도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatInputWidgetInstance 설계도로 생성된 UI객체&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;[개념] &quot;UMG&quot;, &quot;Slate&quot;, &quot;SlateCore&quot; 모듈 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781489650242&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//프로젝트명.Build.cs

PublicDependencyModuleNames.AddRange(new string[] 
{ 
	// Initial Dependencies
	&quot;Core&quot;, &quot;CoreUObject&quot;, &quot;Engine&quot;, &quot;InputCore&quot;, &quot;EnhancedInput&quot;,

	// UI
	&quot;UMG&quot;, &quot;Slate&quot;, &quot;SlateCore&quot;,
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;UMG, Slate, SlateCore는 언리얼 UI 기능을 C++에서 사용하기 위해 Build.cs에 추가하는 UI 관련 모듈&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;주의 할점: UI 관련 클래스 작성시 빌드 에러가 난다면 Build.cs 파일에 모듈이 추가되었는지 확인할 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[개념] Launch Seperate Server 옵션과 Run Under One Process 옵션 &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;764&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1M1PM/dJMcag6Vysy/zO8Qt8o4QKtJDzbKSHpVZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1M1PM/dJMcag6Vysy/zO8Qt8o4QKtJDzbKSHpVZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1M1PM/dJMcag6Vysy/zO8Qt8o4QKtJDzbKSHpVZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1M1PM%2FdJMcag6Vysy%2FzO8Qt8o4QKtJDzbKSHpVZK%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;764&quot; height=&quot;555&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Launch Seperate Server:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true: 독립된 서버 프로세스가 실행.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;false: 언리얼 에디터 프로세스가 서버이자 클라.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run Under One Process:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true: 언리얼 에디터 프로세스 내에서 서버와 클라가 동작. (디버깅할 때 사용)&lt;/li&gt;
&lt;li&gt;false: 서버와 각 클라들이 다른 프로세스로 분기됩니다. (개발할 때 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데디케이티드 서버 기반 개발시&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디버깅 시에는 &amp;ldquo;Launch Seperate Server == false &amp;amp;&amp;amp; Run Under One Process == true&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;릴리즈 검증 시에는 &amp;ldquo;Launch Seperate Server == true &amp;amp;&amp;amp; Run Under One Process == false&amp;rdquo;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] NativeConstruct() / NativeDestruct()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;채팅 입력 위젯이 살아있는 동안만 입력 확정 이벤트와 처리 함수를 연결하고, 위젯이 사라질 때 연결을 해제하는 코드&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;코드설명:&lt;/b&gt;&lt;span&gt;&lt;br /&gt;NativeConstruct: &lt;br /&gt;-&amp;nbsp;위젯이&amp;nbsp;생성되어&amp;nbsp;사용할&amp;nbsp;준비가&amp;nbsp;되었을&amp;nbsp;때&amp;nbsp;호출된다. &lt;br /&gt;-&amp;nbsp;입력창의&amp;nbsp;OnTextCommitted&amp;nbsp;이벤트에&amp;nbsp;처리&amp;nbsp;함수를&amp;nbsp;등록한다. &lt;br /&gt;&lt;br /&gt;NativeDestruct: &lt;br /&gt;-&amp;nbsp;위젯이&amp;nbsp;제거되거나&amp;nbsp;정리될&amp;nbsp;때&amp;nbsp;호출된다. &lt;br /&gt;-&amp;nbsp;등록했던&amp;nbsp;이벤트&amp;nbsp;함수를&amp;nbsp;해제한다. &lt;br /&gt;&lt;br /&gt;OnTextCommitted: &lt;br /&gt;-&amp;nbsp;텍스트&amp;nbsp;입력이&amp;nbsp;확정되었을&amp;nbsp;때&amp;nbsp;발생하는&amp;nbsp;이벤트이다. &lt;br /&gt;&lt;br /&gt;AddDynamic: &lt;br /&gt;-&amp;nbsp;이벤트가&amp;nbsp;발생했을&amp;nbsp;때&amp;nbsp;실행할&amp;nbsp;함수를&amp;nbsp;등록한다. &lt;br /&gt;&lt;br /&gt;RemoveDynamic: &lt;br /&gt;-&amp;nbsp;등록했던&amp;nbsp;함수를&amp;nbsp;이벤트에서&amp;nbsp;제거한다. &lt;br /&gt;&lt;br /&gt;IsAlreadyBound: &lt;br /&gt;-&amp;nbsp;같은&amp;nbsp;함수가&amp;nbsp;이미&amp;nbsp;이벤트에&amp;nbsp;연결되어&amp;nbsp;있는지&amp;nbsp;확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781493170437&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UHWUserWidget::NativeConstruct()
{
	Super::NativeConstruct();

	if (EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.IsAlreadyBound(this, &amp;amp;ThisClass::OnChatInputTextCommitted) == false)
	{
		EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.AddDynamic(this, &amp;amp;ThisClass::OnChatInputTextCommitted);
	}
}

void UHWUserWidget::NativeDestruct()
{
	Super::NativeDestruct();

	if (EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.IsAlreadyBound(this, &amp;amp;ThisClass::OnChatInputTextCommitted) == true)
	{
		EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.RemoveDynamic(this, &amp;amp;ThisClass::OnChatInputTextCommitted);
	}
}&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; data-path-to-node=&quot;9,0&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] PublicIncludePaths.AddRange(new&amp;nbsp;string[]&amp;nbsp;{&amp;nbsp;&quot;Homework9&quot;&amp;nbsp;});&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;9,1&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,0,0&quot; data-index-in-node=&quot;0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;새로운 C++클래스의 Path 지정 생성시 경로오류를 해결해주기 위한 함수&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;새로운 C++클래스의&amp;nbsp; Path 지정 생성할 때 build.cs 파일에 한번만 작성해주면 됨&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781494127169&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;//프로젝트명.Build.cs

PublicIncludePaths.AddRange(new string[] { &quot;프로젝트명&quot; });&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보] GetOwningPlayer()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 이 객체와 연결된 플레이어 컨트롤러를 찾아오는 역할 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781508129360&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;APlayerController* OwningPlayerController = GetOwningPlayer();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보] TActorIterator &amp;lt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; &lt;b&gt;월드 안의 특정 Actor들을 하나씩 찾아보는 반복 도구&lt;/b&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;&lt;span&gt; 월드 속의 특정 클래스의 Actor만 찾고 싶을 때 (ex: PlayerController)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781513792118&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (TActorIterator&amp;lt;AHWPlayerController&amp;gt; It(GetWorld()); It; ++It)
{
     AHWPlayerController* HWPlayerController = *It;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;[기능구현] 채팅내역남기기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;PlayerController
&amp;rarr; 메시지를 받음
&amp;rarr; ChatInputWidgetInstance-&amp;gt;AddChatMessage(메시지)

UHWUserWidget::AddChatMessage
&amp;rarr; TextBlock 생성
&amp;rarr; 메시지 설정
&amp;rarr; ScrollBox에 추가&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;erlang&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;채팅 내역은 ScrollBox에 TextBlock을 동적으로 추가하는 방식으로 구현했다.
PlayerController의 FString 메시지는 FText::FromString()으로 변환해서 UI 함수에 전달한다.
메시지 추가 후 ScrollToEnd()를 호출해 최신 메시지가 자동으로 보이게 했다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;isbl&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;FText::FromString()
NewObject&amp;lt;UTextBlock&amp;gt;()
ScrollBox-&amp;gt;ScrollToEnd()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/96</guid>
      <comments>https://myview34032.tistory.com/96#entry96comment</comments>
      <pubDate>Mon, 15 Jun 2026 21:57:56 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/12</title>
      <link>https://myview34032.tistory.com/92</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TIL 쓰기전 항상 명심 할 것&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt; [26-06-12] 멀티플레이 이름표 실종 디버깅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;문제상황:&lt;/b&gt; 채팅을 쳤는데 클라이언트 화면에 유저 이름표(Player0: )가 안 나오고 채팅 내용만 뜸.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0&quot;&gt;원인 (이유):&lt;/b&gt; PlayerNameString 변수에 UPROPERTY(Replicated)가 없어서 서버가 지어준 이름이 클라이언트로 배달되지 않았음&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,2,0&quot;&gt;해결 방법:&lt;/b&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중단점 걸고 디버깅하여 CXPlayerController.cpp 의 SetChatMessageString 함수속에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;PlayerNameString 변수값이 제대로 전달 되지 않는 것을 확인&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;CXPlayerState.h ➡️ 변수 위에 UPROPERTY(Replicated) 붙이기&lt;/li&gt;
&lt;li&gt;CXPlayerState .cpp ➡️ GetLifetimeReplicatedProps 함수 안에 DOREPLIFETIME(클래스명, 변수명); 등록하기&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-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt; [함수 족보] FString::RightChop()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;한 줄 요약:&lt;/b&gt; 문자열의 앞에서부터 내가 원하는 개수만큼 글자를 잘라내고 남은 부분만 가져오는 함수.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt; Player0: 123 에서 이름표를 떼고 입력한 숫자(123)만 쏙 빼오고 싶을 때.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;코드:&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781259286876&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FString OriginString = TEXT(&quot;Player0: 123&quot;);
FString ResultString = OriginString.RightChop(9); // 앞에서 9칸 자르기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] FString::FromInt() &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;b&gt; 한 줄 요약:&lt;/b&gt;정수(int32) 숫자를 문장(FString)으로 바꿔주는 변환기&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;정수 숫자를 FString 변수에 저장할 때 Append랑 같이 사용되는듯?&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,2,0&quot; data-index-in-node=&quot;0&quot;&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781261680149&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FString BaseMessage = TEXT(&quot;정답은: &quot;);
BaseMessage.Append(FString::FromInt(5));&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보]&lt;/b&gt; &lt;b&gt;Append()&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;b&gt;한 줄 요약:&lt;/b&gt;기존 문장 뒤에 새로운 글자를 이어 붙이는 함수&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;숫자야구에서 정답 숫자를 하나씩 이어 붙여서 세 자리 번호(&quot;1&quot; ➡️ &quot;12&quot; ➡️ &quot;123&quot;)를 완성해 나갈 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드는 FromInt() 보면 됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보] Len() &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;b&gt;한 줄 요약:&lt;/b&gt;문자열의 길이(글자 수)가 총 몇 개인지 숫자로 세어줌.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;채팅창에 너무 긴 글(예: 100글자 이상)을 쓰지 못하도록 글자 수를 제한할 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781262161477&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (ChatMessage.Len() &amp;lt;= 100) { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보]&lt;span&gt;&amp;nbsp;&lt;/span&gt; FMath::RandRange(최소, 최대) &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;b&gt;한 줄 요약:&lt;/b&gt; 지정한 범위 내에서 랜덤한 숫자 하나를 뽑아주는 주사위&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;숫자야구에서 컴퓨터가 중복 없는 정답 번호를 무작위로 정할 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;9,0&quot; data-index-in-node=&quot;0&quot;&gt;[함수 족보]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; RemoveAt() &lt;/span&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;b&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 배열에서 내가 지정한 방 번호의 데이터를 지우고, 뒤의 데이터를 앞으로 당긴다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;9,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;언제 써?:&lt;/b&gt;숫자야구에서 0~9까지 들어있는 주머니에서 한 번 뽑은 숫자를 다신 안 나오게 제거할 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;[함수 족보]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; TSet&amp;lt;TCHAR&amp;gt; 변수명; &lt;/span&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;b&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt; 중복을 절대 허용하지 않는 특수 주머니 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;언제 써?:&lt;/b&gt;유저가 숫자야구에서 &quot;112&quot;처럼 중복된 숫자를 입력했는지 감별하고 싶을 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL(Today I Learned)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/92</guid>
      <comments>https://myview34032.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 12 Jun 2026 19:10:15 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/02</title>
      <link>https://myview34032.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.AI퀴즈(매일 10문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.코드카타(매일 3문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.언리얼 기초 다지기&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AI퀴즈&lt;/b&gt;&lt;/h2&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드카타&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;문제 1: [숫자 비교하기]&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;접근 방식:&lt;/b&gt; 조건문을 사용해서 숫자가 같을 경우와 다를 경우 2가지 케이스로 나누려고 하였다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;핵심 코드: != 같지않다는 의미&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;피드백 &amp;amp; 최적화:&lt;/b&gt;&amp;nbsp;생략&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780359236072&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int solution(int num1, int num2) {
    int answer = 0;
    
    if(0&amp;lt;=num1&amp;amp;&amp;amp;num1&amp;lt;=10000 &amp;amp;&amp;amp; 0&amp;lt;=num2&amp;amp;&amp;amp;num2&amp;lt;=10000)
    {
        if(num1==num2)
        {
            answer = 1;
        }
        if(num1 != num2)
        {
            answer = -1;
        }
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;문제 2: [두 수의 합 구하기]&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0,0&quot;&gt;접근 방식:리턴값에 num1과 num2값을 +기호를 사용해 더하여 저장해 줬다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0&quot;&gt;핵심 코드:+ 기호&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;피드백 &amp;amp; 최적화:&lt;/b&gt;&amp;nbsp;생략&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780359295981&quot; class=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int solution(int num1, int num2) {
    int answer = 0;
    
    if(-50000&amp;lt;=num1&amp;amp;&amp;amp;num1&amp;lt;=50000 &amp;amp;&amp;amp; -50000&amp;lt;=num2&amp;amp;&amp;amp;num2&amp;lt;=50000)
    {
        answer = num1 + num2;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;문제 3: [두 수의 나눗셈]&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;21&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;21,0,0&quot; data-index-in-node=&quot;0&quot;&gt;접근 방식:num1과 num2를 나눠서 1000을 곱하고 answer변수에 저장하자. 단, 변수가 모두 정수타입이기 때문에 나눈 값이 0.5 같은 실수로 나오게 되면 0으로 처리되니 계산할 때 잠깐 변수하나를 형변환 시켜주었다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;21,1,0&quot; data-index-in-node=&quot;0&quot;&gt;핵심 코드:(double)num1&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;21,1,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b data-path-to-node=&quot;19,0,0&quot; data-index-in-node=&quot;0&quot;&gt;피드백 &amp;amp; 최적화:&lt;/b&gt;&lt;span&gt; 형변환 하지 않고 그냥 1000*num1/num2 로 진행하면 깔끔해진다. 나누기를 하기 전에 1000을 먼저 곱해서 소수점 아래로 내려갈 숫자들이 미리 정수 자리(일의 자리 이상)로 올라오게끔했기 때문.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780359298370&quot; class=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int solution(int num1, int num2) {
    int answer = 0;
    
    if(0&amp;lt;num1&amp;amp;&amp;amp;num1&amp;lt;=100 &amp;amp;&amp;amp; 0&amp;lt;num2&amp;amp;&amp;amp;num2&amp;lt;=100)
    {
        answer = ((double)num1/num2)*1000 ;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;언리얼 기초 다지기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;어제 배운 내용 복습 시퀀스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;어제 한 코드 다 지우고 한글 주석만 보고 구현하기&lt;/li&gt;
&lt;li&gt;1분 동안 생각해보고 모르면 바로 정답코드 보기&lt;/li&gt;
&lt;li&gt;잘 몰랐던&amp;nbsp; 부분 메모 해두기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void&amp;nbsp;OnChatInputTextCommitted(const&amp;nbsp;FText&amp;amp;&amp;nbsp;Text,&amp;nbsp;ETextCommit::Type&amp;nbsp;CommitMethod);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이 함수에 리플렉션 매크로( UFUNCTION() ) 을 꼭 달아 줘야 될까?&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;언리얼의 AddDynamic(동적 바인딩)을 사용해 이벤트와 내 함수를 연결하려면, 언리얼 엔진이 내 함수의 이름을 인식할 수 있어야 하므로 UFUNCTION()을 달아줘야 한다.&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;h3 data-path-to-node=&quot;30&quot; data-ke-size=&quot;size23&quot;&gt;오늘 배운 핵심 이론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,0,0&quot;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Peer-to-Peer &lt;br /&gt;모든&amp;nbsp;사람이&amp;nbsp;서버이자&amp;nbsp;클라이언트&amp;nbsp; &lt;br /&gt;다크소울, 토렌트&lt;/li&gt;
&lt;li&gt;Listen &lt;br /&gt;클라이언트이자&amp;nbsp;서버인&amp;nbsp;방장이&amp;nbsp;있고&amp;nbsp; &lt;br /&gt;나머지&amp;nbsp;참가자는&amp;nbsp;모두&amp;nbsp;클라이언트&amp;nbsp; &lt;br /&gt;마크,어몽어스&lt;/li&gt;
&lt;li&gt;Dedicated&amp;nbsp; &lt;br /&gt;서버&amp;nbsp;담당자가&amp;nbsp;있고&amp;nbsp; &lt;br /&gt;나머지는&amp;nbsp;모두&amp;nbsp;클라이언트 &lt;br /&gt;배틀그라운드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가&amp;nbsp;배울건&amp;nbsp;데디케이티트&amp;nbsp;서버 &lt;br /&gt;&lt;br /&gt;데디케이티드&amp;nbsp;서버의&amp;nbsp;구조&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;PIE 또는 Server.exe 실행하여 서버 프로세스 실행&lt;/li&gt;
&lt;li&gt;서버안에 Level, GameMode, GameState 생성&lt;/li&gt;
&lt;li&gt;다른 PC가 접속할 수 있게 Socket이 생성됨&amp;nbsp;&lt;/li&gt;
&lt;li&gt;다른 PC사용자가 서버의IP주소와 포트번호로 접속을 시도 &lt;br /&gt;&amp;nbsp;&amp;nbsp;서버는&amp;nbsp;접속&amp;nbsp;시도&amp;nbsp;클라이언트에게&amp;nbsp;Level정보를&amp;nbsp;준다.&lt;/li&gt;
&lt;li&gt;클라이언트가 Level여는데 성공하면 서버에게 다시 알림&lt;/li&gt;
&lt;li&gt;성공알림을 받은 서버는 Level을 여는데 성공한 클라이언트의 전용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;PlayerState,&amp;nbsp;PlayerController,PlayerCharacter&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;생성하고&amp;nbsp;클라이언트에게&amp;nbsp;복사해준다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;이때&amp;nbsp;GameState도&amp;nbsp;복사해줌.&lt;/li&gt;
&lt;li&gt;다른 클라이언트가 접속했다면 위 과정을 반복.&lt;/li&gt;
&lt;li&gt;단 접속한 클라이언트의 각자의 PlayerController정보는 복사되지않는다.&lt;/li&gt;
&lt;li&gt;서버-클라이언트 구조의 아주 중요한 특징 &lt;br /&gt;-&amp;nbsp;그림에서&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있듯,&amp;nbsp;클라이언트와&amp;nbsp;클라이언트&amp;nbsp;간의&amp;nbsp;통신이&amp;nbsp;불가능합니다. &lt;br /&gt;-&amp;nbsp;오직&amp;nbsp;서버와&amp;nbsp;클라이언트&amp;nbsp;사이의&amp;nbsp;통신만&amp;nbsp;가능합니다. &lt;br /&gt;- 이것이 앞으로 배울 RPC나 프로퍼티 레플리케이션에도 영향을 끼칩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zqxI2/dJMcaiwLTtG/hJ6UBJNFYaSdkWs9brpDAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zqxI2/dJMcaiwLTtG/hJ6UBJNFYaSdkWs9brpDAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zqxI2/dJMcaiwLTtG/hJ6UBJNFYaSdkWs9brpDAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzqxI2%2FdJMcaiwLTtG%2FhJ6UBJNFYaSdkWs9brpDAK%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;1115&quot; height=&quot;623&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;1. NetMode&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;이 게임 프로세스가 지금 어떤 역할(상태)인가?&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;핵심 구분:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;Standalone:&lt;/b&gt;싱글 플레이.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,1,0&quot;&gt;Dedicated Server:&lt;/b&gt;연산과 규칙 판정만 하는 서버&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,2,0&quot;&gt;Listen Server:&lt;/b&gt;플레이어가 직접 게임을 플레이하면서 동시에 서버 역할(방장)까지 겸함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,3,0&quot;&gt;Client:&lt;/b&gt;서버가 만든 방에 접속해서 조작만 하는 일반 참가자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. NetMode의 필요성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;서버와 클라이언트가 똑같은 코드를 같이 실행하기 때문&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;이유:&lt;/b&gt;멀티 게임에서는 서버 컴퓨터에도 내 캐릭터가 있고, 내 PC에도 캐릭터가 있습니다. 이 코드가 서버에서 도는 건지, 클라이언트에서 도는 건지를 구분해서 서로 다른 처리를 해주기 위해.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;3. NetDriver (잘 모르겠음)&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;4. NetConnection&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;한 줄 요약:&lt;/b&gt;손님(클라이언트)과 요리사를 1:1로 매칭해주는 식당 주문번호 영수증&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;역할:&lt;/b&gt;&lt;span data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt; 클라이언트와 서버와&lt;/span&gt;&amp;nbsp;연결 고리&lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;11,1,0&quot;&gt;.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,1,0,0&quot;&gt;ServerConnection:&lt;/b&gt; 클라이언트가 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;11,1,1,0,0&quot;&gt;서버를 바라보는&lt;/b&gt; 단 하나의 영수증.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,1,1,0&quot;&gt;ClientConnection:&lt;/b&gt; 서버가 접속한 &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;11,1,1,1,0&quot;&gt;각각의 클라이언트들을 바라보는&lt;/b&gt; 영수증.(클라이언트 수만큼 생김)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJdJp/dJMcagyWwsr/OJgI1eO8f6jWQPt8Ng13mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJdJp/dJMcagyWwsr/OJgI1eO8f6jWQPt8Ng13mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJdJp/dJMcagyWwsr/OJgI1eO8f6jWQPt8Ng13mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJdJp%2FdJMcagyWwsr%2FOJgI1eO8f6jWQPt8Ng13mK%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;1293&quot; height=&quot;1042&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;5. Ownership(잘 모르겠음)&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;6. 디버깅용 로그(잘 모르겠음)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;개념:&lt;/b&gt;현재 실행 중인 주체가 Client인지 DedicatedServer인지 코드로 판별하는 작업.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;목적:&lt;/b&gt;공격을 했는데 데미지가 안 들어갈 때, 이 로그를 찍어서 서버로 패킷이 안 갔는지 확인하는 &lt;b data-index-in-node=&quot;79&quot; data-path-to-node=&quot;19,1,0&quot;&gt;디버깅용 코드&lt;/b&gt;. &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,0,1,1,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,0,1,1,0&quot;&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;클라이언트와&amp;nbsp;클라이언트&amp;nbsp;간의&amp;nbsp;통신이&amp;nbsp;불가능&lt;/li&gt;
&lt;li&gt;GameMode는 오직 서버만 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;NetDriver/Ownership/디버깅용 로그 내일 꼭 다시 확인하기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>TDL(To_Day_List)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/90</guid>
      <comments>https://myview34032.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 2 Jun 2026 20:56:14 +0900</pubDate>
    </item>
    <item>
      <title>2026/06/01</title>
      <link>https://myview34032.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.코드카타&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.AI퀴즈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.언리얼 기초 다지기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.기획 수업&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드카타(하루 3문제씩)&lt;/b&gt;&lt;/h2&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;pre id=&quot;code_1780275391561&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int solution(int age) 
{
    int answer = 0;

    if(0&amp;lt;age &amp;amp;&amp;amp; age&amp;lt;=120)
    {
        answer = 2023 - age;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AI퀴즈&lt;/b&gt;&lt;/h2&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;span style=&quot;background-color: #f9f9fa; color: #2e2f36; text-align: start;&quot;&gt;문제1:다음 코드는 Tick 함수를 사용하여 액터를 회전시키는 코드입니다. 빈칸에 들어갈 &lt;/span&gt;&lt;b&gt;올바른&lt;/b&gt;&lt;span style=&quot;background-color: #f9f9fa; color: #2e2f36; text-align: start;&quot;&gt; 코드는 무엇인가요?&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780273057697&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    
    FRotator NewRotation = GetActorRotation();
    NewRotation.Yaw += 90.0f * DeltaTime;
    ____________________;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정답: A - SetActorRotation(NewRotation);&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 고른답: &lt;span style=&quot;background-color: #fff7fc; color: #2e2f36; text-align: start;&quot;&gt;AddActorRotation(NewRotation);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오답노트: &lt;b&gt;SetActorRotation() vs &lt;span style=&quot;background-color: #fff7fc; color: #2e2f36; text-align: start;&quot;&gt;AddActorRotation()&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SetActorRotation()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle; color: #2e2f36; text-align: start;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;액터의 회전을&lt;span&gt;&amp;nbsp;&lt;/span&gt;내가 지정한 회전값으로 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fff7fc; color: #2e2f36; text-align: start;&quot;&gt;AddActorRotation()&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle; color: #2e2f36; text-align: start;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;액터의 현재 회전에&lt;span&gt;&amp;nbsp;&lt;/span&gt;내가 준 회전량을 추가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc; color: #2e2f36; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;SetActorRotation()&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 시계 바늘을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;3시 방향으로 맞추기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #2e2f36; text-align: start;&quot;&gt;AddActorRotation()&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 현재 시계 바늘에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;30도 더 돌리기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;언리얼 기초 다지기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-2강 강의 완&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;size18&quot;&gt;&lt;b&gt;학습하면서 궁금했던 부분&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;의문1:왜&amp;nbsp;채팅UI를&amp;nbsp;플레이어&amp;nbsp;컨트롤러에&amp;nbsp;연결할까?&lt;/span&gt; &lt;br /&gt;1.생명주기:&amp;nbsp;캐릭터가&amp;nbsp;죽을때&amp;nbsp;월드에서&amp;nbsp;사라지는&amp;nbsp;게임이라면&amp;nbsp;캐릭터가&amp;nbsp;죽어도&amp;nbsp; &lt;br /&gt;채팅은&amp;nbsp;유지되어야&amp;nbsp;하기&amp;nbsp;때문. &lt;br /&gt;캐릭터&amp;nbsp;리스폰&amp;nbsp;중에도&amp;nbsp;채팅창이&amp;nbsp;닫히거나&amp;nbsp;기존&amp;nbsp;대화&amp;nbsp;기록이&amp;nbsp;날아가지&amp;nbsp;않게&amp;nbsp;하기&amp;nbsp;위함. &lt;br /&gt;2.입력처리:&amp;nbsp;언리얼에서&amp;nbsp;키보드나&amp;nbsp;마우스의&amp;nbsp;입력을&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;받는&amp;nbsp;곳이 &lt;br /&gt;플레이어&amp;nbsp;컨트롤러다.&amp;nbsp; &lt;br /&gt;채팅중에는&amp;nbsp;캐릭터&amp;nbsp;조작을&amp;nbsp;막고&amp;nbsp;채팅을&amp;nbsp;끄면&amp;nbsp;다시&amp;nbsp;마우스&amp;nbsp;커서 &lt;br /&gt;를&amp;nbsp;숨기는&amp;nbsp;등&amp;nbsp;입력상태&amp;nbsp;제어가&amp;nbsp;용이함. &lt;br /&gt;3.네트워크:채팅을&amp;nbsp;칠&amp;nbsp;때&amp;nbsp;구조&amp;nbsp;(내&amp;nbsp;플레이어&amp;nbsp;컨트롤러-&amp;gt;서버-&amp;gt;다른&amp;nbsp;플레이어의&amp;nbsp;컨트롤러) &lt;br /&gt;이런&amp;nbsp;순서이기&amp;nbsp;때문에&amp;nbsp;서버와&amp;nbsp;통신할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;함. &lt;br /&gt;플레이어&amp;nbsp;컨트롤러&amp;nbsp;클래스는&amp;nbsp;서버와&amp;nbsp;통신할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;대표적인&amp;nbsp;클래스. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;의문2:왜 채팅UI를 플레이어 컨트롤러에 연결할 때 헤더에 변수가 2개필요할까? &lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;(Class,&amp;nbsp;Instance)&lt;/span&gt; &lt;br /&gt;어떤&amp;nbsp;UI를&amp;nbsp;만들지&amp;nbsp;고르는&amp;nbsp;용도:ChatInputWidgetClass &lt;br /&gt;메모리에&amp;nbsp;생성된&amp;nbsp;진짜&amp;nbsp;UI:ChatInputWidgetInstance &lt;br /&gt;Class가&amp;nbsp;있어야&amp;nbsp;Instance를&amp;nbsp;찍어낼&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;의문3.왜 OwingCXPlayerController-&amp;gt;SetChatMessageString(Text.ToString()); &lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;에서&amp;nbsp;Text.ToString()&amp;nbsp;이렇게&amp;nbsp;쓸까?&lt;/span&gt; &lt;br /&gt;일단SetChatMessageString()함수에서&amp;nbsp;파라미터가&amp;nbsp;FString이고 &lt;br /&gt;FText와&amp;nbsp;FString은&amp;nbsp;용도가&amp;nbsp;다르기&amp;nbsp;때문인데. &lt;br /&gt;FText:화면에&amp;nbsp;보여주기&amp;nbsp;위한&amp;nbsp;글자상자(UI용) &lt;br /&gt;FString:컴퓨터로&amp;nbsp;조작하기&amp;nbsp;좋은&amp;nbsp;글자상자(기능용) &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;의문4.채팅을 화면에 띄우는 PrintString함수의 파라미터 중 맨 앞에 붙는 WorldContextObject이게&amp;nbsp;뭐지?&lt;/span&gt; &lt;br /&gt;WorldContextObject:&amp;nbsp;&quot;이&amp;nbsp;함수를&amp;nbsp;실행하는&amp;nbsp;기준&amp;nbsp;공간이&amp;nbsp;어디인지&amp;nbsp;알려달라&quot;는&amp;nbsp;뜻 &lt;br /&gt;this를&amp;nbsp;넣는이유:코드&amp;nbsp;작성장소가&amp;nbsp;ACXPlayerController인데&amp;nbsp;이&amp;nbsp;오브젝트가&amp;nbsp;있는&amp;nbsp;월드에&amp;nbsp;생성해&amp;nbsp;달라는&amp;nbsp;의미.&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;size18&quot;&gt;&lt;b&gt;이해 잘 안되는 부분&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780308923649&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UCXChatInput::NativeConstruct()
{
	Super::NativeConstruct();

	if (EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.IsAlreadyBound(this, &amp;amp;ThisClass::OnChatInputTextCommitted) == false)
	{
		EditableTextBox_ChatInput-&amp;gt;OnTextCommitted.AddDynamic(this, &amp;amp;ThisClass::OnChatInputTextCommitted);
	}
}

void U현재클래스이름::NativeConstruct()
{
	Super::NativeConstruct();

	// 1. 연결하기 (방어막 버전)
	if (내컴포넌트이름-&amp;gt;이벤트이름.IsAlreadyBound(this, &amp;amp;ThisClass::내함수이름) == false)
	{
		내컴포넌트이름-&amp;gt;이벤트이름.AddDynamic(this, &amp;amp;ThisClass::내함수이름);		
	}	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780310790201&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void UCXChatInput::OnChatInputTextCommitted(const FText&amp;amp; Text, ETextCommit::Type CommitMethod)
{
	if (CommitMethod == ETextCommit::OnEnter)
	{
		APlayerController* OwingPlayerController = GetOwningPlayer();
		if (IsValid(OwingPlayerController) == true)
		{
			ACXPlayerController* OwingCXPlayerController = Cast&amp;lt;ACXPlayerController&amp;gt;(OwingPlayerController);
			if (IsValid(OwingCXPlayerController) == true)
			{
				OwingCXPlayerController-&amp;gt;SetChatMessageString(Text.ToString());

				EditableTextBox_ChatInput-&amp;gt;SetText(FText());
			}
		}
	}
}
// 1.&quot;유저가 그냥 마우스를 딴 데 클릭한 게 아니라, 진짜로 'Enter' 키를 눌러서 글을 보낸 게 맞나?&quot; 확인하는 조건문
// 2.이 UI를 소유하고 있는 진짜 유저(플레이어 컨트롤러)를 찾아옵니다. (기본형 리모컨)
// 3.중요(Cast): &quot;가져온 리모컨이 우리가 만든 커스텀 리모컨(ACXPlayerController)이 맞는지&quot; 확인하고 형변환합니다.
// 4.유저 리모컨에게 &quot;방금 입력받은 글자(Text)를 문자열로 바꿔서 전송해줘!&quot; 라고 명령을 내립니다.
// 5.전송이 끝났으니 내가 타이핑했던 입력창의 글자들을 다시 깨끗하게 빈 칸(FText())으로 비워줍니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기획수업- 전투 시스템 설계 이론 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기획자가&amp;nbsp;타인과&amp;nbsp;소통할&amp;nbsp;때&amp;nbsp;태도를&amp;nbsp;참고하기&amp;nbsp;좋은&amp;nbsp;책&amp;nbsp;3권 &lt;br /&gt;1.언어의&amp;nbsp;온도 &lt;br /&gt;2.자존감&amp;nbsp;수업 &lt;br /&gt;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;&lt;b&gt;R&amp;amp;R&amp;nbsp;나누기&amp;nbsp;(책임과&amp;nbsp;역할을&amp;nbsp;밸런스있게)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음&amp;nbsp;팀플&amp;nbsp;때&amp;nbsp;시도해보기 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;회의&amp;nbsp;규칙&amp;nbsp;정하기&amp;nbsp;&amp;mdash;&amp;nbsp;&quot;의견을&amp;nbsp;낼&amp;nbsp;땐&amp;nbsp;근거도&amp;nbsp;같이&amp;nbsp;/&amp;nbsp;지금은&amp;nbsp;결정할&amp;nbsp;시간인가&amp;nbsp;수렴할&amp;nbsp;시간인가&amp;nbsp;구분하기&quot;를&amp;nbsp;회의&amp;nbsp;첫머리에&amp;nbsp;합의 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;읽히는&amp;nbsp;기획서&amp;nbsp;쓰기&amp;nbsp;&amp;mdash;&amp;nbsp;핵심을&amp;nbsp;맨&amp;nbsp;앞에,&amp;nbsp;한&amp;nbsp;장&amp;nbsp;요약을&amp;nbsp;먼저.&amp;nbsp;팀원이&amp;nbsp;안&amp;nbsp;읽는다는&amp;nbsp;전제로&amp;nbsp;작성 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;기획&amp;nbsp;동결(freeze)&amp;nbsp;시점&amp;nbsp;정하기&amp;nbsp;&amp;mdash;&amp;nbsp;&quot;이&amp;nbsp;시점&amp;nbsp;이후엔&amp;nbsp;핵심&amp;nbsp;기획을&amp;nbsp;바꾸지&amp;nbsp;않는다&quot;를&amp;nbsp;킥오프에서&amp;nbsp;합의해,&amp;nbsp;선기획&amp;nbsp;후개발을&amp;nbsp;강제 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;역할&amp;middot;스코프&amp;nbsp;합의&amp;nbsp;양식&amp;nbsp;쓰기&amp;nbsp;&amp;mdash;&amp;nbsp;누가&amp;nbsp;무엇을&amp;nbsp;언제까지,&amp;nbsp;구현&amp;nbsp;가능&amp;nbsp;여부를&amp;nbsp;확답으로&amp;nbsp;적어두기 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;AI&amp;nbsp;활용의&amp;nbsp;내&amp;nbsp;기준&amp;nbsp;정하기&amp;nbsp;&amp;mdash;&amp;nbsp;어디까지&amp;nbsp;AI에&amp;nbsp;맡기고&amp;nbsp;어디부터&amp;nbsp;내가&amp;nbsp;할지&amp;nbsp;스스로&amp;nbsp;선&amp;nbsp;긋기 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;온라인&amp;nbsp;협업&amp;nbsp;방식&amp;nbsp;설계하기&amp;nbsp;&amp;mdash;&amp;nbsp;Zep&amp;nbsp;외&amp;nbsp;비동기&amp;nbsp;협업&amp;nbsp;툴과&amp;nbsp;문서&amp;nbsp;동기화&amp;nbsp;방법을&amp;nbsp;팀&amp;nbsp;차원에서&amp;nbsp;미리&amp;nbsp;정하기 &lt;br /&gt;[&amp;nbsp;]&amp;nbsp;잘&amp;nbsp;만든&amp;nbsp;게임의&amp;nbsp;기획&amp;nbsp;뜯어보기&amp;nbsp;&amp;mdash;&amp;nbsp;좋아하는&amp;nbsp;게임을&amp;nbsp;역기획해보며&amp;nbsp;기획&amp;nbsp;안목과&amp;nbsp;자신감&amp;nbsp;기르기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수업 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재미있는 전투의 3가지 조건(판단의 여지/성장감/즉각적 반응)을 설명할 수 있다.&lt;/li&gt;
&lt;li&gt;히트박스, 허트박스, 공격 3단계(스타트업/활성/후딜레이)의 의미를 이해한다.&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;콤보 시스템의 3가지 구조(버튼 시퀀스/자동 이어지기/스킬 연계)와 설계 원칙(캔슬&amp;middot;감쇠)을 이해한다.&lt;/li&gt;
&lt;li&gt;무적 프레임(I-Frame)의 원리와 가드&amp;middot;패링 시스템의 리스크-리워드 구조를 설명할 수 있다.&lt;/li&gt;
&lt;li&gt;전투 리소스(마나/스태미나/게이지) 유형과 설계 원칙 5가지를 구분할 수 있다.&lt;/li&gt;
&lt;li&gt;난이도 스케일링의 4가지 방법을 이해하고 적절한 방법을 선택할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;재미있는 전투의 3가지 조건 &lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 20.1163%; height: 21px;&quot;&gt;판단의 여지&lt;/td&gt;
&lt;td style=&quot;width: 79.8837%; height: 21px;&quot;&gt;&lt;span&gt;버튼만 누르는 기계로 만들지 말고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;전투 중에 계속 '고민하고 선택하게' 만드는 것.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 20.1163%; height: 21px;&quot;&gt;성장감&lt;/td&gt;
&lt;td style=&quot;width: 79.8837%; height: 21px;&quot;&gt;처음보다 지금의 내가 확실히 강해졌고, 전투가 수월해졌다는 느낌을 주는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 20.1163%; height: 21px;&quot;&gt;즉각적 피드백&lt;/td&gt;
&lt;td style=&quot;width: 79.8837%; height: 21px;&quot;&gt;&amp;nbsp;타격감의 본질&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;span style=&quot;background-color: #fdfcfc; color: #1f1f1f; text-align: start;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0&quot;&gt;전투 시스템: 재미있는 전투의 조건 '판단의 여지'&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfcfc; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;18,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,1,0&quot;&gt;행동심리학적 이유:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,1,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람은 남이 시켜서 하는 것보다 &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;18,1,1,1,0,0&quot;&gt;'내가 직접 상황을 판단하고 결정해서 성공했을 때'&lt;/b&gt; 훨씬 더 큰 성취감을 느낀다. (자율성의 원리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,2,0&quot;&gt;실제 게임 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,1,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,2,1,0,0&quot;&gt;예시 1:&lt;/i&gt;&amp;nbsp;원신에서 적이 강력한 광역기를 쓰려고 바닥에 장판을 깔았을 때, [대시로 범위를 벗어날 것인가] vs [무적 판정이 있는 스킬로 맞받아칠 것인가] 선택하는 순간.&lt;/li&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,2,1,1,0&quot;&gt;예시 2:&lt;/i&gt; 붕괴스타레일에서 적의 속성 보호막을 보고, 내가 가진 캐릭터 중 어떤 속성으로 카운터를 칠지 덱을 고민하는 순간.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,3,0&quot;&gt;기획자로서의 생각:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,1,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저에게 판단을 유도하려면 먼저 적이 뭘 할지 '힌트(전조 동작)'를 줘야 한다. 힌트도 안 주고 알아서 맞추라는 건 판단이 아니라 불합리한 찍기다. 유저가 '내 실력으로 이겼다!'고 느끼게 판을 깔아주자.&lt;/li&gt;
&lt;li&gt;다크 소울류 게임들의 보스가 플레이어 캐릭터보다 큰 이유는 보스의 행동패턴을 잘 보이게 하여 힌트를 확실하게 주는 의미도 있다고 생각한다. 또한 보스를 마주하기 전의 그 맵의 잡몹과 엘리트 몬스터들을 통해 보스가 어떤 행동패턴을 사용할지 미리 플레이어에게 학습시키는 것도 하나의 힌트라고 생각된다.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b data-path-to-node=&quot;18,0&quot; data-index-in-node=&quot;0&quot;&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;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,0&quot;&gt;핵심 구분 (성장감의 두 가지 루트):&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;17,1,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,1,0,0&quot;&gt;플레이어의 성장 (컨트롤/패턴 숙지):&lt;/b&gt; 다크소울처럼 유저가 30번 죽어가며 보스 패턴을 다 외워 피지컬로 깨는 맛.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,1,1,0&quot;&gt;캐릭터/시스템의 성장 (스펙/도구):&lt;/b&gt; 일반적인 RPG나 오픈월드 게임처럼 레벨업, 장비 세팅, 카운터 캐릭터 조합을 통해 옛날엔 고전했던 정예 몹을 3초 만에 녹여버리는 맛.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,2,0&quot;&gt;실제 게임 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17,1,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원신에서 엔드 컨텐츠인 지맥제압전을 도전할 때 캐릭터 가챠를 통해 카운터 조합을 완성하여 전에는 깰 수 없었던 최고 난이도를 클리어 할 수 있게 되는 성취감&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,3,0&quot;&gt;기획자로서의 생각:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17,1,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성장감을 주려면 반드시 초반의 불리함/답답함과 후반의 유리함/쾌적함의 격차를 의도적으로 설계해야 한다. 바이오 하자드가 이 부분에서만큼은 정말 잘 설계 했다고 생각된다. 엄청난 수의 좀비가 몰려오지만 총알의 수량을 넉넉하게 주지 않고 딱 그 맵의 좀비 수량만큼 처치할 정도로 총알을 맵에 배치 해 놓기 때문에 항상 판단의 순간이 찾아오고 게임 후반부로 갈 수록 의도적으로 더 좋은 성능의 총기류를 해금 해주고 총알도 넉넉하게 배치해뒀다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0&quot;&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;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,1,0&quot;&gt;피드백을 주는 방법들:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;23,1,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,1,1,0,0&quot;&gt;시각:&lt;/b&gt; 화려한 검기 이펙트, 적이 뒤로 넘어지는 모션, 카메라 흔들기, 묵직함을 주는 '역경직(Hit Stop)'.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,1,1,1,0&quot;&gt;청각:&lt;/b&gt; 베기/타격/마법 등 무기 속성에 맞는 찰진 사운드 효과음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,1,1,2,0&quot;&gt;촉각:&lt;/b&gt; 상황에 맞춰 패드가 부르르 떨리는 햅틱피드백.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,1,1,3,0&quot;&gt;UI:&lt;/b&gt; 크리티컬 터졌을 때 엄청 크게 뜨는 빨간색 데미지 숫자.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,2,0&quot;&gt;실제 게임 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23,1,2,1&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,3,0&quot;&gt;기획자로서의 생각:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23,1,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;즉각적인 피드백이 밋밋하면 유저는 전투에서 흥미가 떨어진다. 반대로 피드백만 훌륭해도 게임을 조작하는 맛이 산다. 대표적인 게임으로 파이널판타지16이 있을 것 같은데 엄청나게 화려한 전투 스킬 이펙트와 조작이 어렵지 않은데 플레이어가 엄청 전투를 잘해 보이게 만드는 연출이 많이 들어가 있다. 적의 공격을 타이밍에 맞춰 퍼펙트 회피? 닷지를 하면 굉장히 화려한 이펙트 연출과 묵직한 사운드를 출력하면서 회피 한번에 전투 고수가 된 기분을 느끼게 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;히트박스, 허트박스, 공격 3단계&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;&lt;b&gt;히트박스와 허트박스가 겹쳐지는 순간이 히트 판정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공격 3단계:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;단계 1 : 스타트업 (Startup)
  공격 전 준비 동작 단계
  &amp;rarr; 히트박스가 아직 없음
  &amp;rarr; 길수록 피하기 쉬움 (느린 공격)
  &amp;rarr; 짧을수록 반응이 어려움 (빠른 공격)
  &amp;rarr; 기획서에서 &quot;선딜레이&quot; 또는 &quot;준비 프레임&quot;으로 표기

단계 2 : 활성 프레임 (Active Frame)
  실제 히트박스가 켜지는 구간
  &amp;rarr; 이 구간에 허트박스와 겹치면 데미지 발생
  &amp;rarr; 길수록 맞추기 쉬운 공격

단계 3 : 후딜레이 (Recovery / Endlag)
  공격 후 다음 행동 가능까지의 딜레이
  &amp;rarr; 길면 공격 후 반격에 취약 = 리스크
  &amp;rarr; 짧으면 안전한 공격 = 낮은 데미지로 밸런스 조정 필요
  &amp;rarr; &quot;큰 공격 = 높은 후딜레이 = 높은 데미지&quot; 리스크-리워드 균형
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일부터 다시 작성&lt;/p&gt;</description>
      <category>TDL(To_Day_List)</category>
      <author>BreadMushroom</author>
      <guid isPermaLink="true">https://myview34032.tistory.com/88</guid>
      <comments>https://myview34032.tistory.com/88#entry88comment</comments>
      <pubDate>Mon, 1 Jun 2026 22:44:04 +0900</pubDate>
    </item>
  </channel>
</rss>