
챕터 1-1 : 코딩이란, (1) 우리의 목표는 코딩을 잘하는 것입니다. 근데 코딩이 뭘까요? 코딩이란 컴퓨터가 이해 가능한 명령서를 작성하는 과정입니다. 여기서 중요한 점은, “우리”가 이해 가능한 명령서가 아니라, “컴퓨터”가 이해 가능한 명령서라는 점입니다. 그
C++ (1) 기본 구조 헤더파일을 가져와야 화면 값 출력/입력(std::cout, std::cin) 가능
배운 것만 사용해서 어떻게든 풀어보려고 했는데, 1시간 붙잡고 포기했다. 답지를 보니 오늘 배우지않은 Get(a copy), SetArrayElem에서 배열 가져오기와 Split structre pin으로 연결점에 배열을 나열해야하는 것이 빠져있었음. 또 그냥 과제대로만 했어도 된 것을 상상속의 총을 만들다 보니까 배운걸로만은 표현을 못 하겠다 싶어서 그만...

A1. 저거를 바닥이 Grid라고 생각하고 맞췄더니 계속 뜬거였음. 분홍색 타원형 공 가장 밑을 바닥이라 생각하고 맞춰줘야함A1. 이걸 알려면 X(Roll), Y(Pitch), Z(Yaw)를 알아야함 X(Rolling)은 내 몸을 관통하는 세로축, Y(Pitching)

작동 방식시작하는 좌표를 입력 받는다 -> 떨어진다 -> 몇초 후에 자리로 돌아온다.조건 \-A.조건 리셋: KillZone에 닿는 순간 Reset 함수를 즉시 실행한다.(속도도 초기화) \-B.강제 리셋: 게임 시작 후 10초가 지났는데도 돌이 아직 필드에 있다

조건\-A. 토글 버튼: 버튼을 누르면 발판이 작동 / 다시 누르면 멈춤\-B. 최고/저점 발판: 발판이 정해진 거리만큼 움직인 후 2초동안 멈추고 다시 움직임\-C. 복수 발판: A, B를 한개의 버튼이 눌러지면 같이 발동됨구현1\. 움직이는 발판일단 시작시 Star

Find Look at Rotation 이라는 편리한 기능이 있어서 쉽게 구현할 수 있었음근데 이 과정에서 원래는 Overlap을 전 맵으로 해서 플레이어를 따라 보게 할라했지만 문제가 있었음 뒤에 Q&A에서 후술함전에 위 아래로 움직이는 발판이랑 똑같이 세팅 했지만
오늘은 4시간 동안 반복문 하나만 했는데 반복문이 날 안 놔준건지 내가 반복문을 안 놔준건지 모르겠다.물론 결국 틀린건 내 반복문 이론이 빈약해서 엄청 헷갈려 한 것이였는데 왜인지는 몰라도 반복문 안의 반복문의 변수 i, j , k 순으로 하나씩 해서 총 3개의 반복문

코딩을 하다보면, 한번 사용하고 버려질 변수, 값들 또는 행동이 중복되는 코드들을 볼때마다 불편해 미쳐버릴 것 같았다. 사실 최적화라는게 와닿지않았다. 그래서 "당장은 크기가 큰 프로그램을 코딩하는 것도 아니고, 나도 체감을 못하지만 컴퓨터는 체감을 하겠지." 라고 생

#include #include int solution(int n) { int answer = 0; for(int i=0; i int solution(int n) { int answer = 0; // 2부터 시작하여 n 이하의 짝수만 순

헷갈리는게 너무 많아졌다. 이론을 머릿속에 집어넣는 것 보단 회독을 하는게 좋을 듯. A1. virtual (자료형)(함수명)() 기본구조 Q. 그래서 왜 씀? 언리얼의 Interact(상호작용) 기능을 만든다고 치자. 그럼 문, 보물상자, NPC 등 상호작용 대상이

