묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
언리얼 엔진 C++ 가변 배열에 대해서
저는 최근에 면접 키워드를 정리하면서 가변 배열에 대해 알게되었는데 정보가 너무 오락가락이여서 여쭈어 봅니다. C#의 가변배열을(Jegged Array) 라 불리고보통 영어로 번역하면 Variable Array 변하는 배열 이라고도 하는데. Dynamic Array가 현재 TArray 개요에서 나오는데 이것은 동적 배열을 의미해서 해당 C++에서 new와 malloc과 같은 방식의 할당 방식을 의미하는 것이라고 알고 있는데, 위와 같이 모든 어원적 의미는 다 동일한 것인가요?또C++ 가변 배열은 결국 구조체를 생성해서 해야하는 것인지?아니면 그냥 C++자체적으로 구현하는 방법이 있는 것인지. 1. Jagged Array, Variable Array, Dynamic Array는 모두 같은 가변배열인 것인지. 2. C++ 에서 말하는 가변배열이 언리얼 에서 말하는 TArray의 가변배열과 동일한 것인지.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
람다 함수 캡쳐 관련 질문
안녕하세요 교수님, 람다 함수 캡쳐 관련 질문이 있어서 글을 올렸습니다. fps 프로젝트를 만들고 있는데, VICharacter 에서 reload 를 호출하면 VIWeaponbase를 상속받는 AKWeapon 에서 Reload 함수가 호출이 되는 형식입니다.VICharacter 에 bIsReloading 을 선언해 놓았는데, AKWeapon에서 캐릭터 참조를 가져와 재장전이 끝난 후 setter 로 false 설정을할 때 Timerdelegate 람다식에서 Character에 액세스를 하지 못합니다. 제 생각에는 참조의 생명 주기에 문제는 없는 것 같은데,, 왜 람다식 안에서만 캐릭터 참조를 사용 못하는지 모르겠습니다.아래는 Reload 코드와 프로젝트 깃허브 주소입니다. void AVIAKWeapon::Reload() { Super::Reload(); if (UWorld* World = GetWorld()) { APlayerController* PC = UGameplayStatics::GetPlayerController(World, 0); if (PC) { AVICharacter* Character = Cast<AVICharacter>(PC->GetCharacter()); if (Character) { if (AmmoCount < MaxAmmo) { if (!bDoOnceReload && !Character->GetbIsReloading()) { Character->SetbIsReloading(true); Character->GetFirstPersonMesh()->GetAnimInstance()->Montage_Play(AKReloadActionMontage, 1.0f); Mesh->PlayAnimation(ReloadActionAnimation, false); FTimerHandle ReloadTimeHandle; GetWorld()->GetTimerManager().SetTimer(ReloadTimeHandle, FTimerDelegate::CreateLambda([&]() { Character->SetbIsReloading(false); AmmoCount = MaxAmmo; //DF("EndTimer bisRelaoding %d", Character->GetbIsReloading()) // TimerHandle 초기화 GetWorld()->GetTimerManager().ClearTimer(ReloadTimeHandle); }), ReloadTime, false); bDoOnceReload = false; } } } } } }https://github.com/chataeg/VI/tree/Part7
-
미해결[입문자를 위한 UE5] Part3. 언리얼 엔진 3D 게임 개발 입문
Play Animation과 Play Anim Montage
강의에서 사용한 Play Anim Montage는 현재 메시 컴포넌트가 사용하는 ABP_Player(애니메이션 블루프린트) 안에 있는 몽타주에 접근해 재생시키는 것인가요? 애니메이션 관련 액션을 검색하다 Play Animation을 발견해서 사용해봤는데 ABP_Player(애니메이션 블루프린트)를 무시하고 Play Animation으로 재생한 것만 1순위로 실행하더라구요. (설명을 읽어도 안전하지 않으니 비추천한다는 것 같고) 그럼 Play Animation은 ABP_Player(애니메이션 블루프린트)의 실행을 무시하고 메시를 강제로 특정 애니메이션을 재생시키도록 작동하는 것일까요? 강의 잘 듣고 있습니다. 감사합니다. ps. 추가로 강의 관련 궁금한 점이 있습니다.유니티 MMORPG 만들기 강의와 켠김에 출시까지 강의 시리즈 중에서 실무적인 팁이나 지식을 얻기 위해서는 켠김에 출시까지를 들어보는 것이 좋을까요?
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
Shipping 빌드의 save 파일은 어디에 저장되나요?
Shipping 빌드로 패키징한 exe 파일로 게임 진행 시 RetryCount를 보관하는 save 파일은 어디에 어떤 형태로 저장되는 지 궁금합니다.
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
사용된 코드에 담긴 원리가 궁금합니다
안녕하세요 교수님.교수님께서 만들어주시는 양질의 강의에 언제나 많은 배움을 얻게 되어 감사드립니다.강의를 듣던 도중 궁금한 점이 생겨 이렇게 질문을 작성하게 되었습니다.ShoulderLook()에서 플레이어 컨트롤러의 로테이션 Yaw값과 Pitch값을 더하는 것은 알게 되었지만,다음의 코드들이 작동하는 원리를 자세히 이해하지 못한 것 같습니다.특히 이 코드들이 작동하는 수학적 원리가 어떻게 되는지 알고 싶습니다.추가적으로 위의 코드들이 Quater 뷰와 Shoulder 뷰를 구현하는 최선의 방법인지, 다른 더 간소화할 수 있는 방법이 있다면 무엇인지 알려주시면 감사하겠습니다.다시 한번 좋은 강의를 만들어주셔서 감사합니다.
-
미해결C++로 만드는 언리얼엔진 게임포트폴리오 시리즈 Stage3
AO_Aim 파일 동작 안 함
최종 프로젝트로 올려주신 AO_Aim 파일을 그대로 써도 영상처럼 동작하지 않고 화면만 엄청 확대되는데 다른 이유가 있을까요?
-
해결됨이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
언리얼 엔진에서 순환 참조가 발생할 수 있나요? + TWeakObjectPtr
안녕하세요, 교수님. 문득 궁금한게 생겨 다시 강의를 보다가 질문을 올립니다.우선 순환참조는 스마트 포인터의 고질적인 문제인데요,A, B, C가 있고,A -> B <->C 의 참조 상태에서 A 변수의 참조가 끊겨도, B와 C는 서로 계속 가리키고 있어 영원히 메모리가 해제되지 않는 메모리 누수의 문제로 알고 있습니다. 따라서 weak_ptr<T>를 사용해야 하는데요. UE의 GC 시스템은 Mark & Sweep 방식을 따른다고 했습니다.전체 UObject에 대해 Unreachable로 설정 후,Rootset을 따라서 참조 그래프를 순회하며 Unreachable 플래그를 해제하고 (Mark),전체 UObject에 대해 Unreachable 플래그가 존재하면 메모리 해제를 진행한다. (Sweep) 이 방식은 Java나 c#의 GC와 비슷한 방식이며, 해당 언어의 경우순환 참조 문제가 발생하지 않는 것으로 알고 있습니다.(위에 써둔 순환 참조 문제에서, B<->C의 참조 상태여도 어차피 Root로 부터 Mark가 도달할 수 없기 때문에 지워짐) 그렇다면 언리얼 엔진의 GC에서도 위와 같은 순환 참조 문제가 발생하지 않나요?발생하지 않는다면, TWeakObjectPtr<T>의 강참조 방지는 그냥 쓸데없는 생명주기 연장 + raw pointer 참조 시 GC 당해서 댕글링을 참조하는 문제 방지 등을 위해서 사용하는 것인가요? 만약 발생한다면, 그 이유는 무엇인가요? 제가 잘못 이해한건지, 아니면 Java나 C#에서의 RootSet 기준과 Unreal 에서의 Rootset의 기준이 달라서 그런것인지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
캐릭터 WASD키 방향 관련 설정 질문입니다.
입력키를 사진처럼 설정하면 W(앞), D(우), S(뒤), A(좌) 방향으로 제대로 움직이는데원래 설정되어 있던 WSDA순서로 설정하면 W(우), D(뒤), S(좌),A(앞) 이렇게 움직입니다. 일반적으로 DASW, Up Down Right Left 순서를 어떻게 맞추면 될까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
37:11에서 프로젝트 실행시 경로를 찾을 수 없다는 에러가 뜹니다
37:11에서 프로젝트 실행시 경로를 찾을 수 없다는 에러가 뜹니다.언리얼 5.1.1버전이고 코드는 복붙했습니다.실행시에 아래처럼 파일 경로를 찾을 수 없다는 에러가 뜨는데 어떻게 해결해야하나요??
-
미해결언리얼 엔진4 입문 (C++ 기반)
언리얼 에디터 상에서 만든 구조체를 C++ 상에서 불러올수 있나요?
제목처럼 언리얼 에디터 상에서 구조체 블루프린트?를 만들었는데요 여기에 선언된 변수에 들어있는 값을리플렉션 시스템을 활용해 C++ 상에서 불러올수 있나요??
-
해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
오너를 가지고있는 액터가 IsNetRelevantFor() 할 때 궁금한 점이있습니다.
분수대 같은 개별 액터가 아니라 빙의 되어있는 폰같은 액터의 경우, 오너로 자신의 player controller 가 있을 것인데요.이 폰에서 IsNetRelevantFor() 함수가 호출될 때 매개변수로 받는 RealViewer에 대하여 어떤 RealViewer(클라이언트)이든 무조건 true가 반환 되서, 모든 클라이언트에게 복제가 되는 건가요? IsNetRelevantFor() 의 첫 번째 조건은 자기 자신의 오너쉽과 관련된 클라이언트에 대해서는 무조건 true 가 반환 되는 걸로 보여지지만if (bAlwaysRelevant || IsOwnedBy(ViewTarget) || IsOwnedBy(RealViewer) || this == ViewTarget || ViewTarget == GetInstigator()) { return true; } Player State 나 Game State가 무조건 모든 클라이언트에게 복제 되는 것 처럼.(bOnlyRelevantToOwner같은 특별한 옵션이 없다고 가정했을 때) Player Controller를 오너로 가지고있는 액터도 모든 클라이언트에 복제가 된다고 이해해도 되나요??
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
강의3-1 빌드오류
시작강의대로하고 있는데 MSB3073 에러가 뜨면서 진행을 못하고있습니다 ㅜㅜdevelope editor로 실행도했으며 경로에 한글같은것도없습니다... 따로 설정할곳이있나요언리얼버전은5.4입니다
-
미해결[입문자를 위한 UE5] Part2. 언리얼 엔진 2D 게임 개발 입문
sprite vs texture 수업자료 다운로드가 안됩니다.
sprite vs texture 수업자료 다운로드가 안됩니다.
-
미해결C++로 만드는 언리얼엔진 게임포트폴리오 시리즈 Stage3
다음 강의 관련 문의
안녕하세요 다음 강의를 RPG로 다시 구현하신다는 말을 마지막에 들었었는데 해당 강의가 언제쯤 개설되는지 알 수 있을까요? 만약 이미 존재한다면 들을 수 있는 경로를 알려주시면 감사하겠습니다
-
미해결C++로 만드는 언리얼엔진 게임포트폴리오 시리즈 Stage3
AO_Aim 애니메이션 설정 오류
Rifle_Additive_D를 넣은 다음에 Rifle_Additive_F를 넣으면 Animation should be additive라는 오류가 뜨면서 애니메이션이 안 들어가는데 다른 설정이 필요한걸까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
아이템 박스가 안먹어집니다
void ASSItemBoxActor::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepHitResult) { //오버랩 확인 UE_LOG(LogTemp, Warning, TEXT("OnOverlapBegin triggered")); if (nullptr == Item) { Destroy(); return; } ISSCharacterItemInterface* OverlappingPawn = Cast<ISSCharacterItemInterface>(OtherActor); if (OverlappingPawn) { OverlappingPawn-> TakeItem(Item); } Effect->Activate(true); Mesh->SetHiddenInGame(true); SetActorEnableCollision(false); Effect->OnSystemFinished.AddDynamic(this, &ASSItemBoxActor::OnEffectFinished); }선생님 자료 코드랑 비교도 다 해보았는데 틀린 부분은 없는데 박스를 설치하고 다가가면 벽처럼 물체로 인식하고 가도 터지거나 이펙트가 일어나지 않습니다 로그도 넣어봣는데 OnOverlapBegin 진입 자체가 안됩니다 에디터에서 무언가 설정해야 할까요?
-
미해결C++로 만드는 언리얼엔진 게임포트폴리오 시리즈 Stage3
BS_Aim 파일 오류
파일 주신 BS_Aim 파일이 애니메이션 자체 오류가 있는데 파일을 다시 받아야 하는걸까요? 설정된 애니메이션 없음으로 나옵니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
데코레이터 구현 질문..
수업에서는 AttackInRange 데코레이터를 CalculateRawConditionValue() 만 구현해서 사용했는데요. aborts 발동 조건같은걸 따로 지정안해도 자동으로 되는 건가요?? BlackBoard 데코레이터의 경우에는 값이나 결과? 가 바뀌면 aborts가 발동되는 걸로 이해해서 코드를 보니 상당히 복잡하게 aborts 구현이 되어있더라구요.... 어설프게 이해한 바로는 블랙보드의 키에 델리게이트 등록해서 값 변경 이벤트를받아 ConditionalFlowAbort() 라는 함수를 호출하고 있습니다. 이 과정에서 CalculateRawConditionValue()가 또 호출되고 활성/비활성으로 나뉘어져 뭔가 복잡하게 수행하는데요. 결국 aborts를 해야하는지 말아야하는지 체크는 ConditionalFlowAbort() 를 호출함으로서 시작되는 것 같아 보이는데....이걸 안 한 AttackInRange 데코레이터는 aborts 가 어떻게 동작하는지 알고 싶습니다..
-
미해결C++로 만드는 언리얼엔진 게임포트폴리오 시리즈 Stage3
41 총기장착 2 문의
노티파이 적용 후 플레이하고 1번 누르면 노티파이 적용된 잠깐의 구간 동안 플레이어가 사라졌다가 다시 나오는데 어떻게 된걸까요?
-
해결됨이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
ASC GiveAbility 질문드립니다.
안녕하세요.저는 무기 아이템 액터가 무기를 휘두르는 몽타주를 재생하는 어빌리티를 멤버 변수로 갖고 있게 하고,해당 무기를 장착했을 때 무기의 어빌리티를 매개변수로 전달받아 어빌리티를 활성화 하도록 구현하려고 하는데요.이 경우에 어빌리티를 활성화하고 등록된 어빌리티를 다시 제거해 줄 필요는 없을까요?같은 무기를 여러번 장착할 수도 있을텐데 ASC에 같은 어빌리티 여러 개가 등록되어 있는게 문제가 될 수도 있지 않나 해서 질문드립니다.