월 26,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000004
UE_LOG(LogTemp, Log, TEXT("%s 수업에 입장합니다.")); f로그에 %s등을 넣고 뒤에 *Name을 뺴먹고 Interface 호출시 잘못된 액세스 오류 발생하였습니다. %s를 지워주니까 잘 동작합니다!좋은 강의 해주셔서 감사합니다!
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
객체지향 설계에 대한 질문
안녕하세요, 9강 델리게이트 까지 들은 현재,제가 객체지향 설계에 대해 잘 이해를 한 것인지 잘 모르겠고 궁금한 것이 생겨서 질문 남깁니다. 9강에서 인터페이스를 사용해서 느슨한 결합으로 구현하는 것을 설명해주셨었습니다.강의에서 인터페이스를 구현할 때, 인터페이스를 사용해서 함수를 호출하기 위해서는 특정 클래스를 Cast하여 확인하고 호출했었습니다.그러면 예를 들어 캐릭터에서 아이템 사용 인터페이스를 사용한다고 해도 아이템 클래스 헤더를 include를 해야하는 상황이 발생하는데이 경우에는 인터페이스를 사용했음에도 결합? 의존이 발생한 것이라고 봐야할까요? 그리고 델리게이트 강의에서 중간에서 연결과 활동을 관리하는 주체 클래스가 필요하다고 하셨는데 이 클래스의 경우에는 모든 클래스를 include하여 사용하게 되는데 강한결합을 따지지 않나요? 그리고 강의를 따라가며 이해한 걸로 예시를 들어보았는데 제가 제대로 이해하고 있는 것인지 궁금합니다...좀 길지만 혹시 한번 봐주신다면 정말 감사하겠습니다===============================================================<6강 리플렉션 2>게임에서 다양한 아이템이 있습니다.아이템이라는 클래스를 만들어서 상속시켜 구현을 합니다.아이템 클래스에는 Use라는 가상 함수를 두고 이를 오버라이드 해서 각 아이템의 사용 시 효과를 구현합니다. <7강 인터페이스>사용가능한 아이템이 있고 패시브 효과를 가진 아이템이 있을 수 있기 때문에 Use라는 함수를 UsableItemInterface 등의 인터페이스로 구현하여 상속시켜 구현합니다. <8강 컴포지션>포함관계를 사용하여 복잡한 기능을 클래스를 쉽게 구현합니다.캐릭터 클래스에 아이템 클래스를 include하여 생성하여 아이템의 기능을 사용할 수 있게 합니다. <9강 델리게이트>include 된다면 강한 결합이기 때문에 안좋은 설계 방법이며 인터페이스를 활용하여 구현하여 느슨한 결합을 유지할 수 있습니다.예를 들어 아이템 자체를 include하기 보다는 아이템 사용 함수를 구현한 인터페이스에 의존하게 하여 해당 인터페이스를 구현한다면 다양한 종류의 아이템을 직접 캐릭터에 include하여 변경할 필요없이 사용이 가능하게 됩니다.하지만 매번 인터페이스를 만드는 것이 불편할 수 있으므로 델리게이트를 쓰면 편하고 안정적으로 관리가 가능합니다.캐릭터와 아이템의 의존을 없애기 위해 연결과 활동 주체 클래스를 만듭니다.주체 클래스에서 캐릭터와 아이템을 include하고 캐릭터에 onUse라는 델리게이트를 만들고 이게 호출되면 아이템의 Use가 호출되도록 bind합니다.그러면 캐릭터와 아이템이 의존하지 않고도 사용할 수 있게 되었습니다.===============================================================
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
LogTemp 가 로그창에서 안보입니다 ㅠ
검색창에 LogTemp로 쳐봐도 안보이고 카테고리에도 없는데 따로 설정해야 할것이 있었나요?
- 해결됨이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
빌드 업로드 시
안녕하세요 교수님 항상 양질의 강의에 감사드립니다 🙂 다름이 아니라 유니티 같은 경우 상업용으로 게임 제작 및 빌드 후 스팀에 배포 할 땐 DoNotShip 같은 폴더를 같이 업로드하면 안되는 걸로 알고있습니다. 혹시 언리얼도 위와 같이 스팀에 업로드할 때 같이 올리지 말아야할 폴더 혹은 파일들이 있을까요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
UPROPERTY로 선언되지 않은 언리얼 오브젝트에 대한 궁금증이 있습니다
애초에 언리얼 오브젝트가 UPROPERTY로 선언이 되지 않았다는 것은, 가비지 컬렉터에 의해 관리되지 않고 있다는 것으로 이해했습니다. 그리고 유효하지 않다는 것의 의미 또한 언리얼 오브젝트가 가비지 컬렉션에 의해 관리되지 않고 있다는 것으로 이해했습니다.그렇다면 NonPropStudent는 시작부터 "유효하지 않은 언리얼 오브젝트"여야 하지 않나요?왜 3초가 지나기 전에 Shutdown을 시키면 UPROPERTY로 선언되지 않은 오브젝트 객체인 NonPropStudent 가 "유효한 언리얼 오브젝트"라고 로그가 뜨는 건가요? 언리얼 오브젝트가 가비지 컬렉터에 의해 회수가 되는 것과 애초에 가비지 컬렉터에 의해서 관리되지 않는 것은 다른 의미 아닌가요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
첫 검증테스트에선.
포인터의 값이 nullptr인지로는 가리키는 객체가 있는지 판별이 부정확하다는것과,유효하기위해선 UPROPERTY매크로를 사용해야한다는것. //정확한 결과를 보기위해선.. if (NonPropStudent->IsValidLowLevel()) { UE_LOG(LogTemp, Log, TEXT("[NonPropStudent] 유효한 언리얼 오브젝트")); } else { UE_LOG(LogTemp, Log, TEXT("[NonPropStudent] 널 포인터")); } if (PropStudent->IsValidLowLevel()) { UE_LOG(LogTemp, Log, TEXT("[PropStudent] 유효한 언리얼 오브젝트")); } else { UE_LOG(LogTemp, Log, TEXT("[PropStudent] 널 포인터")); }//결과로그LogTemp: [NonPropStudent] 널 포인터LogTemp: [PropStudent] 유효한 언리얼 오브젝트이렇다는 말씀이죠?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
46분에 커스텀 구조체에 대한 GetTypeHash()에 대한 질문이 있습니다.
GetTypeHash()는 FStudentData 구조체를 입력으로 받아서 해당 구조체의 Order 멤버 변수를 기반으로 해시 값을 생성한다고 이해하면 되나요? 즉, return GetTypeHash(InStudentData.Order);이 부분은 FStudentData의 구조체의 Order 멤버 변수를 입력으로 받아서해당 값을 해싱한 결과를 반환하는 것이라고 이해하면 될까요? 또한, TSet에 저장된 FStudentData객체의 멤버변수 Name은 중복이 될 수 있지만, Order는 중복이 될 수 없는 거로 이해했는데 잘 이해한 건가요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
자주 뜨는 컴파일에러.
5>Done building project "BuildGraph.Automation.csproj" -- FAILED.6>Done building project "AutomationScripts.Automation.csproj" -- FAILED. 이 두개의 빌드실패가 거의 항상있습니다. PIE 실행에는 영향없는거같은데, 해결할수 있는 방법이 있을까요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
코드 복붙 문제...
왜 코드들을 복붙하기만 하면 꼬일까요?1. 복붙한 코드들의 API명을 새 플젝명으로 바꿔써도 빌드에 문제가 생기고, 에러들이,내가 만들지않은 엔진의 코드들이 에러났다고 표시가 되요.2. 그리고 GameBase가 생기질 않았습니다. 다시보니,이전의 다른 플젝들도요. 별도의 세팅이 필요한가요?"디버깅을 위한 편집기호"는 설치했습니다.3. 파일복사에서 너무 해매서.,언리얼플젝을 통으로 카피해서,vs파일을 열어 컴파일을 하니, 그 플젝은 디버깅이 안되고, 복사후, 새로 추가한 클래스는 컨텐츠창에 안뜹니다.vs에는 있습니다.<-이렇게 쓰면 안되는건가요?4. 결국은 그래서, 강의바뀔때마다, 같은걸 다시 만들고있는데,(코딩연습으로는 좋겠지만...)강의에서 멀쩡히 되는부분이 안되서 너무 찜찜합니다. 5.3사용합니다.
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
6강 마지막 내용 부분 크래쉬 오류
rtbaseucrtbaseucrtbaseucrtbaseUnrealEditor_CoreUnrealEditor_ObjectReflection!DispatchCheckVerify<void,<lambda_cf21b4e29d6226a2d775ca19e16af934>,FLogCategoryLogTemp,wchar_t [16]>() [C:\Program Files\Epic Games\UE_5.1\Engine\Source\Runtime\Core\Public\Misc\AssertionMacros.h:171]UnrealEditor_ObjectReflection!UStudent::DoLesson() [C:\UnrealProject\ObjectReflection\Source\ObjectReflection\Student.cpp:18]UnrealEditor_ObjectReflection!UMyGameInstance::Init() [C:\UnrealProject\ObjectReflection\Source\ObjectReflection\MyGameInstance.cpp:56]UnrealEditor_EngineUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditor_UnrealEdUnrealEditorUnrealEditorUnrealEditorUnrealEditorUnrealEditorUnrealEditorkernel32ntdll6강 보면서 하는데 선생님하신것처럼 Student->DoLesson();이후부터 저 코드를 주석을 처리하든 말든 무조건 실행시 언리얼엔진이 크래쉬를 일으킵니다 내용 대로 Student 클래스랑 init도 다시 확인했는데 정상이고요 따로 문제가 있을까요? #include "MyGameInstance.h" #include "Student.h" #include "Teacher.h" UMyGameInstance::UMyGameInstance() { SchoolName = TEXT("School"); } void UMyGameInstance::Init() { Super::Init(); UE_LOG(LogTemp, Log , TEXT("==============================")); UClass* ClassRuntime = GetClass(); UClass* ClassCompile = UMyGameInstance::StaticClass(); check(ClassRuntime==ClassCompile); UE_LOG(LogTemp,Log,TEXT("School Class Name : %s"), *ClassRuntime->GetName()); SchoolName = TEXT("Normal School"); UE_LOG(LogTemp,Log,TEXT("School Name : %s"), *SchoolName); UE_LOG(LogTemp,Log,TEXT("School Name Nomal : %s"),*GetClass()->GetDefaultObject<UMyGameInstance>()->SchoolName) UE_LOG(LogTemp, Log , TEXT("==============================")); UStudent* Student = NewObject<UStudent>(); UTeacher* Teacher = NewObject<UTeacher>(); Student->SetName(TEXT("Student 1")); UE_LOG(LogTemp, Log , TEXT("New Student Name %s"),*Student->GetName()); FString CurrentTeacherName; FString NewTeacherName(TEXT("QWER")); FProperty* NameProp = UTeacher::StaticClass()->FindPropertyByName(TEXT("Name")); if (NameProp) { NameProp->GetValue_InContainer(Teacher,&CurrentTeacherName); UE_LOG(LogTemp,Log , TEXT("Current Teacher Name %s "),*CurrentTeacherName); NameProp->SetValue_InContainer(Teacher , &NewTeacherName); UE_LOG(LogTemp,Log , TEXT("New Teacher Name %s "),*Teacher->GetName()); } UE_LOG(LogTemp, Log , TEXT("==============================")); Student->DoLesson(); UFunction* DoLessonFunnc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson")); if (DoLessonFunnc) { Teacher->ProcessEvent(DoLessonFunnc,nullptr); } }
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
컴파일 관련 질문드립니다
안녕하세요. 언리얼엔진 초보입니다.1강 컴파일규칙에서 헤더파일이 변경되면 에디터를 끄고 vs에서 컴파일 하라고 되어있는데요 그 이후 강의에서는 가끔씩 그냥 라이브코딩으로 컴파일 하시던데 정확히 어떤 경우에 에디터를 끄고 컴파일 해야하는지 헷갈립니다. 혹시 헤더파일이 변경되어도 그냥 라이브코딩으로 컴파일하는 예외 경우가 있나요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
TCHAR 부분 빌드 오류 인데 모르겠습니다.
TCHAR로 로그에 Hello Unreal 찍는 3강 내용인데 언리얼엔진도 5.1로 바꿔보았는데도 선생님이랑 코드 똑같이 치고 비주얼스튜디오에서 빌드하면 에러 나오고 언리얼 출력로그에도 당연히 출력이 안됩니다. 무엇이 문제인지 모르겠어요
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
const에 대한 질문
안녕하세요. Part1 8강을 듣다가 의문이 생겨서 질문드립니다!FORCEINLINE const FString& GetName() const { return Name; };강의에서 위의 경우 함수 뒤에 const를 사용시 return 되는 Name에 빨간 줄(오류)이 들어와 반환값에도 const를 붙여준 경우인데요. 이러한 이유는 반환 값에 const를 안 붙이게 되면 참조로 반환되기 때문에 값이 변경될 수 있고 이는 함수 뒤에 붙은 const의 의미가 없어지는 것이라고 하셨습니다. 이 부분까지는 이해가 잘되었습니다. FORCEINLINE class UCard* GetCard() const { return Card; }그런데 위의 경우에도 포인터로 반환이 되기 때문에 마찬가지로 값이 변경되는 경우가 발생하지 않나요? 그런데 이 부분에서는 오류로 인식을 안 하는지 궁금합니다. const가 제대로 역할을 하고 있지 않다고 생각이 드는데 교수님의 의견을 여쭤보고 싶습니다. 감사합니다.
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
파트1 강의에 대한 내용을 전부 알려면 무엇이 필요한가요?
파트1 강의에 대한 내용을 전부 알려면 c++ 의 어떠한 기능을 숙지하고 있어야 하나요?c++ 을 전부 마스터 해야 하나요? 아니면 특정 파트만 배우면 이 내용이 이해가 되나요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
언리얼엔진 물리 매터리얼 리빌드 문제
언리얼 엔진 5.3.2 버전 프로젝트 빈 것으로 생성시 랜드스케이프 물리 매터리얼을 리빌드해야한다고 아래 이미지처럼 화면에 빨간 글씨로 적히는데, 아예 새 프로젝트에서 생기는 에러다보니 어떻게 해결해야할지 모르겠어서 글 남겨요 .. 아래 세가지 시도를 해보았는데 해결이 안되었어요 ..Build > Build LandscapeBuild > Physical material onlyBuild > Build All Levels
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
저장되는 파일이 UTF-16 LE로 인코딩됩니다
문제 및 조건Name변수에는 "이득우"문자열을 저장했습니다Json으로 저장된 파일을 열어보면 UTF-16 LE로 인코딩돼있습니다..txt로 파일을 저장하고 메모장으로 열어도 UTF-16 LE로 인코딩 돼있습니다..cpp파일들은 전부 UTF-8로 확실하게 저장했습니다.코드는 Json으로 읽고 쓰기 부분만 첨부드렸지만 바이너리로 저장한 파일도 불러오면 한글만 깨져있습니다.운영체제는 윈도우11, 언리얼 에디터는 5.3.1버전입니다. LogTemp 첨부LogTemp: 저장할 파일 폴더: ../../../../../../UE5_Inflearn/Part1/UnrealSerialization/Saved LogTemp: 저장할 파일전체 경로: ../../../../../../UE5_Inflearn/Part1/UnrealSerialization/Saved/RawData.bin LogTemp: 변경할 파일전체 경로: E:/UE5_Inflearn/Part1/UnrealSerialization/Saved/RawData.bin LogTemp: [RawData] 이름 이득우 순번 16 LogTemp: [ObjectData] 이름 ↓ンᄡ→モン↓レᄚ 순번 59 LogTemp: [JsonData] 이름 ↓ンᄡ→モン↓レᄚ 순번 59작성한 코드의 Json 읽고 쓰기 부분은 이렇습니다.// Json으로 읽고 쓰기 { FString JsonDataFileName(TEXT("StudentJsonData.json")); FString JsonDataAbsolutePath = FPaths::Combine(*SavedDir, *JsonDataFileName); FPaths::MakeStandardFilename(JsonDataAbsolutePath); // "JsonObjectConverter.h" include 필요 //!중요 [프로젝트 명].build.cs파일에 Json관련 모듈 2개를 추가해줘야함 // 공유 레퍼런스 - Null이 아님을 보장함 TSharedRef<FJsonObject> JsonObjectSrc = MakeShared<FJsonObject>(); // 이렇게하면 StudentSrc 오브젝트의 값이 Json으로 변환이 됨 FJsonObjectConverter::UStructToJsonObject(StudentSrc->GetClass(), StudentSrc, JsonObjectSrc); // 파일로 디스크에 저장 FString JsonOutString; TSharedRef<TJsonWriter<TCHAR>> JsonWriterAr = TJsonWriterFactory<TCHAR>::Create(&JsonOutString); if (FJsonSerializer::Serialize(JsonObjectSrc, JsonWriterAr)) { FFileHelper::SaveStringToFile(JsonOutString, *JsonDataAbsolutePath); } FString JsonInString; FFileHelper::LoadFileToString(JsonInString, *JsonDataAbsolutePath); TSharedRef<TJsonReader<TCHAR>> JsonReaderAr = TJsonReaderFactory<TCHAR>::Create(JsonInString); // 파일에 문제가 있으면 Json이 안만들어질 수 있으므로 Null을 허용하는 TsharedPtr사용 TSharedPtr<FJsonObject> JsonObjectDest; if (FJsonSerializer::Deserialize(JsonReaderAr, JsonObjectDest)) { UStudent* JsonStudentDest = NewObject<UStudent>(); if (FJsonObjectConverter::JsonObjectToUStruct(JsonObjectDest.ToSharedRef(), JsonStudentDest->GetClass(), JsonStudentDest)) { PrintStudentInfo(JsonStudentDest, TEXT("JsonData")); } } } 이 문제가 언리얼 에디터 버전때문일까요?아님 제가 코드를 잘못 작성한걸까요?테스트를 좀 해보니 최종 파일의 인코딩은 상관 없었습니다.FFileHelper::SaveStringToFile(JsonOutString, *JsonDataAbsolutePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);이렇게 강제로 UTF8로 인코딩해도 똑같더라고요그래서 Json을 Serialize할 때 파일 저장 직전 Serialize된 문자열 로그를 찍어봤습니다.TSharedRef<TJsonWriter<TCHAR>> JsonWriterAr = TJsonWriterFactory<TCHAR>::Create(&JsonOutString); if (FJsonSerializer::Serialize(JsonObjectSrc, JsonWriterAr)) { UE_LOG(LogTemp, Log, TEXT("JsonOut: %s"), *JsonOutString); // 이 부분 FFileHelper::SaveStringToFile(JsonOutString, *JsonDataAbsolutePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM); }저기서부터 이미 한글Name이 깨져있네요 아래처럼 출력됐습니다.[2024.03.12-06.33.03:029][ 12]LogTemp: JsonOut: { "order": 59, "name": "↓ンᄡ→モン↓レᄚ" } 일단 더 찾아보겠습니다
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
8강 Enum class의 MetaData 가져올 때, 질문 있습니다.
안녕하세요. 강의 정말 잘 듣고 있습니다. 8강을 수강하다 궁금한 점이 생겨 질문드립니다. UEnum을 가져올 때, 아래와 같이 모든 패키지에서 검색하여 가져오는 방법은 좋지 않은건지 궁금합니다.const UEnum* CardEnumType = FindObject<UEnum>(ANY_PACKAGE, TEXT("ECardType"), true); DisplayName을 가져올때도 아래처럼 GetMetaData() 함수를 사용하는 것은, 일반적이지 않은 방법인지 궁금합니다.FString CardMetaData = CardEnumType->GetMetaData(TEXT("DisplayName"), (int32)CardType - 1); 읽어주셔서 감사합니다.
- 해결됨이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
스마트 포인터와 FGCObject 클래스 사용에 대한 차이점
여러 포인터 문제의 해결 방법에 대해서 얘기를 해주셨는데언리얼 오브젝트와 C++ 오브젝트의 각각의 경우에 대해 해결 방법을 정리해주신 슬라이드가 있었습니다.거기에서는 C++ 오브젝트는 스마트 포인터를 활용해서 직접 관리한다고 하셨는데, 이후 슬라이드부터는 C++ 오브젝트에서 FGCObject 클래스의 특정 함수 두 개를 구현하면 해당 오브젝트를 가비지 컬렉터가 관리하도록 할 수 있다고 하셨습니다. C++ 오브젝트의 메모리를 관리하는 방법이 두 가지가 있는 것인가요? 이런 경우 어떤 차이가 있나요?아니면 제가 잘못 이해한 것인가요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
27:20 쯤 LessonInterface->DoLesson(); 코드에 대해 질문드립니다!
LessonInterface는 이미 Person 오브젝트가 ILessonInterface 클래스로 형변환이 된 것이므로 ILessonInterface의 DoLesson() 함수만 호출이 될 것이라 생각했는데, 형변환 전 기존의 Person 오브젝트가 가지고 있던 DoLesson() 함수도 호출이 같이 되네요. 혹시 이 부분에 대해 설명해 주실 수 있을까요?
- 미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
코딩 표준 In/Out 질문
2장 코딩 표준 도중 잘 이해가 안 가는 부분이 있습니다. 함수 파라미터가 레퍼런스인 경우에 관해서파라미터의 명명 규칙에 In/Out 접두사를 붙이는 부분을 설명해주셨는데요.교수님께서는 함수가 끝난 이후에 인자가 밖으로 나와서 계속 사용될 것인지 여부를 In/Out 접두사로 나타내라고 하셨습니다.근데 교수님께서 설명해주신 거랑 코딩 표준에 적혀 있는 것이랑 조금 내용이 다른 것 같아서 질문합니다.한국어 번역이 이상한 것 같아서 영문으로 보니까 다음과 같습니다.Though not required, we encourage you to prefix function parameter names with "Out" if they are passed by reference, and the function is expected to write to that value. This makes it obvious that the value passed in this argument will be replaced by the function. 함수 파라미터에 레퍼런스로 전달된 값을 함수가 변경할 지 아닐지 여부를 In/Out 접두사로 나타낼 것을 권장한다. 함수에서 파라미터의 내용을 변경하는 경우 Out 접두사를 붙여라.영어에 자신이 없는데, 혹시 이렇게 이해하는 것이 맞을까요? 교수님께서 중요하게 생각하신다고 해서 정확히 하고 넘어가고 싶습니다. ㅎㅎ