TDL(To_Day_List)

2026/06/02

BreadMushroom 2026. 6. 2. 20:56

1.AI퀴즈(매일 10문제)

2.코드카타(매일 3문제)

3.언리얼 기초 다지기


AI퀴즈

진도를 따라잡혀서 모르는 내용밖에 안나왔음.

 


코드카타

문제 1: [숫자 비교하기]

  • 접근 방식: 조건문을 사용해서 숫자가 같을 경우와 다를 경우 2가지 케이스로 나누려고 하였다.
  • 핵심 코드: != 같지않다는 의미
  • 피드백 & 최적화: 생략
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int num1, int num2) {
    int answer = 0;
    
    if(0<=num1&&num1<=10000 && 0<=num2&&num2<=10000)
    {
        if(num1==num2)
        {
            answer = 1;
        }
        if(num1 != num2)
        {
            answer = -1;
        }
    }
    return answer;
}

문제 2: [두 수의 합 구하기]

  • 접근 방식:리턴값에 num1과 num2값을 +기호를 사용해 더하여 저장해 줬다.
  • 핵심 코드:+ 기호
  • 피드백 & 최적화: 생략
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int num1, int num2) {
    int answer = 0;
    
    if(-50000<=num1&&num1<=50000 && -50000<=num2&&num2<=50000)
    {
        answer = num1 + num2;
    }
    return answer;
}

문제 3: [두 수의 나눗셈]

  • 접근 방식:num1과 num2를 나눠서 1000을 곱하고 answer변수에 저장하자. 단, 변수가 모두 정수타입이기 때문에 나눈 값이 0.5 같은 실수로 나오게 되면 0으로 처리되니 계산할 때 잠깐 변수하나를 형변환 시켜주었다.
  • 핵심 코드:(double)num1
  • 피드백 & 최적화: 형변환 하지 않고 그냥 1000*num1/num2 로 진행하면 깔끔해진다. 나누기를 하기 전에 1000을 먼저 곱해서 소수점 아래로 내려갈 숫자들이 미리 정수 자리(일의 자리 이상)로 올라오게끔했기 때문.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int num1, int num2) {
    int answer = 0;
    
    if(0<num1&&num1<=100 && 0<num2&&num2<=100)
    {
        answer = ((double)num1/num2)*1000 ;
    }
    return answer;
}

언리얼 기초 다지기

어제 배운 내용 복습 시퀀스

  1. 어제 한 코드 다 지우고 한글 주석만 보고 구현하기
  2. 1분 동안 생각해보고 모르면 바로 정답코드 보기
  3. 잘 몰랐던  부분 메모 해두기

void OnChatInputTextCommitted(const FText& Text, ETextCommit::Type CommitMethod);

왜 이 함수에 리플렉션 매크로( UFUNCTION() ) 을 꼭 달아 줘야 될까?

 

언리얼의 AddDynamic(동적 바인딩)을 사용해 이벤트와 내 함수를 연결하려면, 언리얼 엔진이 내 함수의 이름을 인식할 수 있어야 하므로 UFUNCTION()을 달아줘야 한다.

 

#언리얼 델리게이트 개념강의 참고하기

오늘 배운 핵심 이론

주제:언리얼 서버 종류와 데디케이티트 서버의 구조

 

서버 종류

  • Peer-to-Peer
    모든 사람이 서버이자 클라이언트 
    다크소울, 토렌트
  • Listen
    클라이언트이자 서버인 방장이 있고 
    나머지 참가자는 모두 클라이언트 
    마크,어몽어스
  • Dedicated 
    서버 담당자가 있고 
    나머지는 모두 클라이언트
    배틀그라운드

우리가 배울건 데디케이티트 서버

데디케이티드 서버의 구조

  1. PIE 또는 Server.exe 실행하여 서버 프로세스 실행
  2. 서버안에 Level, GameMode, GameState 생성
  3. 다른 PC가 접속할 수 있게 Socket이 생성됨 
  4. 다른 PC사용자가 서버의IP주소와 포트번호로 접속을 시도
      서버는 접속 시도 클라이언트에게 Level정보를 준다.
  5. 클라이언트가 Level여는데 성공하면 서버에게 다시 알림
  6. 성공알림을 받은 서버는 Level을 여는데 성공한 클라이언트의 전용
      PlayerState, PlayerController,PlayerCharacter 
      생성하고 클라이언트에게 복사해준다. 
      이때 GameState도 복사해줌.
  7. 다른 클라이언트가 접속했다면 위 과정을 반복.
  8. 단 접속한 클라이언트의 각자의 PlayerController정보는 복사되지않는다.
  9. 서버-클라이언트 구조의 아주 중요한 특징
    - 그림에서 볼 수 있듯, 클라이언트와 클라이언트 간의 통신이 불가능합니다.
    - 오직 서버와 클라이언트 사이의 통신만 가능합니다.
    - 이것이 앞으로 배울 RPC나 프로퍼티 레플리케이션에도 영향을 끼칩니다.

 

1. NetMode 

  • 한 줄 요약:이 게임 프로세스가 지금 어떤 역할(상태)인가?
  • 핵심 구분:
    • Standalone:싱글 플레이.
    • Dedicated Server:연산과 규칙 판정만 하는 서버
    • Listen Server:플레이어가 직접 게임을 플레이하면서 동시에 서버 역할(방장)까지 겸함.
    • Client:서버가 만든 방에 접속해서 조작만 하는 일반 참가자.

2. NetMode의 필요성

  • 한 줄 요약:서버와 클라이언트가 똑같은 코드를 같이 실행하기 때문
  • 이유:멀티 게임에서는 서버 컴퓨터에도 내 캐릭터가 있고, 내 PC에도 캐릭터가 있습니다. 이 코드가 서버에서 도는 건지, 클라이언트에서 도는 건지를 구분해서 서로 다른 처리를 해주기 위해.

3. NetDriver (잘 모르겠음)

4. NetConnection 

  • 한 줄 요약:손님(클라이언트)과 요리사를 1:1로 매칭해주는 식당 주문번호 영수증
  • 역할: 클라이언트와 서버와 연결 고리.
    • ServerConnection: 클라이언트가 서버를 바라보는 단 하나의 영수증.
    • ClientConnection: 서버가 접속한 각각의 클라이언트들을 바라보는 영수증.(클라이언트 수만큼 생김)

5. Ownership(잘 모르겠음)

6. 디버깅용 로그(잘 모르겠음)

  • 개념:현재 실행 중인 주체가 Client인지 DedicatedServer인지 코드로 판별하는 작업.
  • 목적:공격을 했는데 데미지가 안 들어갈 때, 이 로그를 찍어서 서버로 패킷이 안 갔는지 확인하는 디버깅용 코드.

 

학습 내용중 주의할 점:

  • 클라이언트와 클라이언트 간의 통신이 불가능
  • GameMode는 오직 서버만 가짐

NetDriver/Ownership/디버깅용 로그 내일 꼭 다시 확인하기 

'TDL(To_Day_List)' 카테고리의 다른 글

2026/06/01  (0) 2026.06.01
2026/05/19  (0) 2026.05.19
2026/05/15  (0) 2026.05.15
2026/05/14  (0) 2026.05.14
2026/05/13  (0) 2026.05.13