주말에 시간 내서 이해하려 하니까 운동 많이된다. 자기 전에 생각 날듯.어제 이해한대로 모르면 일단 동적배열로 포인터를 선언해라!!헤더파일과 소스파일로 나눠서 해본건 처음이였다. 어떻게 나누냐면헤더파일(.h) -> 간단한 클래스 선언, 멤버 변수, 함수 선언소스파일

난이도 : 실버 5A1. 일단 초기화 하고 사용한다. bool isGroup = true; 주의할 점은반복문 안에서만 선언한다.이렇게 해야 계속 true로 초기화 되기 때문에 변수 방지if (!isGroup)만약 isGroup 이 false라면 break;를 실행한다
STL 기초, 객체지향 설계, 알고리즘 2문제 map<int, string> myMap = { {1, "Apple"}, {2, "Banana"}, {3, "Cherry"} }myMap\[1] = "Alice"mymap.insert(make_pair(1, "Al
개념을 좀 급하게 배운 감이 없잖아 있었는데 실습, 예제를 풀다보면 전에 개념도 다시보게 돼서 더 잘 알게 되는 것 같음. 개념이란게 체인처럼 하나를 깨달으면 나머지도 줄줄인처럼 하나를 깨달으면 나머지도 연쇄작용으로 이해하기 쉬워짐.C++ 문법 2주차 숙제, 객체지향
vector 동적배열이 어떻게 생성되는지 알아보자C++ 문법 3주차 숙제, 알고리즘 2문제 word\[i] - 'a'는 뭘까 뭔데 true일까26개의 칸이 false로 초기화된 배열alphabet에서 word(받은 단어)\[i] = true word는string자료형
C++ Week 2 std::unique가 있다는 걸 알았고 compare이 생각보다 많이 까다롭다는 걸 알음 Study C++ 문법 끝, 알고리즘 2문제 Today I Learned 1. sort에서 a == b일때 왜 반드시 false로 할까? Reason
map과 pair의 차이, stable_sort에 대해 알아보자알고리즘 2문제, 과제 3번, 1, 2장 생성자와 소멸자 std::map는 중복된 KEY를 사용하지 못하지만, std::pair는 중복된 KEY도 사용 가능 std::map은 출력할때도 map.first와
여러번 반복하고 사용해도 다음날이면 잊어먹고 손에 익숙해지지않는다. 계속 반복해서 학습하는게 좋을 것 같음알고리즘 2문제, 과제 4번 recipeMap\[p.potionName] = p가 어떻게 되는거냐면 PotionRecipe의 생성자는 potionName과 ingr
C++ Week 4 과제를 하다보면 클래스를 다 나눠주셔서 편하게 부분작성만 하면 편하지만 나중에 이걸 내가 어떻게 설계하지? 라는 생각이 먼저든다. 나는 10년지나도 못할듯. 그래도 조금 객체지향설계에 가까워진 느낌이 듦 Study 알고리즘 1문제, 과제 4번 끝 Today I Learned 1. void VS PotionRecipe* 멤버함수 자...
협업을 하기 위한 git사용법이 그냥 코딩하는 것보다 100배 어렵다.브론즈 알고리즘 4문제, git 사용법 숙지, 언리얼C++ 과제새로운 파일이 들어왔는지 확인 -> 패치(Fecth) = 나는 바로 반영받고 싶지 않고, 그저 리모트의 변경사항만 보고 싶다.확인한 파일
언리얼 C++가 뭔가뭔가인듯언리얼 C++ 과제, 알고리즘 2문제\`없어도 빌드 자체는 되지만, 많은 헤더가 들어 있어 초보자는 보조바퀴처럼 생각하고 써주는 게 좋다.\`Native C++에는 없는 것들을 추가해주는 헤더파일이다. 가장 마지막에 작성해야 한다.UCLASS

Blueprint에서 만졌을때 함수들을 다 가져와서 쓸 수 있다는 사실을 깨닫고 나서는 좀 친숙해진 것 같다.과제 5번, 알고리즘 1문제 , 언리얼 C++, 디버깅FVector는 일단 Location의 x, y, z값을 저장하는 구조체라고 생각하면 됨FVector.X
시간 초과를 만나서 '시간복잡도' 생각을 하게 됐다. 간단한 개념만 알고 그냥 넘겼는데 필요하니까 찾게 됐다.알고리즘 1문제 std::set은 std::vector과 다르게 insert를 씀.std::set은 자동정렬 + 중복 제거를 한다. 그래서 그냥 뒤에다 넣는 p
팀프로젝트 시작 알고리즘 2문제,.find 는 std::find와 달리 찾지 못할ㄹ시 string::npos 반환npos = "no position"s.find("검색어",7); 은 7번째부터 찾는다는 뜻. 검색어 찾는 기능 같은 곳에서 사용하지만 시간 복잡도 상으로
팀원분들 구현한 코드를 보고 많이 배웠다. 팀프로젝트, 알고리즘 1 문제vector\[i] = x;는 vector.reserve(n) 이렇게 capacity만 늘려두면 값을 직접 넣는 것은 불가능 하다. 이렇게 값을 넣고 싶으면 resize로 사이즈를 할당하고 쓴다.
팀프로젝트 3일차 팀프로젝트 std::mt19937은 랜덤수를 뽑아주는 엔진이다. \`std::mt19937 gen; -> mt19937 gen 변수 선언 std::random_device rd; -> 랜덤으로 값을 받음Q. 그럼 그냥 random_device로 랜덤
팀프로젝트 4일차 팀프로젝트 이렇게 vector<struct>로 2중으로 만들 수 있다. 1을 랜덤으로 뽑고 거기서 또 가지를 나눠서 랜덤으로 뽑는게 가능. 생성자에서 초기화한다.Player가 공격하는 target을 어떻게 정할까 고민이였는데 해결책을 얻었다.Mo
팀프로젝트 5일차. 뭔가 기능을 구현하는 것보다 방어적으로 코딩하는 것에 시간을 더 쓰는 것 같다.팀프로젝트 Goblin으로 만들어둔 몬스터 클래스가 여러마리 복수로 나와야한다면? 어떻게 구별할지를 suffixes로 해결했다. Goblin 이름 뒤에 접미사를 여러개 배
팀프로젝트 6일차. 팀프로젝트 전투 시스템 구현 중, 분명히 플레이어의 방어력이 몬스터의 공격력보다 높을 때만 데미지를 입도록 if 분기 처리를 했음에도 불구하고, 플레이어의 체력이 오히려 회복되거나 로그와 실제 데미지가 다른 현상 발생.로그 확인 결과: The pla
팀프로젝트 7일차. 팀프로젝트 이진탐색(Binary Serach)는 단순히 값을 찾는 것이 아니라 '정답이 될 수 없는 절반의 범위를 매번가차 없이 버리는 것' 이다.전제 조건 = 탐색 범위가 반드시 정렬되어 있어야 한다.작동 원리 1\. 탐색 범위의 중간값(mid)을
팀프로젝트 끝이 났다. 운이 좋게도 좋은 팀원들을 만나 좋은 결과물을 내고 엄청 많이 배울 수 있었다.팀프로젝트, 코드 리뷰오늘 팀 프로젝트 마무리로 코드를 리뷰하며 결합도(Coupling)가 높아 의존성 주입(Dependency Injection, DI)이 필요하다고

오늘 C++ 시험이 있었는데 두 문제는 못풀고 하나는 다 풀어놓고 & 하나 안 써서 틀린 것 같다. 거기가 내 수준이라고 생각한다.C++ 시험 문제 복기벡터에서 특정칸 을 지우는 방법은 v.erase(v.begin() + i) 이렇게 시작부터 i의 칸을 지우는 것이다.
Next step -> C++ 복습, deque 알고리즘 문제 풀기queue는 전에 알고리즘 요세푸스 문제를 풀었기때문에 어떻게 사용하는지, 기능은 어디에서 사용 하면 좋은지는 잘 알지만프린트 큐 라는 알고리즘 문제를 풀다가 새로운 사용법을 알았다.std::pair는
std::deque, 언리얼C++ 기초Deque(Double-Ended Queue)는 양쪽 끝에서 삽입과 삭제가 모두 가능한 선형 자료구조이다. 특징은 스택(Stack)과 큐(Queue)의 특성을 모두 가지고 있으며, 인덱스를 통한 임의 원소 접근이 가능하다.사용방법은
언리얼C++ 기초언리얼 엔진은 이름만 보고도 이 녀석이 어떤 종류의 데이터인지 바로 알 수 있게 접두사를 강제한다.A(Actor) : 월드에 실제로 배치(Spawn) 할 수 있는 모든 것. (EX: AHunter)U(UObject/Componet) : 월드에 직접 배치
언리얼C++ 기초, 6번 과제, 알고리즘 1문제num \*= 3 + 1;을 하면 num \* 3 + 1로 num \* 3 이먼저 계산 될 줄 알았는데 아니였다.복합대입에서 + 연산은 \*=보다 우선순위가 훨씬 높다. 결국 num \* (3 + 1) 이 되는 것이다.그러

언리얼C++ 기초, 7번 과제, 알고리즘 1문제std::distance를이용해 seoul.begin()에서 it까지의 거리를 구할 수 있다.그런데 궁금한게 하나가 생겼다.C++이 단순한 바이트 단위로 뺴는 게 아니라는 것을 알고 있어야한다.만약 string하나가 메모리
언리얼C++ 기초, 알고리즘 2문제if 에서 Cast로 값이 맞는지 확인할떄 nullptr이면 밖으로 나간다. 즉 대입된 결과값 자체를 가지고 true/false를 판단한다.이 방식의 핵심은 변수에 값이 담겼는가가 아니라 nullptr인지 아니면 유효한 주소인지를 따지
계속 언리얼 C++강의를 보면서 if문의 중첩으로 예외처리를 해주는 모습이 처음에는 벽처럼 다가왔지만 보다보니까 큰 흐름을 알게 된것 같다. World -> GameState -> Controller -> Widget 이 순으로 예외처리를 하는데 내 클래스 내부 물건이
언리얼C++ 기초, 알고리즘 1문제GetGameInstnace()는 내부적으로 UGameplayStatics의 기능을 호출하는 편의 기능(Helper)이다.AActor나 UUserWidget 같은 클래스들은 내부적으로 GetGameInstance()라는 함수를 미리 가
언리얼C++ 기초레벨 전환 시 나타나야 할 트랜지션 위젯의 텍스트(Level, Wave)의 진행상황이 업데이트가되지않았다. 또 게임을 진행하면서 웨이브나 레벨을 넘어가다가 가끔씩 트랜지션 위젯이 여러개가 중첩돼서 나타나는 걸 확인했다.문제는 여러가지가 있었는데 Play
언리얼C++ 기초, 게임기획, 알고리즘 1문제언리얼 엔진의 빌드 시스템(UBT)에게 헤더 파일을 찾을 때 명시한 폴더도 찾아봐라고 알려주는 경로 추가 작업이다.게임 프로젝트 규모가 커지면 폴더가 많아진다.만약 이 코드가 없으면 다른 폴더의 헤더를 가져올 때 경로를 추가
언리얼C++ 기초, 알고리즘 1문제UE_LOG는 내부적으로 C언어의 printf와 같은 방식을 사용한다. 이 방식은 문자열을 출력할 때 문자열 데이터가 시작되는 시작 지점의 주소값(C 스타일 문자열)을 원한다. FString = 언리얼이 똑똑하고 복잡한 객체 안에 길이
언리얼C++ 기초, 게임기획 과제, 알고리즘 1문제컴퓨터 최소 메모리 단위는 1바이트(비트)이다. 그렇지만 우리가 bool bIsDead;라고 쓰면, 컴퓨터는 죽었는지 살았는지 체크 한다. 문제는 이때 발생하는데, 단순히 1비트만 쓰는게 아니라 최소 단위인 1바이트(8
언리얼C++ 기초, 알고리즘 1문제2026-04-20TIL 정리문득 UBoxComponent같은 것들이 그냥 UBoxComponent\* BoxComponent로 관리되어도 UPROPERTY의 관리를 받아 리플렉션 시스템과 GC시스템을 이용할 수 있는데 굳이 TObje

언리얼C++ 기초, 알고리즘 1문제CharacterBase와 PlayerCharacter를 나누는 이유가 무엇일까? ACharacter는 Pawn보다 더 많은 기본 기능을 가진 클래스다. 기본적으로 CapsuleComponent, SkeletalMeshComponent
언리얼C++ 기초, 알고리즘 1문제TryGetPawnOwner()는 AnimInstance를 소유하고 있는 Pawn을 가져오는 함수이다. 여기서 Try가 붙은 이유는 이름 그대로 "시도는 해보는데, 없을 수도 있다"라는 뜻이다. 그런데 왜 APawn에서 가져오는 걸까?
언리얼C++ 기초, 알고리즘 1문제애니메이션의 특정 프레임에서 게임 로직을 실행시키기 위한 타이밍 이벤트이다. 애니메이션이 재생되는 정확한 순간에 맞춰 코드나 이벤트를 실행하기 위해 사용한다.Unreal에서 Collision은 단순히 “부딪힌다”가 아니라, World에
언리얼C++ 기초, 알고리즘 1문제Unreal에서 파티클이나 사운드 컴포넌트를 생성한 뒤, 타이머로 몇 초 후 제거. 또는 특정 작업 전에 제거로 하려했다. 그래서 람다에 raw pointer를 그대로 캡처해서 사용했지만,레벨 전환이나 DestroyComponent()
언리얼C++ 기초, 알고리즘 1문제RootWidget은 WBP를 벡터처럼 순서대로 관리해서 번호에 맞게 띄울 수 있게 해주는 관리 Widget이다.WidgetSwitcher를 이용해서 관리한다. 만약 WidgetSiwtcher을 이용해서 관리하지않으면 계속 생성/제거를
팀플, 알고리즘 1문제Niagara는 Unreal Engine에서 파티클 기반 시각 효과를 제작하는 VFX 시스템이다. 기존 Cascade를 대체하는 시스템으로, 연기, 불꽃, 먼지, 폭발, 빗방울, 마법 효과 등 실시간 이펙트를 만들 수 있다.여러 개의 파티클을 생성
팀플, 알고리즘 1문제Spline은 맵에 그려둔 길이다. 캐릭터가 이 길을 따라 움직일 수 있다. 위 함수는 "Spline 위에서 currentSplineDistance만큼 이동한 지점의 월드 위치를 가져와라"라는 뜻이다. 0.0f는 Spline의 시작점currentS
팀플, 알고리즘 1문제AddDynamic과 AddUniqueDynamic은 둘 다 언리얼의 Dynamic Multicast Delegate에 함수를 등록할 때 사용한다.둘의 차이는 중복 바인딩을 허용하느냐이다.AddDynamic은 같은 객체의 같은 함수가 이미 등록되어
팀프로젝트, 팀프로젝트 GDD작성, 알고리즘 1문제USaveGame은 "저장 전용 데이터 상자"이고, 게임을 껐다 켜도 남아야 하는 저장 파일이다.SlotName은 저장 파일 이름이고, UserIndex는 보통 PC 싱글 프로젝트면 0 사용SaveGame에 저장 해야할
팀프로젝트, 팀프로젝트 GDD작성TArray는 언리얼의 배열이다. 배열은 0부터 시작하고, 마지막 인덱스는 Num() - 1이다.IsValidIndex()는 범위 밖의 인덱스에 접근해도 되는지 검사한다.WidgetSwitcher가 너무 편한 것 같아서 남발하면서 썻더니
팀프로젝트, 팀프로젝트 GDD작성UMG 입력 이벤트는 위젯이 직접 받는 마우스 입력이다.EnhancedInput처럼 Input Action을 만들어서 받는 게 아니라, 화면에 떠 있는 UserWidget이 마우스 클릭, 이동, 해제를 직접 처리한다.그래서 무기 프리뷰
팀프로젝트시퀀스가 끝났을 때, 시퀀스가 마지막 만든 상태로 유지해라라는 뜻이다. 예를 들어 Level Sequence에서 카메라가 이동하고, 캐릭터가 어떤 포즈를 잡고, 라이트가 켜지고, 무기가 화면 앞으로 들어왔다 하면 마지막 KeyFrame에서 멈추는 것OnCine
팀프로젝트SaveGame은 게임을 껐다 켜도 남아 있어야 하는 데이터를 저장하는 기능언리얼에서 GameInstance는 레벨이 바뀌어도 살아있지만 게임을 완전히 종료하면 사라진다. 반면 SaveGame은 프로젝트 '파일/Saved/SaveGames' 디스크에 .sav파
팀프로젝트FindOrAdd는 TMap함수이다.두번째 코드의 뜻은 triatId키가 있으면 그 값을 가져온다. \->traitId키가 없으면 새로 추가하고 기본값 0을 만든다.\-> 그 값을 +1한다.언리얼은 std::pair가 아니라 TPair를 사용한다. C++은 P
팀프로젝트언리얼 DataTable은 보통 C++에서 직접 경로로 찾기보다, 변수만 열어두고 블루프린트/WBP에서 할당하는 방식이 편하다.FindRow<TraitData>()는 특정 RowName에 해당하는 FTraitData 한 줄을 찾아오는 함수이다. 뒤에 TE
팀프로젝트LineTrace는 언리얼에서 직선 충돌 검사이다. 다른 엔진에서 보통 Raycast라고 부름LineTrace\-> 시작점에서 끝점까지 보이지 않는 직선을 쏜다. 그 직선이 어떤 물체와 부딪히면, 무엇과 부딪혔는지, 어디에 부딪혔는지 정보를 돌려준다.총알 판정
팀프로젝트언리얼 콘솔에서 C++ 함수를 직접 호출할 수 있게 해주는 기능.테스트용 치트, 디버그 명령, 빠른 상태 변경에 사용. 보통 PlayerController, CheatManager같은 플레이어 입력/명령을 받는 클래스에 둔다.C++ 전처리 조건문이다. SHip
팀프로젝트, 개인 연습 프로젝트, 알고리즘 1문제언리얼 C++에서 FoundSound->Get()처럼 Get()을 호출하는 구조는 보통 래퍼 객체 안에 들어있는 실제 객체를 꺼내기 위해 사용한다.FoundSound가 단순한 USoundBase\*라면 보통 바로 사용할
개인 연습 프로젝트, 알고리즘 2문제FInputActionValue는 Enhanced Input에서 InputActio의 갑을 담아서 넘겨주는 구조이다. 원하는 값을 가져와 Get<자료형>()으로 사용할 수 있다. 즉, FInputActionValue자체가 이동값
개인 연습 프로젝트, 알고리즘 2문제이건 Enemy 종류 중 스폰할 클래스를 저장하는 변수다. 아직 몬스터가 월드에 있지않는 설계도로만 존재한다.TSubclassOf는1\. 이 타입을 상속한 클래스만 넣을 수 있음2\. 에디터에서 선택 가능한 클래스가 필터링됨3\. B
개인 연습 프로젝트, 알고리즘 2문제FTransform은 위치, 회전, 스케일을 가진 자료형이다.내부적으로 대충 이 세 가지를 가진다Transform의 곱셈은 A를 먼저 적용하고, 그 다음 B를 적용한다. 로컬위치를 월드 위치로 바꿀 때 자주 사용한다.즉, LocalT
개인 연습 프로젝트, 알고리즘 2문제클라이언트는 서버로 가는 단 하나의 Serverconnection을 가지고, 서버는 접속한 클라이언트마다 ClientConnections에 UNetConnection을 하나씩 가진다. ServerConnection == nullptr
개인 연습 프로젝트, 알고리즘 2문제std::max_elemnet는 컨테이너 안에서 가장 큰 값을 가진 위치(iterator) 를 찾아주는 함수이다. 여기서 max_elemnet가 값 자체를 반환하는 게 아니라 iterator를 반환한다는 것이다.count.begin(
멀티플레이 개발FilterByPredicate(...)는 Numbers의 각 원소를 람다 함수에 넣고, true가 나온 원소만 모아서 새로운 TArray를 반환해주는 함수이다.std::vector에서 반복문과 if를 사용하여 거르던 작업을 FilterByPredicat
멀티플레이 개발Bandwidth(대역폭)는 일정 시간 동안 네트워크로 전송할 수 있는 데이터의 양이다.UPROPERTY(Replicatd)로 선언한 변수는 서버에서 값이 변경되면 클라이언트로 전달된다. 이때 복제 데이터를 전송하기 위해 Bandwidth가 사용된다.복제
멀티플레이 개발언리얼에서 객체가 유효한지 검사할 때는 상황에 따라 checkf, ensureMSgf, if(IsValid(...))를 구분해서 사용한다.조건이 거짓이면 오류 메시지와 호출 스택을 남기고 실행을 중단checkf는 단순한 예외 처리가 아니라, 정상적인 코드
멀티플레이 개발클라이언트 A와 서버가 연결되면 서버 쪽에 A를 위한 NetConnection이 하나 생긴다.클라이언트 B도 접속하면 별도의 연결이 생긴다.이렇게 NetConnection은 클라이언트 한 며오가의 네트워크 관계라고 볼 수 있다. 서버와 특정 클라이언트 사
멀티플레이 개발FixedTurn은 현재 각도에서 목표 각도까지 "이번 프레임에 최대 몇 도 돌릴지" 정해서 회전시키는 함수다. CurrentYaw 에서 TargetYaw 까지 Turn \* DeltaSeconds만큼, 이번 프레임에 회전할 최대 각도다.다른 방법으로는
멀티플레이 개발네모난 캐릭터가 떼굴떼굴 구르는 이동 연출을 구현하기 위해 CapsuleComponent는 그냥 두고StaticMesh를 회전 시키고 있었다. 처음에 한 번 구를 때 Mesh를 360도 회전시켰다. 360도 회전은 마지막에 다시 원래 자세로 돌아오기 때문
APawn + UMovementComponent 기반으로 박스 형태 캐릭터의 이동을 직접 구현하던 중, 플랫폼 모서리나 벽 끝에 살짝 닿았을 때 캐릭터가 공중에서 멈추는 문제가 발생했다.원인은 SafeMoveUpdatedComponent()의 Sweep 결과가 Bloc
Size()는 벡터의 길이를 구한다.여기서 길이는 500이다 왜냐하면이렇게 게임에서는 속도 벡터의 길이가(Velocity.Size())가 실제 이동 속도이다.정규화는 벡터의 방향은 유지하면서 길이를 1로 만드는 것이다.GetSafeNormal()에서 safe의 의미는

true면 Blocking 충돌이 있었고, false라면 충돌이 없었거나 단순 Overlap일 수 있다. 즉 Hit.Normal 보기 전에 애초에 BlokingHit이 있었는지 부터 확인하기 위한 것Bloking HIt이지만, 시작부터 이미 침투하고 있던 충돌이 아닌
Listen Server는 한 명의 플레이어가 게임을 플레이하면서 동시에 서버 역할까지 수행하는 방식이다.예를 들어 A가 방을 만들었다면 A의 게임이 서버 역할까지 담당한다.언리얼에서는 맵을 열 때 ?listen 옵션을 사용해 Listen Server를 열 수 있다.별
RPC는 Remote Procedure Call, 원격 함수 호출이다.쉽게 말하면, 내 컴퓨터에서 함수를 호출했는데, 실제 함수의 실행은 다른 컴퓨터에서 하도록 요청하는 기능ServerRPC();를 호출하면 Server에서 ServerRPC_Implementation(
기본 UUserWidget도 여러 UI를 동시에 화면에 띄울 수 있다.하지만 실제 게임 UI를 구현하려면 단순히 AddToViewport() / RemoveFromParent()만으로는 부족하다.예를 들어 설정 화면 위에 Confirm Popup이 등장했다고 가정한다.