Agenda: 코드카타 (Template 수정, 문제 4개), C 언어 (조건문 & 반복문) 개인공부 C언어 (함수, 1차원 배열, 포인터), Unreal Blueprint 라이브 세션 (적 AI 구현 & 체력 시스템), How to TIL
코드카타 - Template 수정, 문제 4개
- 002.두 수의 차 구하기 | Solved Date: 2026-04-22-Wed | Problem Link
- 003.몫 구하기 | Solved Date: 2026-04-23-Thur | Problem Link
- 004.나이 출력 | Solved Date: 2026-04-23-Thur | Problem Link
- 005.숫자 비교하기 | Solved Date: 2026-04-23-Thur | Problem Link
C 언어 - 조건문 & 반복문
if, if else, else if (if - else if - else), 중첩 if
switch case
- Intentional-Fallthrough: 고의적으로 case 내부에 break 구문을 적지 않은 경우
! 만약 VS Studio에서 경고문으로 ”애플리케이션 제어 정책에서 이 파일을 차단했습니다” 뜨면
- 스마트 앱 컨트롤 가서 끄자
While
새로배운거
- INT_MAX
- INT_MIN
개인공부 C언어 (함수, 1차원 배열, 포인터)
“윤성우의 열혈 C 프로그래밍” 책
- ch9 ~ 12
함수
C언어는 절차지향 언어다.
- 실행 순서가 아주 중요한 언어
- C# 이랑 다르게, C에서는 사용하려는 함수는 다 main 함수 위에 있어야 한다.
- 함수의 정의와 그에 따른 원형의 선언
- main 위에 함수 선언 해두고 아래에 정의하면 괜찮다.
- 지역변수 (Local Variable)
- 자동변수 (Automatic Variable): 지역번수를 가리켜 ‘자동변수’라고도 한다. 선언된 영역을 벗어나면서 자동으로 소멸되기 때문에 붙여진 이름이다.
- 전역변수 (Global Variable)
- 프로그램이 처음부터 종료될 때까지 메모리 공간에 남아있는 변수.
- 전역변수는 기본 0으로 초기화
- !!! 전역변수랑 지역변수 같은 이름 안 쓰도록 주의해야 한다 (컴파일에서 안 잡아줌)
- 만약 전역변수랑 지역변수랑 같은 이름으로 선언되면 해당 지역 내에서는 전역변수가 가리어지고, 지역변수로의 접근이 이루어짐.
- 전역변수 선언은 가급적 제한 왜냐 구조를 복잡하게 만듦.
- 지역변수의 static 선언
- 딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다.
- (원래는 함수 내에 선언된 지역변수는 해당 함수가 반환하면 소멸됨)
- 전역변수와 동일한 시기에 할당되고 소멸된다.
- 그렇기 때문에 프로그램이 실행되는 동안에 계속해서 유지해야 할 변수가 있다면 static 지역변수로 선언하자.
- 레지스터 변수 (register)
- 접근이 가장 빠른 레지스터에 저장 (성능향상에 도움)
- 레지스터는 CPU 내에 존재하는 매우 작은 메모리.
- !!! 내가 선언해도 최종결정은 컴파일러가 내린다.
- 반대로 아무런 선언을 하지 않아도 컴파일러가 판단해서 할당할 수도 있음
- 전역변수는 register 안됨
- 재귀함수 (Recursive Function)
- 꼭 탈출 조건 넣자.
1차원 배열
배열 (Array)
- 배열의 이름을 대상으로 하는 sizeof 연산의 결과로는 ‘바이트 단위의 배열 크기’가 반환된다 sizeof(array)
- 배열의 길이를 계산하고 싶으면 array 랑 들어있는 자료형 나누면 됨 ex: sizeof(array) / sizeof(int or double or float 등등)
- char 배열의 경우 마지막에 null 들어가서 보이는 길이보다 1 더 길다.
- 문자열을 입력받는 배열의 이름 앞에는 & 연산자를 붙이면 안 된다.
- &를 붙이고 떼는 기준
- “sacnf 함수 호출문 구성 시, 데이터를 저장할 변수의 이름 앞에는 & 연산자를 붙여줘야 한다. 그러나 문자열을 입력받는 배열의 이름 앞에는 & 연산자를 붙이지 않는다”
- scanf 함수호출을 통해서 입력받은 문자열의 끝에는 널 문자가 삽입
- C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.
포인터의 이해
포인터 (Pointer): 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수
- ‘포인터’는 ‘변수 형태의 포인터’와 ‘상수 형태의 포인터’를 어우르는 표현이다.
- 대부분은 ‘포인터 변수’를 연상하면 됨.
- C언어에서는 시작번지만을 가지고 위치를 표현한다 (변수의 자료형을 알면 끝이 어디인지는 쉽게 계산이 가능하기 때문에)
- & 연산자는 ‘오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자’이다
int num = 7;
int* pnum; // 포인터변수 선언
pnum = # // num 주소 값을 포인터 변수에 저장
- 포인터 변수의 크기는 시스템에 따라 다르다
- 시스템이 32 비트면 4바이트
- 시스템이 64 비트면 8바이트
C# 에는 없는 처음 보는 변수 이름: register
스스로 질문
??? 지역변수의 static 은 전역변수와 동일한 시기에 할당되고 소멸된다.라고 하는데 그러면 어떻게 직접 메모리에서 날리나? (전역변수도 같은 궁금증)
Unreal Blueprint 라이브 세션 (적 AI 구현 & 체력 시스템)
- 어제 찾은 버그(총알이 물체에 안 맞으면 줄어드는) 내 생각이 맞았음. 하지만 내가 생각한 방법의 해결보다 더 심플하게, 아예 앞쪽으로 노드를 옮겨서, 그냥 발사되면 바로 줄어들게 수정함
적 AI 구현 & 체력 시스템
개미 bp
Collision
- Sphere → 우클릭 → Add Event → Add OnComponentBeginOverlap 선택
- 이 이벤트는 이 Sphere안에 누군가 들어오면 실행되는 이벤트입니다.
- Collision Sphere 만들어서 적용
- 중요! 개미 캡슐> Collision에서
- Collision Preset → Custom으로 변경
- Visibility → Block으로 변경합니다.
- 우리가 linetrace에서 Visibility Channel을 사용해서 캡슐의 Visibility 설정을 Block으로 해야 함
- ? 그중 sphere란 이름의 컴포넌트 만들어서 그건 이름 수정 안 하는데 왜 그런 거지?
AI Move
- On Component Begin Overlap > Cast To BP_FPSCharacter> AI MoveTo
Nav Mesh
- Nav Mesh BoundVolume > 레벨에 배치 후 brush setting에서 크기 설정 해줘야 함 (p 누르면 초록색으로 디버깅화면 볼 수 있음
nav mesh의 자세함 (누락되는 부분) 수정. (숫자가 적을수록 자세해져서 부하가 많이 걸림)
- Detail에서 Nav Mesh Resolution Params 안에 Default를 봅니다
- Cell size는 19.0 → 네비 영역의 크기를 얼마나 디테일하게 할지 정합니다.
- Cell Height 15.0 → 네비 영역 높이입니다. 계단 끊어진 것도 이 값으로 수정 가능합니다.
- Agent Max Step Height는 35.0으로 설정 → AI들이 얼마나 높은 곳을 올라갈 수 있는지 정합니다.
Explotion (give damage to Player)
- +Add 눌러서 컴포넌트 추가 ExplosionSphere
- ExplosionSphere → 우클릭 → Add Event → Add OnComponentBeginOverlap을 선택
- VFX, Sound 추가
- Explosion_Cue 파일을 찾아서 열어줍니다.
- 사운드 큐 타입의 특징은 이렇게 사운드를 편집할 수 있다는 겁니다.
- Sound Cue는 여러 사운드를 노드 그래프로 조합·편집해서 하나의 재생 단위로 만드는 에셋입니다. Blueprint처럼 시각적으로 오디오 로직을 짜는 거라고 생각하면 됩니다!
- 아래에 보면 사운드 실행하면 랜덤 하게 사운드가 들린다는 걸 알 수 있습니다.
- 그리고 Attenuation(감쇠)라는 효과가 있는데 플레이어가 소리의 근원과 멀어지면 소리가 작게 들리는 효과입니다!
- Inner Radius 400: 이 거리 안에서는 최대 볼륨
- Falloff Distance 1800: 이 거리 밖에서는 안 들림
- Explosion Overlap 이벤트 쪽에서 캐릭터로 캐스트 후 성공하면 Apply Damage를 호출해서 캐릭터에게 대미지 25를 주겠습니다.
- AnyDamage이벤트에서는 아래와 같이 현재 체력에서 들어온 대미지를 빼고 최대 체력이랑 나눠서 ProgressBar에 퍼센트를 설정합니다.
- BeginPlay → Move Random 연결해서 개미가 만들어지면 랜덤 하게 움직이도록 만듭니다.
- AI Move To 노드를 사용해서 개미가 자신의 위치에서 1000cm(10m) 안에서 랜덤 한 위치를 선택하고 이동하게 만들어 줍니다. 이동 후 0~3초 랜덤 하게 기다리고 다시 이동합니다.
- 이제 Random 이동도 있고 추격(Chase)도 있는데 둘 다 AI Move To 함수를 사용하다 보니 실행이 꼬일 수 있습니다.
- 이것을 해결하기 위해 IsChasing이라는 변수를 만들고 추격하지 않을 때만 랜덤 이동하도록 만들겠습니다!
BP: 함수 vs 이벤트
- 함수 = 값을 돌려받을 수 있고 즉시 실행됨 (Delay ❌)
- 이벤트 = 반환값없고 Delay 쓸 수 있음
Animation Blueprint
- Axis Settings → Horizontal Axis → Name을 Speed로 작성
- 아래 Snap to Grid 선택합니다. 블렌드 스페이스 그래프에 애니메이션 지정할 때 snap이 걸려서 조금 더 편하게 할 수 있습니다.
- 이제 BP_Ant로 가서 Mesh → Detail → Animation Mode가 Blueprint로 되어 있는지 체크
- Anim Class가 ABP_Ant_C 우리가 만든 클래스 선택합니다.
- _C는 블루프린트 클래스라는 뜻입니다.
- CustomEvent → Detail → Inputs → + 버튼 클릭
- 변수 만듭니다. Target이고 Type은 Actor(Object Reference)입니다.
픽업 아이템(힐 포션)
Actor 아이템 만들기
- StaticMesh 컴포넌트, Sphere Collision 추
- 스태틱 메시 아래 있으니 Root Component로 변경하겠습니다.
- 충돌체(Collision)를 루트로 설정하는 이유는 액터의 물리적인 ‘중심점’과 ‘기준’을 일치시켜 예기치 못한 물리 오류를 방지하기 위해서입니다.
- Sphere → 드래그 앤 드롭 → DefaultSceneRoot → Make New Root 선택
- Shere 선택 후 Detail → Collision 검색
- Collision Presets에 Custom 선택 후
- Collision Presets은 충돌체(Collision)가 다른 물체와 만났을 때, 통과시킬지 아니면 부딪힐지를 미리 정해둔 반응 규칙 세트입니다.
- Visibility를 Block으로 선택합니다.
레벨 배치
오늘의 핵심 정리
| Sphere Collision | 보이지 않는 구체 범위. |
| 플레이어 탐지나 폭발 범위로 사용. | |
| Hidden in Game 끄면 게임 중에도 보임 | |
| OnComponentBeginOverlap | 컴포넌트 안에 뭔가 들어오면 실행되는 이벤트. |
| Other Actor로 누가 들어왔는지 확인 | |
| Cast To | 들어온 Actor가 원하는 타입(BP_FPSCharacter)인지 확인. |
| 실패하면 Cast Failed로 빠짐 | |
| AI Move To + NavMesh | AI를 목표 위치로 이동. |
| NavMesh BoundVolume은 AI가 다닐 수 있는 영역 (P키로 확인) | |
| Apply Damage / Event AnyDamage | 가해자는 Apply Damage로 데미지를 주고 |
| 피해자는 Event AnyDamage로 받아서 체력 감소 처리 | |
| 함수 vs 이벤트 | 함수 = 반환값 ⭕ / Delay ❌ |
| 이벤트 = 반환값 ❌ / Delay ⭕ | |
| Custom Event | 내가 직접 만드는 이벤트. |
| Input으로 값 받기 가능 (예: StartChase의 Target) | |
| Blend Space | Speed 값에 따라 Idle ↔ Walk ↔ Run을 자연스럽게 섞음 |
| ProgressBar 업데이트 | **(현재체력 / 최대체력)**으로 Set Percent → 체력바 자동 갱신 |
개념 배운 것
Node 알아두기
- On Component Begin Overlap
- Cast To ~~~~ (”내가 네이밍 한 BP)
- AI MoveTo
- Apply Damage
- AnyDamage
- CustomEvent
- MIN
- MAX
Nav Mesh BoundVolume
다시 알아보기
- Sphere 충돌 Debbuging 시 → Sphere 선택 → Hidden in Game 선택해제(false)
- ??? Collision Presets에 Custom에서 특정 오브젝트 (player 만) 따로 설정하는 법은
- ??? 특정 지역 안에서만 랜점하게 AI 들 이동 시키는법 (Nav Mesh를 여러개? 아니면 Sphere 로 추가하나? 그것도 아니면 박스?) : AI Move To 노드를 사용해서 개미가 자신의 위치에서 1000cm(10m) 안에서 랜덤 한 위치를 선택하고 이동하게 만들어 줍니다. 이동 후 0~3초 랜덤 하게 기다리고 다시 이동합니다.로 되어있음
NavMesh
- 현재 나만 동적으로 Navmesh 적용시켰는데, 그 이유는 그래야 static mesh 있는 오브젝트 destory 했을 때 nav mesh가 새로 적용되기 때문에
참고 웹사이트
ps. 나도 추후 동여상 추구해서 설명해 두자
How to TIL
- 1 시간 정도 짧게 처음 보는 매니저 분이 강의해주셨는데, 이미 제공받은 TIL 관련 notion doc에 다 나와있던 말이었다.
- 정리: 매일 꾸준히, 너무 시간은 많이 쓰지 말되 내가 나중에 다시 와서 읽어보고 이해할 수는 있게끔 쓰자.
Tags:
- TIL, DevLog, 내일배움캠프, Boot Camp, C, Programming, Game Dev, 게임개발, Unreal Engine, UE5, Blueprint
