월 27,720원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
"에셋을 로딩한다"의 의미
8강 소프트 레퍼런싱에 대해서 강의를 듣다가 에셋이 로딩되고 객체에 할당되는 과정에 궁금증이 생겼습니다. 제 생각은 다음과 같습니다.에셋이 로딩되면 에셋의 데이터를 가지고 객체를 만든다. 그리고 해당 에셋을 사용하는 클래스가 인스턴싱될 때 로딩된 에셋(객체화된 에셋)을 복사해서 추가한다.만약 같은 에셋을 사용하는 클래스가 두 개 이상이라면, 로딩된 에셋을 두 번 복사하게 된다.즉, 에셋을 로딩한다는 것은 복사를 위한 원본 객체를 생성하는 것을 의미한다. 제 생각이 맞을까요?
- 해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
9강 무한맵의 제작에서 블루프린트에 컴포넌트의 디테일창이 안보이는 현상
작업하다보면 가끔씩 이런 현상이 발생하는데 혹시 원인이 어떤게 있을까요?? ㅠㅠ
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
5강 Montage_SetEndDelegate()함수 관련
FOnMontageEnded EndDelegate; EndDelegate.BindUObject(this, &AABCharacterBase::ComboActionEnd); AnimInstance->Montage_SetEndDelegate(EndDelegate, ComboActionMontage);Montage_SetEndDelegate 함수를 보면,AnimMontage클래스에서 AM이 종료되면 호출시키는 FOnMontageEnded타입의 델리게이트 변수를, 위 함수의 인자로 받는 델리게이트 변수와 치환해서(=) 실행되는 것으로 이해했습니다. 그렇다면 구현되어있는 델리게이트 변수에 ComboActionEnd함수를 바로 구독시키면 안되는건지 궁금해서 여쭤봅니다..
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
.uproject 관련 질문
영상 말미에 uproject파일에서 Generate Visual Stduio File 하신 이유가 궁금합니다!검색해보니 어떤 기능인지는 알겠는데, 스크립트 파일을 삭제할 때마다 해주면 되는걸까요?
- 해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
SetComboCheckTimer함수에서 질문이 있습니다!
ComboTimer의시간을 설정하는 float ComboEffectiveTime = (ComboActionData->EffectiveFrameCount[ComboIndex] / ComboActionData->FrameRate) / AttackSpeedRate;이 코드가 1초를 30Frame으로 잡고 원하는 Frame까지 시간을 체크하기위해서 시간계산 용으로 이해했는데위같은 방법 대신 Animation Montage BluePrint 에서 Notify로 설정하고 함수를 호출하는 방법은 성능적 차이가 클까요?? 아니면 그냥 개발자의 선택에 따른 차이일까요??
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
랜덤박스에 waepon이 생기지 않습니다
Weapon이 primaryasset으로 안들어가서 그런가 싶어서 weapon의 데이터를 봤는데Primary Asset Type은 ABItemData(비쥬얼스튜디오에서는 복사붙여넣기로 넣은거라 이름이 다를 리는 없을 거같습니다.)로 들어가있었습니다. 근데 박스가 생성될 때 assets의 num을 찍어보니 3이 아닌 2가 나오는거 보니 인식이 안되는 거 같은데 엔진의 문제일 수도 있나요?
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
2강 - 입력 매핑 컨텍스트 오류가 발생했습니다.
BeginPlay 함수를 오버라이딩 하실 때 void AABCharacterPlayer::BeginPlay(){Super::BeginPlay();APlayerController* PlayerController = CastChecked<APlayerController>(GetController());if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController)){Subsystem->AddMappingContext(DefaultMappingContext, 0);// Subsystem->RemoveMappingContext(DefaultMappingContext);}}와 같이 정의하셨는데, ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController) 이 함수에서 인수가 일치하지 않는다는 오류가 발생합니다. 선생님 코드를 보면 동일한 코드임에도 실행이 잘 되던데, 저는 이 부분 때문에 빌드가 안되고 있습니다. 인수가 ULocalPlayer가 들어와야 한다고 해서, APlayerController이 아닌 ULocalPlayer로 캐스팅도 해봤는데, 런타임에서 바로 터집니다. 혹시 어느 부분이 문제일까요?모듈에는 EnhancedInput 추가했고, 로그에 해당 오류 말고 다른 오류가 발생하고 있지는 않습니다.
- 해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
Unreal 애니메이션이 기본적으로 MultiThread 옵션이 켜져있는 점에 대해서.
아마 성능을 위해 애니메이션 블루프린트 로직이 작업자 스레드에서 돌아가도록 옵션 켜는게 있는 것 같은데요. 많은 다른 예제에서 블루프린트 EventGraph 대신 Blueprint Thread Safe Update Animation 이라는 블루프린트 함수를 대신 사용하고 또, C++ 로도 NativeUpdateAnimation() 대신 NativeThreadSafeUpdateAnimation() 가 있더라구요. 그리고 블루프린트 전용 함수에서도 ThreadSafe 옵션을 켜고 끄는게 있는데 이걸 켜면 일반적인 C++ 함수를 호출할 수 없고, C++ 함수에 Meta = (BlueprintThreadSafe) 지정자를 설정하면 보이긴 하는데요. 여기서 NativeThreadSafeUpdateAnimation() 함수나 Meta = (BlueprintThreadSafe) 지정자를 붙인 C++ 함수에는동기화 기법( mutex 같은)을 사용해서 정말 내부적으로도 멀티스레드 프로그래밍 같이 코드를 짜야 하는건가요???
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
TObjectPtr을 사용할 때 전방선언
TObjectPtr 클래스에는 static_assert 선언이 되어있습니다.UObject 에서 파생된 클래스인지 검사하고 에러메시지를 표시해주게 되는데요.우리가 평소 어떤 액터 클래스나 컴포넌트 클래스를 생성해서 사용할 때 내부에 TObjectPtr 을 사용해서 UObject 클래스를 등록하고 사용하게 됩니다.문제는 UObject 의 헤더파일을 바로 포함시키기 보다는 중복 참조와 컴파일 시간을 줄이기 위해서 전방선언으로 처리하는 경우입니다.이때 전방선언된 UObject 의 파생 클래스는 실제로 UObject 에서 파생되었는지 이 시점에서는 알 수 없습니다.하지만 실제로 그렇게 사용해보면 문제없이 사용되는 것을 확인 할 수 있었습니다.왜 TObjectPtr의 static_assert의 조건을 통과하는 것일까요?Ex)class UInputAction;TObjectPtr<UInputAction> UTestAction; // 왜 에러가 아닐까요?
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
뷰포트에서 화면이 아래 위로 밖에 안움직입니다
움직임도 잘되고 v키를 눌러 시점 전환도 잘되는데 마우스가 오른쪽이나 왼쪽으로 가면 화면이 그쪽으로 돌아가지 않고 아래 위로만 회전합니다 혹시 마우스 관련 설정이 잘못된걸까요?
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
21 : 41 OnGameClear OnGameOver 이벤트 노드
앞서 만든 코드에서는 OnGameClearCpp, OnGameOverCpp 이름으로 나오도록 했는데 미리 만드신것에선 이름을 다르게 지으신건가요?OnGameClear, OnGameOver이름이 다르길래 질문드립니다. +수정강의 뒤에 내용을 듣다보니 OnGameClearCpp, OnGameOverCpp 도 가져와 연결시켜주네요..미리만들어진것말고 제가 직접 만들어보고 있는데 저노드가 안보이는데 어떻게 추가를하면 될까요?
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
1강 Default Pawn Class가 바로 변경되지 않는 이유
안녕하세요1강 23:03 에서 강의 영상에서는 Ctrl+Alt+F11을 눌러 에디터 빌드를 완료를 하면 Default Pawn Class가 바로 ThridPersonCharacter로 변경이 되는데, 제 컴퓨터에서는 바로 변경이 되지 않습니다. cpp의 생성자 부분만 변경했음에도, 에디터를 끈 후 비주얼스튜디오에서 빌드를 한 후 다시 에디터를 실행해야 변경된 것이 확인되는데 왜 그럴까요? 제가 놓친 설정이나 빌드 방법이 있는지 궁금합니다.
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
22:53분에서 나오는 FClassFinder 함수 질문입니다.
게임모드에 언리얼에서 제공하는 3인칭 템플릿 캐릭터 에셋을 디폴트 폰 클래스로 지정할 때 ConstructorHelpers::FClassFinder 함수에 템플릿으로 APawn을 지정해주셨는데 캐릭터는 폰을 상속받은 클래스인데 ACharacter로 지정하면 안되는 이유가 있나요? 해보니깐 컴파일 오류가 나던데요ACharacter로 클래스를 찾아야 오히려 더 명확하게 찾는게 아닌가 싶어서 질문드립니다.
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
블루프린트(에디터)에서 지정한 ComboActionData가 null이 되는이유
안녕하세요AI시스템 구현도중 ComboActionData를 불러올수 없는 문제가 생겨서 질문 드립니다.우선 이것저것 바꿔서 실습 해보는 중이라 강의 코드랑 다른부분이 있을순 있습니다만 베이스는 강의코드입니다...void ATLStageGimmick::OnOpponentSpawn() { const FTransform SpawnTransform(GetActorLocation() + FVector::UpVector * 88.0f); ATLCharacterNonPlayer* OpponentCharacter = GetWorld()->SpawnActorDeferred<ATLCharacterNonPlayer>(OpponentClass, SpawnTransform); if (OpponentCharacter) { OpponentCharacter->OnDestroyed.AddDynamic(this, &ATLStageGimmick::OnOpponentDestroyed); OpponentCharacter->SetLevel(CurrentStageNum); OpponentCharacter->FinishSpawning(SpawnTransform); } }우선 기믹 코드쪽에서 이렇게 스폰을 해주는데요,(예제랑 같습니다) CharacterNonPlayer를 상속받아 BP_EliteBoss라는 이름으로 블루프린트를 만든뒤 기믹 엑터에 이렇게 설정을 해줬습니다. 그리고 BP_EliteBoss안에 필요한 몽타주와 ComboActionData를 설정해줬는데요 그래서 게임을 실행해보면 정상적으로 스폰도 되고 이동도 합니다. 그런데 정작 공격을 진행하면 ComboActionData가 없다는것 아니겠습니까..? 저는 분명 블루프린트에서 ComboActionData를 넣었는데 말이죠.. 혹시 SpawnActorDeferred하게되면 에디터에서 지정한 에셋들은 사용할 수 없는건가요??? 해결방법을 찾다 안돼서 질문 드립니다...
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
GetAuthGameMode를 통해 IABGameInterface를 캐스팅하려는 문제
현재 ABStageGimmick.cpp에서 빌드 에러가 납니다.void AABStageGimmick::OnOpponentDestroyed(AActor* DestroyedActor) { IABGameInterface* ABGameMode = Cast<IABGameInterface>(GetWorld()->GetAuthGameMode()); // 에러 SetState(EStageState::REWARD);; } 에러 내용은 아래와 같습니다.1>C:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\CoreUObject\Public\Templates\Casts.h(85): error C2027: use of undefined type 'AGameModeBase'1>C:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\Engine\Classes\Engine\GameInstance.h(29): note: see declaration of 'AGameModeBase'1>C:\UnrealProject\UE5_GameFrameWork\ArenaBattle\Source\ArenaBattle\Gimmick\ABStageGimmick.cpp(288): note: see reference to function template instantiation 'To Cast<IABGameInterface,AGameModeBase>(From )' being compiled1> with1> [1> To=IABGameInterface,1> From=AGameModeBase1> ] 현재 리서치해본 결과 ABGameMode가 어떤 클래스인지 파악 못해서 GameModeBase.h파일을 추가해줘야 한다고 합니다.아니면 UObject로 형변환 한 뒤에 캐스팅해오라고 되어있습니다. void AABStageGimmick::OnOpponentDestroyed(AActor* DestroyedActor) { IABGameInterface* ABGameMode = Cast<IABGameInterface>((UObject *)(GetWorld()->GetAuthGameMode())); if (ABGameMode) { ABGameMode->OnPlayerScoreChanged(CurrentStageNum); if (ABGameMode->IsGameCleared()) { return; } } SetState(EStageState::REWARD);; } 그래서 이렇게 수정하니 해결이 되었는데 혹시 왜 저는 강사님처럼 코드를 작성하면 되지 않는지 아직 이해가 가지 않습니다.알려주시면 감사하겠습니다!
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
FSoftObjectPtr과 TSoftObjectPtr차이점
9강 44분쯤 약참조를 위해 FSoftObjectPtr를 쓰시는데 이전에는 TSoftObjectPtr를 쓰셧던거같아, 구글에 검색해보니 TSoftObjectPtr는 FSoftObjectPtr를 UObject로 랩핑한 ptr이라고 하는데요, 그런데 굳이 이걸 명시적으로 나누어진이유가 있을것이고 교수님께서 사용하신 의도가 있는거같아서 궁금해서 여쭈어봅니다 해당부분에서는 FSoftObjectPtr 대신 TSoftObjectPtr를 사용해도 같은 결과를 내긴했습니다. 교수님께서는 그냥 예시를 위해 사용하신건지 아니면 특별한 이유가 있는건지 궁금합니다.
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
9강 20분쯤에 딜리게이트래퍼 질문있습니다.
StateChangeAction.Add(EStageState::READY, FStageChangedDelegateWrapper(FOnStageChangedDelegate::CreateUObject(this, &AABStageGimmick::SetReady)));이부분을 구조체를 선언해서 사용하는 이유가 궁금합니다. StateChangeAction.Add(EStageState::READY, FOnStageChangedDelegate::CreateUObject(this, &AABStageGimmick::SetReady)); 이런식으로 Value를 딜리게이트 자체를 넘겨줄수있는데,굳이 저렇게 구조체를 만드는 이유가 뭔가해서요, 예측하건데 파라미터도 동시에 넣어줄수있도록 하기위함인가요 아니면 따른 이유가 있는건가요 ?
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
점프 공격 시 캡슐 위치 질문입니다.
루트 모션 관련해서 알아보다가 실습 마지막 콤보 모션이 생각나서 확인해보니, 점프했다가 찍는데 캡슐 콜리젼 위치는 변하지 않는 것을 확인했습니다. 애니메이션 시퀀스에서 루트모션을 활성화 시키고 해봐도 더 이상해지는 듯하여 질문드렸습니다...캡슐 콜리전이 애니메이션을 따라가게 하려면, 시퀀스 에셋에서 루트모션 활성화하는 것과 애니메이션 블루프린트에서 루트 모션 모드를 활성화하는 것 말고 다른게 있을까요???
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
16:29 uint8*을 FABCharacterStat*로 다시 형변환 하는이유
항상 친절한 답변 감사합니다. 왜 DataTable의 Value는 uint8*를 쓰게 됐을까가 궁금합니다. TArray<uint8*> ValueArray; DataTable->GetRowMap().GenerateValueArray(ValueArray);GenerateValueArray함수로 데이터 테이블의 모든 벨류를 복사 할때 uint8*형식으로 복사를 진행한후 다시 FABCharacterStat*으로 형변환 하는데요 템플릿으로 FABCharacterStat을 받으면 형변환하지 않고 편하게 사용할 수 있을거 같은데 말이죠.. GPT의 답변인데 이게 맞을까요?DataTable의 각 셀에 저장되는 값은 FString이 아니라 uint8* (unsigned 8-bit integer pointer)로 저장될 때가 있습니다. 이는 다양한 데이터 형식을 다루기 위한 유연성을 제공합니다. uint8*는 메모리의 원시 데이터를 가리키는 포인터로, 이를 사용하여 다양한 데이터 형식을 저장할 수 있습니다. 예를 들어, DataTable에서는 문자열, 숫자, 구조체 등 다양한 데이터를 저장할 수 있습니다. uint8*는 이러한 데이터 형식을 표현하는 데 사용됩니다. 그리고 데이터를 사용할 때는 필요에 따라 해당 데이터 형식으로 변환하여 사용할 수 있습니다.따라서 DataTable이 uint8*를 사용하는 이유는 데이터의 다양성과 유연성을 제공하기 위함이며, 이를 통해 사용자가 필요에 따라 다양한 데이터 형식을 DataTable에 저장하고 활용할 수 있습니다.
- 미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
04:55 구조체 operator+ 부분 확인 질문
코드를 보면 포인터를 이동시켜 각각 더해주는것으로 확인이 되는데요. 이렇게 되려면 구조체가 직렬화 되어야 할거같은데 GENERATED_BODY() 매크로를 선언했기때문에 구조체가 직렬화 돼어서 가능한것이 맞을까요??