묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
BP에서 노드 정리하는 단축키가 뭘까요??
BP에서 노드 정리하시는걸 단축키로 하시는 것 같은데찾아봐도 강사님처럼 노드 정리하는 옵션을 찾을 수가 없네요...
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
수업 자료들 어디서 다운 받아요?
프로젝트 는 보이는데 수업때 쓰신 사진 자료들 모아놓은 곳은 따로 있을까요?
-
미해결[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
Cosmetic#1 강의 중 "Network Serialize Array"에 대하여
Cosmetic#1 강의 중 22분경에 CharacterPart에 대한 정보 단위를 'List'와 'Entry'로 나누는 이유에 대한 질문입니다.언리얼 네트워크에 Array의 수정사항을 요청할때, Array 전체를 보내는 것이 아닌 수정된 Array의 일부분만 요청해서 수정할수있게하는게 "Network Serialize Array 문법"이라고 하셨는데요.이 부분에 대해서 구글링 해보려하는데 정보를 찾을수가 없어서 혹시 참고할만한 링크 부탁드려도 될까요???
-
미해결[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
HandleChangeInitState
HandleChangeInitState 함수로 디버깅을 진행할 떄마다, 이전에 넣었던 매개변수 중 FGameplayTag 들 모두 illegal_Name으로 받아와 인식을 못하는 오류가 있는데, 어디서부터 봐야할지 막막합니다
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
섹션5 InitState에서 궁금한점이 있습니다
void FHakGameplayTags::AddAllTags(UGameplayTagsManager& Manager)이 함수에서 Manager를 사용하고 있지 않는데 전달하는 이유가 뭔가요?
-
미해결[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
[섹션 14 Weapon Impacts] NS_ImpactConcrete, ... 등이 Migrate 되지 않음
안녕하세요. Weapon Impacts 강의를 수강하고 있습니다.Lyra 프로젝트에서 NS_ImpactConcrete 등을 Migrate하는 과정을 수행하고자 하는데, 다음과 같은 assertion failed 에러가 발생하며 엔진이 강제 종료되는 문제가 발생하였습니다. LoginId:e0fc4ff04603c244ee09fb9136815b0b EpicAccountId:32f42a962d744041bf35dec93c7fe384 Assertion failed: Ret [File:D:\build\++UE5\Sync\Engine\Plugins\FX\Niagara\Source\Niagara\Public\NiagaraDataChannelHandler.h] [Line: 43] UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Niagara UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_UnrealEd UnrealEditor_UnrealEd UnrealEditor_LyraEditor!ULyraEditorEngine::Tick() [D:\build\++UE5\Sync\LocalBuilds\Lyra\Windows\Source\LyraEditor\LyraEditorEngine.cpp:39] UnrealEditor UnrealEditor UnrealEditor UnrealEditor UnrealEditor UnrealEditor kernel32 ntdllNiagaraDataChannelHandler.h의 43번줄 코드를 보니 다음과 같은데, 나이아가라의 데이터 채널을 가져오는 과정에서 문제가 발생하는 것 같습니다.const UNiagaraDataChannel* GetDataChannel() const { const UNiagaraDataChannel* Ret = DataChannel.Get(); check(Ret); return Ret; }검색해보니 나이아가라 플러그인 버전 문제일 가능성이 있다고 하는데, 별도로 나이아가라 플러그인 설정을 건드린 적은 없는 것으로 기억해 원인을 찾기가 어려운 상황에 있습니다. 혹시 몰라 Build.cs 파일에 의존 모듈 이름으로 "Niagara"를 추가해봤지만 여전히 되지 않는 상황입니다. 해당 섹션 내용을 정리한 노션 페이지 입니다. 혹시 문제가 있는 부분이 있는 지 확인해주시면 감사하겠습니다...
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
수업자료 공유
강의에서 사용하는 도식들을 수업자료 통해서 공유해주실 수 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
5:34 에서 uproject변환이 안됩니다
{ "FileVersion" : 3, "EngineAssociation" : "5.1"} 이렇게 쓰고 uproject로 바꿨는데 확장자가 그대로 메모장으로 뜹니다
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
강의 내용과는 상관없지만 강의에 사용하는 PC 사양 알 수 있을까요??
PC가 오래돼서 그런지 느린것 같아서 새로 구입하려고 하는데,강의에서 사용하는 PC사양이 어느 정도인지 궁금해서 질문 남깁니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
c++파일의 삭제에 관하여 질문드립니다.
안녕하세요. 교수님 파일명 변경에 관하여 질문드리고 싶습니다. Character를 만들때 이름을 MyABCharacter로 잘못지은 바람에, MyABCharacter를 ABCharacter로 수정하고 싶어 visual studio에서 삭제를 했습니다. 그러나 언리얼 에디터의 C++ classes에서는 MyABCharacter가 사라지고 있지 않아 질문드립니다. 어떻게 해야할까요? 추가적으로 이런 상황에서 파일의 이름을 변경하고 싶을때는 어떻게 해야하는지 질문드립니다. 에디터에서 auto로 제공하고 있는 기능이 있는지 궁금합니다.
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
GameFeatureAction_AddInput #1 강의를 수강한 후 궁금한 점이 생겼습니다.
안녕하세요 언제나 좋은 배움의 기회를 제공해주셔서 감사드립니다.특히 지금 수강하고 있는 Lyra 클론 코딩을 통해 모범적이고 체계적인 언리얼 엔진 코드 구조를 배울 수 있어 너무 기쁩니다.GameFeatureAction_AddInput #1 를 수강한 후에 제 나름대로 엔진 Subsystem을 사용하는 이유를 아래와 같이 정리하였습니다.혹시 틀린 부분이 있는지 궁금합니다. 첫번째로, GameFeature 플러그인 별로 생성된 GameFeatureSubsystem이 자신의 플러그인의 Action을 활성화하는데GameFeature 플러그인끼리의 전환이 빈번한 상황에서 이전에 사용한 플러그인이 비활성화되면 해당 플러그인의 SubSystem도 비활성화되고 Action 역시 비활성화된다.이런 경우에 FGameFeatureActivatingContext는 비활성화된 Action을 참조하게 되므로 문제가 발생한다.두번째로, FGameFeatureActivatingContext는 플러그인마다 존재하므로 모든 플러그인에 대해 바인딩을 할 수 없으므로 EngineSubsystem의 Context를 사용하는 것이 합리적이다. 위와 같이 정리하였는데 틀린 부분이 있는지 알고 싶습니다.다시한번 언제나 좋은 배움의 기회를 제공해주셔서 감사합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
ConstructorHelpers에서 찾고자 하는 것이 오브젝트인지, 클래스인지 보는 방법이 있나요??
안녕하세요, 생성자도우미에서 경로로 애셋을 찾을 때, 오브젝트인지 클래스인지 구별하는 어떻게 확인하는지 궁금합니다. 임의로 타입정보 같아서, 위 정보를 참조 해 왔는데 Object로 가져와 지는걸 보니 아닌 것 같습니다. 감사합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
2강 [14:38] 레퍼런스 경로 가져오기 질문드립니다.
안녕하세요,1강에서 ConstructorHelpers로 find class 할 때는, 에셋 경로 위치에서 /Game 전에 있는 경로는 지우고 데이터를 읽어 왔습니다.이번에 2강에선 find object할 때 는 따로 경로를 수정하지 않으시더라구요. 둘다 인자로 받는것도 TEXT 주소값이고, 컴파일 과정에서는 에러 안나는거보면 엔진이 초기화 되다가 일어나는 문제인데 '/Game' 앞에 있는 저 경로가 ConstructorHelpers에 find object / class를 사용 함에 있어서 어떤 영향을 주고 왜 다르게 써야 하는지 궁금합니다. 감사합니다.
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
강의 내용 문의드립니다.
수강 이제 막 시작했는데요섹션1부터18까지의 수업과 섹션19는 강사분만 다르고 내용은 같다고 생각하면 될까요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
45.26 해시값이라는건 구조체형식으로 TSet을 만들때 필요한건가요?
TSet<FString> AllUniqueNames;for (int32 idx = 0; idx < StudentNum; ++idx){AllUniqueNames.Emplace(MakeRandomName());} 이 코드는 빌드해도 따로 해시값을 만들수 없다는 오류가 안떠서그런데 결론을 내보자면구조체로만든 TSet같이 특정 데이터를 구분하기위한 해시값이 필요한경우가 있고위의코드처럼 TSet을만들면 값을 1개만 받는거라서 FString자체가 해시값이되서오류가 안뜨는걸까요?
-
해결됨이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
Coudn't set association for project. Check the file is writeable. 이라는 에러가 뜹니다.
(윈도우11)12:33 까지 따라한 상태이며, 모듈까지 삽입한 후 UnrealBuildSystem.uproject 를 실행하였으나라는 에러가 뜹니다. 제가 옮긴 Binaries->Win64 내부 파일들은이것이며.txt에는로 적혀서 저장되어 있습니다. 혹시 어떤 문제때문에 에러가 뜬지 알수 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
언제 public을 쓰고 언제 protected를 써야 하나요?
헤더함수에서 public과 protected를 각각 언제 써야하는지 헷갈립니다. 예를 들어 2강에서, ABFountain.h에서는 컴포넌트들을 public으로 선언했고 ABCharacterPlayer.h에서는 컴포넌트들을 protected로 선언했는데 차이가 궁금합니다. 그리고 항상 BeginPlay는 protected로, Tick은 public으로 선언되어 있는데 이 부분도 왜 그런지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
init()에서 LoadStudentObject() 이 함수가 런타임 정적로딩이라고 보면 되나요?
void UMyGameInstance::LoadStudentObject() const 이 함수가 에셋의 로딩전략중2번째에 해당하는 런타임 로직에서 정적로딩을 하는게맞나요?21:54 로딩전략의 각각의 차이점이 잘 감이 오질않는데요 런타임로직에서 정적로딩을 한다는것은 에셋 크기가 클수록 부하가 엄청 커지겟지만작은에셋들을 바로 로딩할때 간편하게 쓰기위함이고 생성자 코드에서 미리 로딩을한다면프로젝트가 켜지는 속도는 느리겠지만에셋을 사용할땐 빠르겠고 관리자를 사용해 비동기로딩이라는것은게임이 진행되는 와중에 당장은 에셋을 쓰진않지만언젠간 쓸 에셋들을 계속해서 꾸준히 싱글턴클래스에서로딩을 한다는건가요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
스마트포인터에 관하여 질문이 있습니다.
안녕하세요 교수님. 스마트포인터로 파일읽기를 한 후, close()를 통해 파일을 닫는데 스마트 포인터를 통해서는 자동으로 파일을 닫는 행위는 할 수 없는건지가 궁금해서 질문남깁니다. (포인터 할당 종료만 가능한건지) 감사합니다.
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
15:22에서 TopStudent 가 보이지 않는 문제가 있습니다.
출력로그까지 정상적으로 뜨는데, contents 폴더에서 TopStudent가 보이지 않습니다. TopStudent 가 나타나지 않는 이유가 궁금합니다.일단 코드를 강의코드와 비교하며 개인적으로 재검토를 하였는데, 제가 다시 놓친 무언가가 있는 것인지, 아니며ㅑㄴ 현재 버전에서는 보이지 않게 된 것인지 궁금합니다.DebugGame Editor로 실행하였으며, 출력로그 및 코드 내용은 다음과 같습니다.(출력로그)LogTemp: 저장할 파일 폴더 : ../../../../../../Users/qkrwo/Documents/Unreal Projects/UnrealSerialization/SavedLogTemp: 저장할 파일 전체 경로 : ../../../../../../Users/qkrwo/Documents/Unreal Projects/UnrealSerialization/Saved/RawData.binLogTemp: 변경할 파일 전체 경로 : C:/Users/qkrwo/Documents/Unreal Projects/UnrealSerialization/Saved/RawData.binLogTemp: [RawData] 이름 이득우 순번 16LogTemp: [ObjectData] 이름 이득우 순번 59LogTemp: [JsonData] 이름 이득우 순번 59LogTemp: 패키지가 성공적으로 저장되었습니다. (Student.h)// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "UObject/NoExportTypes.h"#include "Student.generated.h"/****/UCLASS()class UNREALSERIALIZATION_API UStudent : public UObject{GENERATED_BODY()public:UStudent();int32 GetOrder() const { return Order; }void SetOrder(int32 InOrder) { Order = InOrder; }const FString& GetName() const { return Name; }void SetName(const FString& InName) { Name = InName; }virtual void Serialize(FArchive& Ar) override;private:UPROPERTY()int32 Order;UPROPERTY()FString Name;};(Student.cpp)// Fill out your copyright notice in the Description page of Project Settings.#include "Student.h"UStudent::UStudent(){Order = -1;Name = TEXT("홍길동");}void UStudent::Serialize(FArchive& Ar){Super::Serialize(Ar); Ar << Name;Ar << Order;}(MyGameInstance.h)// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Engine/GameInstance.h"#include "MyGameInstance.generated.h"struct FStudentData{FStudentData() {}FStudentData(int32 InOrder, const FString& InName) : Order(InOrder), Name(InName) {} friend FArchive& operator<<(FArchive& Ar, FStudentData& InStudentData){Ar << InStudentData.Order;Ar << InStudentData.Name;return Ar;}int32 Order = -1;FString Name = TEXT("홍길동");};/****/UCLASS()class UNREALSERIALIZATION_API UMyGameInstance : public UGameInstance{GENERATED_BODY()public:UMyGameInstance();virtual void Init() override;void SaveStudentPackage() const;private:static const FString PackageName;static const FString AssetName;UPROPERTY()TObjectPtr<class UStudent> StudentSrc;};(MyGameInstance.cpp)// Fill out your copyright notice in the Description page of Project Settings.#include "MyGameInstance.h"#include "Student.h"#include "JsonObjectConverter.h"#include "UObject/SavePackage.h"const FString UMyGameInstance::PackageName = TEXT("/Game/Student");const FString UMyGameInstance::AssetName = TEXT("TopStudent");void PrintStudentInfo(const UStudent* InStudent, const FString& InTag){UE_LOG(LogTemp, Log, TEXT("[%s] 이름 %s 순번 %d"), InTag, InStudent->GetName(), InStudent->GetOrder());}UMyGameInstance::UMyGameInstance(){}void UMyGameInstance::Init(){Super::Init();FStudentData RawDataSrc(16, TEXT("이득우"));const FString SavedDir = FPaths::Combine(FPlatformMisc::ProjectDir(), TEXT("Saved"));UE_LOG(LogTemp, Log, TEXT("저장할 파일 폴더 : %s"), *SavedDir);{const FString RawDataFileName(TEXT("RawData.bin"));FString RawDataAbsolutePath = FPaths::Combine(*SavedDir, *RawDataFileName);UE_LOG(LogTemp, Log, TEXT("저장할 파일 전체 경로 : %s"), *RawDataAbsolutePath);FPaths::MakeStandardFilename(RawDataAbsolutePath);UE_LOG(LogTemp, Log, TEXT("변경할 파일 전체 경로 : %s"), *RawDataAbsolutePath);FArchive* RawFileWriterAr = IFileManager::Get().CreateFileWriter(*RawDataAbsolutePath);if (nullptr != RawFileWriterAr){*RawFileWriterAr << RawDataSrc;RawFileWriterAr->Close();delete RawFileWriterAr;RawFileWriterAr = nullptr; }FStudentData RawDataDest;FArchive* RawFileReaderAr = IFileManager::Get().CreateFileReader(*RawDataAbsolutePath);if (nullptr != RawFileReaderAr){*RawFileReaderAr << RawDataDest;RawFileReaderAr->Close();delete RawFileReaderAr;RawFileReaderAr = nullptr;UE_LOG(LogTemp, Log, TEXT("[RawData] 이름 %s 순번 %d"), *RawDataDest.Name, RawDataDest.Order);}}StudentSrc = NewObject<UStudent>();StudentSrc->SetName(TEXT("이득우"));StudentSrc->SetOrder(59);{const FString ObjectDataFileName(TEXT("ObjectData.bin"));FString ObjectDataAbsolutePath = FPaths::Combine(*SavedDir, *ObjectDataFileName);FPaths::MakeStandardFilename(ObjectDataAbsolutePath);TArray<uint8> BufferArray;FMemoryWriter MemoryWriterAr(BufferArray);StudentSrc->Serialize(MemoryWriterAr);if (TUniquePtr<FArchive> FileWriterAr = TUniquePtr<FArchive>(IFileManager::Get().CreateFileWriter(*ObjectDataAbsolutePath))){*FileWriterAr << BufferArray;FileWriterAr->Close();}TArray<uint8> BufferArrayFromFile;if (TUniquePtr<FArchive> FileReaderAr = TUniquePtr<FArchive>(IFileManager::Get().CreateFileReader(*ObjectDataAbsolutePath))){*FileReaderAr << BufferArrayFromFile;FileReaderAr->Close();}FMemoryReader MemoryReaderAr(BufferArrayFromFile);UStudent* StudentDest = NewObject<UStudent>();StudentDest->Serialize(MemoryReaderAr);PrintStudentInfo(StudentDest, TEXT("ObjectData"));}{const FString JsonDataFileName(TEXT("StudentJsonData.txt"));FString JsonDataAbsolutePath = FPaths::Combine(*SavedDir, *JsonDataFileName);FPaths::MakeStandardFilename(JsonDataAbsolutePath);TSharedRef<FJsonObject> JsonObjectSrc = MakeShared<FJsonObject>();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); TSharedPtr<FJsonObject> JsonObjectDest;if (FJsonSerializer::Deserialize(JsonReaderAr, JsonObjectDest)){UStudent* JsonStudentDest = NewObject<UStudent>();if (FJsonObjectConverter::JsonObjectToUStruct(JsonObjectDest.ToSharedRef(), JsonStudentDest->GetClass(), JsonStudentDest)){PrintStudentInfo(JsonStudentDest, TEXT("JsonData"));}}} SaveStudentPackage();}void UMyGameInstance::SaveStudentPackage() const{UPackage* StudentPackage = CreatePackage(*PackageName);EObjectFlags ObjectFlag = RF_Public | RF_Standalone;UStudent* TopStudent = NewObject<UStudent>(StudentPackage, UStudent::StaticClass(), *AssetName, ObjectFlag);TopStudent->SetName(TEXT("이득우"));TopStudent->SetOrder(36);const int32 NumofSubs = 10;for (int32 ix = 1; ix <= NumofSubs; ++ix){FString SubObjectName = FString::Printf(TEXT("Student%d"), ix);UStudent* SubStudent = NewObject<UStudent>(TopStudent, UStudent::StaticClass(), *SubObjectName, ObjectFlag);SubStudent->SetName(FString::Printf(TEXT("학생%d"), ix));SubStudent->SetOrder(ix);}const FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());//UE_LOG(LogTemp, Log, TEXT("PakageFileName : %s"), *PackageFileName);FSavePackageArgs SaveArgs;SaveArgs.TopLevelFlags = ObjectFlag; if (UPackage::SavePackage(StudentPackage, nullptr, *PackageFileName, SaveArgs)){UE_LOG(LogTemp, Log, TEXT("패키지가 성공적으로 저장되었습니다."));}}UnrealSerialization.Build.cs 에서PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "Json", "JsonUtilities" });를 정상적으로 삽입하였습니다.