섹션1의 캐릭터 컨트롤 설정 파트에서 궁금한 부분이 있어 질문 드립니다. 강의 영상에서는 DataAsset 부분(15:15 ~ 16:10)에서 IMC 설정을 하지 않고 생략 되는 것으로 알고 있습니다. ( 때문에 Github 소스 자체에는 문제가 없습니다. 다만 영상과 같이 DataAsset의 IMC를 None으로 두면=영상 내용을 그대로 따라한다면 질문1 질문2 과 같은 문제가 발생합니다.) 이를 해결하기 위해서 위의 링크들과 같이 에디터 상에서 DataAsset에 직접 IMC를 지정하는 방법 도 있지만, DataAsset을 불러오는 김에 IMC도 코드를 이용해서 추가 하는 것이 좋지 않을까? 싶어 코드를 약간 변형해봤습니다. 아래는 ABCharacterBase.cpp 의 소스코드 일부 입니다. 기존 소스코드에 헤더를 추가한 상태를 기준으로 48번 Line부터 내용을 추가 했습니다. #include "InputMappingContext.h" // 헤더 파일 추가 (중간 생략...) // DataAsset 탐색 static ConstructorHelpers::FObjectFinder<UABCharacterControlData> ShoulderDataRef(TEXT("/Script/ArenaBattle.ABCharacterControlData'/Game/ArenaBattle/CharacterControl/ABC_Shoulder.ABC_Shoulder'")); if (ShoulderDataRef.Succeeded()) { // DataAsset에 IMC 삽입 static ConstructorHelpers::FObjectFinder<UInputMappingContext>ShoulderInputMappingContextRef(TEXT("/Script/EnhancedInput.InputMappingContext'/Game/ArenaBattle/Input/IMC_Shoulder.IMC_Shoulder'")); if(ShoulderInputMappingContextRef.Succeeded()) { UInputMappingContext* ShoulderInputMappingContext = ShoulderInputMappingContextRef.Object; ShoulderDataRef.Object->InputMappingContext = ShoulderInputMappingContext; } CharacterControlManager.Add(ECharacterControlType::Shoulder, ShoulderDataRef.Object); // 기존 DataRef의 InputMappingContext는 Default = None으로 설정되어 있었음 } // DataAsset 탐색. Quarter <-> Quater 오타 주의 static ConstructorHelpers::FObjectFinder<UABCharacterControlData> QuarterDataRef(TEXT("/Script/ArenaBattle.ABCharacterControlData'/Game/ArenaBattle/CharacterControl/ABC_Quarter.ABC_Quarter'")); if (QuarterDataRef.Succeeded()) { // DataAsset에 IMC 삽입하는 과정 static ConstructorHelpers::FObjectFinder<UInputMappingContext>QuarterInputMappingContextRef(TEXT("/Script/EnhancedInput.InputMappingContext'/Game/ArenaBattle/Input/IMC_Quarter.IMC_Quarter'")); if(QuarterInputMappingContextRef.Succeeded()) { UInputMappingContext* QuarterInputMappingContext = QuarterInputMappingContextRef.Object; QuarterDataRef.Object->InputMappingContext = QuarterInputMappingContext; } CharacterControlManager.Add(ECharacterControlType::Quarter, QuarterDataRef.Object); } 위와 같은 방식들로 IMC를 DataAsset에 추가해줬을 때 별다른 문제가 없다면, 해당 섹션의 강의 정보에 공유 해주실 수 있으신가요?! 아무 생각 없이 코드만 생각하다가 여기서 쳇바퀴 열심히 돌렸습니다 ㅎㅎ;;
안녕하세요 루키스 강사님! BP_Pawn 강의를 듣고 따라하고있는데 마지막에 DesiredCamerHeights를 이용해 75높이로 카메라 높이를 고정하는 블루프린트를 따라했는데 실행하면 일어서도 Camera 높이가 계속 변경되고 75로 고정 되지않습니다. 그래서 BegincPlay 이벤트 문제인가 싶어서 Tick 이벤트에 넣었는데 그때는 이상하게 일어나거나 앉아도 Camera 값이 고정이 잘 됩니다. 강사님은 BeginPlay에 연결하셔서 하시는데 Tick에 연결해서 해도 되는지 몰라서 질문 드립니다.
생성자에서 bNotifyTick = true;를 해주고 틱테스크 함수에 디버깅 포인트를 찍고 디버깅을 해봤으나 함수에 들어오지 않는 것 같습니다. 혹시 저 부분 외에 다른 작업도 해주어야 하나요? 그리고 람다를 사용해서 계속 델리게이트를 구독하는 것 같아서 bool값을 통해 초기 한 번만 등록되도록 바꿔봤는데 혹시 문제가 있을까요? 아직 델리게이트를 정확히 이해하지 못해 질문 드립니다.
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
루키스님께서 해주시는 강의 귀에 쏙쏙 들어와서 항상 감사의 말을 먼저 드립니다. 루키스님의 강의 중 터미널 창이 매우 깔끔하게 촘촘히 박혀있으신데 제 터미널창은 세로로 길쭉하여 결국 코드에 TILE뒤 << " "; 이런 식으로 억지로 띄워썼습니다. 혹시 이 방법 말고도 다른 방법이 있으신지 견식을 여쭙고자 합니다. 가르쳐 주신다면 정말 감사하겠습니다.
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Overlapped 방식은 비동기 + 논블로킹 이고 이전 예제 WSASelectEvent를 이용한 예제는 동기 + 논블로킹 으로 이해 했습니다. Overlapped의 로직 흐름 은 while문 진입 후 Event방식의 경우 WSARecv의 반환값이 SOCKET_ERROR일때 WSAGetLastError()가 WSA_IO_PENDING이라면 Sleep 혹은 WSAWaitForMultipleEvents으로 대기하다가 콜백방식이면 깨워서 처리, 이벤트방식이면 시그널되었으므로 이후 다음 코드 실행 Select의 로직 흐름 은 while문 진입 후 WSAWaitForMultipleEvents로 대기 후 시그널되면 인덱스정보로 세션의 위치를 알아낸 후 해당 세션의 소켓을 통해 NetworkEvent를 확인해서 Accept인지 Recv플래그를 통해 적절한 처리 이렇게 정리하고 나니 결국 Overlapped는 Recv를 먼저 실행한 후 대기하는 것이고 Select는 대기한 후 Recv하는 것이구나 라는 생각이 들었고, 처음에 보여주신 블로킹/논블로킹, 동기/비동기에 관한 그림으로 볼 때 Select와 Overlapped 모두 Sync-NonBlocking과 같이 동작하는게 아닌가 하는 생각이 들었습니다. 왜냐하면 INFINITE로 두면 반환할때까지 Blocking 방식처럼 동작할 것이라고 생각했고, INFINITE가 아닌 Timeout을 주면 주기적으로 확인한다는 것이므로 Sync-NonBloking처럼 동작한다고 생각했습니다. 제가 생각한 것이 맞는지 궁금합니다.
선언 혹은 인클루드 입력하실 때 자동완성기능이 활성화되시는데 따로 설정할 것이 있는지 궁금합니다. 예를들어 MyCharacter.cpp에서 #include "Components/WidgetComponent.h"를 전부 입력하는 반면 선생님은 Comp로만 입력했을 때 자동완성으로 표기되셔서 다른 설정을 하신 것 같아 질문드립니다.
저는 이때까지 상위클래스-하위클래스의 관계를 가지고 있으면 상위 클래스의 변수와 로직을 하위클래스에서 끌어 쓸 수 있다고만 알고 있었는데요. 테스트를 해 보니 상위 클래스의 이벤트 그래프의 로직을 하위 클래스에 복사 붙여넣기 하지 않아도 하위클래스의 객체가 이 로직을 그대로 실행하더군요. 상위클래스의 이벤트 그래프의 로직을 하위클래스의 이벤트 그래프에 복사 붙여넣기 해주지 않아도 하위클래스로 만든 객체가 상위 클래스의 로직을 자동으로 실행하는게 맞는지 확인하고 싶습니다.
State 패턴 강의 중 궁금한게 생겨 질문 드립니다. Set(Skill) 노드는 Attack을 변수 설정하기 위한 노드, 뒷 부분의 Set(Move) 노드는 공격 애니메이션을 해제, 즉 액션을 위한 노드로 이해하고 있습니다. 제 가정이 맞다면 Set 노드의 기능은 변수 설정, 액션 2가지로 나눌 수 있다는 것인데, 만약 같은 set 노드라도 변수 설정을 위한 노드와 액션을 하는 노드는 어떻게 구분하며 써야하는지 그 기준이 궁금합니다.
강의 잘 듣고 있습니다! 블루프린트에서 Array 타입은 STL의 vector로 동적 배열로 구현이 되고, Set과 Map은 STL의 unordered_set, unordered_map으로 해시 테이블로 구현이 되어있다고 이해했습니다. 그렇다면 궁금한게 STL의 list나 set, map인 연결 리스트, 이진 탐색 트리는 사용하지 못하나요? 못한다면 이유가 뭔지 궁금합니다!
World Settings 창에는 제대로 적용이 되었다고 뜨지만 게임 플레이를 할 경우 Inspector 창에서는 DefaultPawn 이라고 뜨네요.. 무슨 문제 때문에 이럴까요? PlayerController 도 헤더파일로 적용시키는 방법은 잘 작동 하였지만 경로를 이용한 방법에서는 먹통이 됩니다..