묻고 답해요
152만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
오브젝트 설계 #1 질문
34분 50초ObjectManager::Remove(Object* object)에서 auto it = std::remove(...);_objects.erase(it, _objects.end());대신에 _objects.erase(findIt); 를 해도 findIt 에는 object에 대한 iterator 값이 저장되어 있으니 erase함수만 사용해도 제거할 object를 vector에서 삭제할 수 있지 않을까 해서 질문드립니다
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
시퀀스 하나가 성공을 반환하면 트리 전체가 종료가되나요?
예를들어 13:50 에서 "친구에게 간다" 가 "친구와 약속"이라는 데코레이터를 만족하여 "약속장소로 이동"을 수행하고 이를 성공적으로 수행했다면, "친구에게 간다"라는 시퀀스는 root에게 성공을 반환하게 되고, 나머지 두 개의 시퀀스는 검토하지 않고 바로 트리 전체를 종료하는 원리인건가요?
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
DefaultArenaBattle.ini 관련 질문입니다
우선 메모장을 이용해서 만들기는 했는데, 여기 안에 있는 내용물은 직접 작성하는 것인가요? 메모장을 만들어놓으면 자동으로 내용이 로드되는게 아닌건가요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
데이터에셋 블루프린트 reload 후 저장 관련 질문
45:30 부분에서 에서 세 데이터에셋의 블루프린트를 하나로 묶고 Reload 후 Save All을 했을때, Reload 된 각각의 에셋들이 실제로는 Reload가 안된 채로 저장이 되는 것 같습니다.(다만, 마우스를 갖다대면 primary Asset Type은 표면적으로 변경된것처럼 보입니다.) 반면, 묶음으로 Reload를 한 후, 개별적으로 블루프린트를 열고 일일이 저장버튼을 누르면 그제서야 Reload가 적용이 되는지, ensure()이 통과가 됩니다. 예를들어 에러를 띄우기 위해 ,ABItemData.h 에 있는 코드return FPrimaryAssetId("ABItemData", GetFName()); 부분에 태그ID 를 "ABItemData3333", GetFName()) 로 바꾼 후, ABItemBox.cpp 에서FPrimaryAssetId SpecificAssetId(TEXT("ABItemData"), TEXT("ABIS_ScrollTest")); FSoftObjectPtr AssetPtr(Manager.GetPrimaryAssetPath(SpecificAssetId)); 로 바꿔서 아이템 전부를 의도적으로 Scroll 자산으로 설정하고 에디터 실행 후에 설명하신 대로 전체묶음+Reload+save all 을 한 후 플레이를 누르면, 아이템이 생성되는 시점에 ensure(Item) 에서 에러가 발생되길 기대했지만 에러가 발생하지 않고 여전히 정상적으로 아이템박스 인스턴스가 생성이 됩니다. 반면 세묶음으로 Reload를 한 후 세이브는 데이터에셋 블루프린트 각각을 열어 개별저장 한 후에 다시 플레이를 하면 원하던 에러가 뜹니다. 아무래도 save all 이 Reload한 데이터 에셋들을 제대로 저장시키지 못하고 있는게 아닌가 싶습니다. 버그인지 아닌지는 모르겠지만..
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
동적배열 강의 듣는중 에러
c++ crt detected that the application wrote to memory after end of heap buffer이라는 오류가 뜹니다.이걸 무시하면 그대로 원하는 값은 나오기는 합니다. 근데 이걸 그냥 지나칠 수는 없어서 질문해봅니다.f11눌러가면서 에러나는 부분을 찾았는데reserve에 delete[] _buffer; 를 실행하니 오류가 났습니다. [Vector.h]#pragma once#include<assert.h>class Vector{using T = int;public:explicit Vector(){}~Vector(){if(_buffer)delete[] _buffer;}int size() { return _size; }int capacity() { return _capacity; }void push_back(const T& data){if (is_full()){int newCapacity = static_cast<int>(_capacity * 1.2f);if (_capacity == newCapacity)newCapacity++; reserve(newCapacity);}buffer[size] = data;_size++;}void reserve(int capacity){if (capacity <= _capacity)return;_capacity = capacity;T* newBuffer = new T(_capacity);for (int i = 0; i < _size; i++){newBuffer[i] = _buffer[i];}if (_buffer)delete[] _buffer;_buffer = newBuffer;} T& operator[](int index){assert(index >= 0 && index < _size);return _buffer[index];} int is_full() { return _size == _capacity; }int is_empty() { return _size == 0; }private:T* _buffer = nullptr;int _size = 0;int _capacity = 0;}; 해결방법이 있을까요?
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
SceneManager.cpp에서 구문오류가 발생했습니다.
안녕하세요 Rookiss님, 섹션11-3 Scene과SceneManager의 중간~32분 정도에서 작성중인 코드입니다. 이렇게 newScene에 DevScene()과 GameScene()을 넣는 부분에 형식지정자 없음과 구문 오류가 발생합니다... Scene클래스와 DevScene, GameScene 클래스 코드도 동영상을 몇번씩 돌려보면서 확인했는데 어디가 문제인지 잘 모르겠습니다... 혹시 어느 부분이 문제가 될지 확인 한 번 부탁드려도 될까요? 감사합니다!
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
SetLevelStat함수의 Clamp처리 부분에서 수정이 필요한 것 같습니다.
안녕하세요 먼저 좋은 강의 감사드립니다.ABCharacterStatComponent.cpp의 SetLevelStat함수에서 CurrentLevel에 대한 Clamp의 MinValue가 1, MaxValue가 CharacterMaxLevel로 설정되어있는데 인덱스값이므로MinValue = 1, MaxValue = CharacterMaxLevel - 1로 수정이 필요할 것 같습니다.
-
미해결[LV3 : 기술편] 게임스킬 만들기 - 기획, 아트 누구나 만드는 블루프린트
Level 3 아트편 문의
감사합니다 강의 재밌게 잘 들었습니다 !!혹시 Level 3 아트편은 언제 오픈되나요 ??오픈되면 바로 수강하고 싶습니다
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
GC발동이 다른 객체와는 좀 다른데요
안녕하세요, GA, GE 등은 그래도 객체 정보를 담을 수 있게C++에서 기본적인 작업을 하고 BP로 만든 객체를 세팅해주고 구현이 되는데, GC는 BP로 만든 객체를 세팅 없이 Tag로 바로 발동 되는 거 같습니다. AbilitySystem에서 GamePlayCue로 설정된 Tag의 Asset들을 Tracking하여 따로 관리하는 것일까요?
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
HudWidget 질문이 있어요
Hud위젯 생성을 PlayerController 클래스가 아닌 Player클래스에 해도 주기 관련해서 문제는 없을까요?
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
UI 생성 질문이 있습니다.
HUDWidget 같은 경우 CreateWidget함수로위젯을 만들잖아요,. 근데 HpBarWidget같은 경우CreateWidget함수가 안 보이더라고요.어디서 만들어지는거죠? 제가 이해한 바로는 다음과 같습니다. Base클래스 생성자에서 HpBar라는 위젯컴포넌트에주소 참조해서 가져온 HpBarWidget클래스를 HpBar->SetWidgetClass함수에 넣으면 CreateWidget함수처럼 위젯을 생성한다. 이렇게 이해하는게 맞을까요?만약 맞다면 언리얼에서 Widget 생성하는 방법은 이렇게 2가지 있을까요?1. CreateWidget 사용 (HUD 만들 때 사용)2. 위젯 클래스를 주소참조해 가져와 위젯컴포넌트에 담기 (Actor를 따라다닐 UI 만들 때 사용 )
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
SetupCharacterWidget 인터페이스 사용 이유가 이게 맞을까요?
SetupCharacterWidget 인터페이스 핵심 사용 이유가 액터와 위젯 생성 주기를 고려해 원하는 시점에 초기화 해주기 위함이 맞을까요?인터페이스를 사용하지 않고, BeginPlay에 다음과 같이 코드를 작성해도 오류는 안 나더라고요. 대신 처음에 플레이어 HP바가 다 채워지지 않은 상태로 시작하는 버그는 있지만요. 아무래도 InitWidget , NativeConstruct 함수가 초기화되지 않았기 때문이겠죠?void AABCharacterBase::BeginPlay(){ Super::BeginPlay(); UABHpBarWidget* HpBarWidget = Cast<UABHpBarWidget>(HpBar->GetWidget()); ensure(HpBarWidget); HpBarWidget->UpdateStat(Stat->GetBaseStat(), Stat->GetModifierStat()); HpBarWidget->UpdateHpBar(Stat->GetCurrentHp()); Stat->OnHpChanged.AddUObject(HpBarWidget, &UABHpBarWidget::UpdateHpBar); Stat->OnStatChanged.AddUObject(HpBarWidget, &UABHpBarWidget::UpdateStat);}호출해도
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
캐릭터 클래스 관련 질문입니다
part2에서 만든 모든 캐릭터들은 CharacterBase 클래스를 상속받아서 동작하고 있는데, 그럼 만약에 적 캐릭터들을 좀 더 플레이어와는 다르게, 적군 만의 어떤 공통적인 기능들이나 스탯 설정같은걸 추가하려면 플레이어용 PlayerCharacterBase와 EnemyCharacterBase 뭐 이런식으로 따로 베이스 클래스를 만들어서 작성하는게 나을까요, 아니면 그냥 기본 바탕은 CharacterBase로 통일시키되 override를 하거나 해서 만드는 것이 나을까요? 막상 베이스 클래스를 2개 만들어서 하려다보니 많이 비효율적인 방식인지 궁금해져서 질문드립니다
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
콘솔창 특수문자 겹침
안녕하세요. [배열 실습] 강의위와 같이 문자가 겹쳐서 나오는데 해결 방법 알 수 있을까요?다른 분께서 올려주신 모든 글꼴 표시도 해보려고 했으나,저장만 하면 체크가 해제되어서 적용이 되지 않습니다.
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
TObjectPtr과 강참조에 관한 질문입니다
8강 아이템 시스템 마지막에 강참조된 아이템들을 약참조로 바꾸는 부분을 공부하다가 질문드립니다 인터넷에서 강참조와 약참조에 대해 좀 더 자세히 공부하다보니강참조 = TStrongObjectPtr / 약참조 = TSoftObjectPtr 를 사용하며, TObjectPtr과 강참조가 관련된 정보는 없길래 TObjectPtr에 대해 궁금증이 생겼습니다 TObjectPtr에 대해 검색해본 바로는TObjectPtr은 기존에 사용하던 원시 포인터를 대체하는 포인터를 이용한 단순한 참조에 불과하며, 그러므로 댕글링 포인터 문제 또한 발생할 수 있다.보통 강참조라고 하는 것은, 객체의 소유권을 가지고 Ref Count를 올리는 역할을 수행해야 하는데, TObjectPtr은 단순히 객체를 참조하는 역할만 하므로 강참조라고 볼 수는 없다라고 나와 있던데 강의에서 TObjectPtr이 강참조라고 하셨던 것은 어떤 의미인지 궁금합니다 그리고 만약에 TObjectPtr이 강참조가 아니라면, 이는 어떠한 정도의 참조인건지요...? 중참조? 이런 단어는 없는거같던데.. TObjectPtr은 TStrongObjectPtr(강참조) 와 TSoftObjectPtr(약참조) 사이의 어딘가에 있는 애매한 정도의 참조인것인지요?? 추가질문)약참조를 공부하는데 약참조에도 또 TSoftObjectPtr과 TWeakObjectPtr의 2가지가 존재하더라구요... TSoftObjectPtr리소스의 주소는 갖고 있되, 로딩은 시켜놓지 않는 경우에 사용아직 현재 월드에 인스턴스화되지 않은 객체를 참조할 때 사용TSoftObjectPtr은 FSoftObjectPath를 감싸는 TWeakObjectPtr이다 TWeakObjectPtrRef Count를 증가시키지 않아야 하는 경우 / 소유권이 없지만 참조는 필요한 경우에 사용참조하고 있는 오브젝트가 GC에 넘어간 경우, nullptr로 바뀌며 validation 체크를 가능하게 함 이렇게 알고있는데 제가 학습한 내용이 맞는건지요??
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
22:00 부분에서 위젯과 NativeConstruct 관련 질문이 있습니다
먼저, 강의 흐름대로 위젯 블루프린트를 하나 만든 후 'PbHpBar' f라는 ProgressBar를 추가하였으며 그 블루프린트의 부모를 ABHpBarWidget으로 설정해 둔 상태입니다.여기서 궁금한 점은ABHpBarWidget은 부모클래스이며, 따라서 자식클래스에서 생성한 'PbHpBar' 라는 위젯의 존재를 알지 못할텐데, 어떻게 HpProgressBar 에 'PbHpBar' 라는 위젯의 존재를 찾아서 주소를 반환할 수 있는것인지 궁금합니다.(만약 부모자식 관계가 바뀌어있다면, 자식에서 부모의 PbHpBar 라는 녀석의 존재를 찾아 포인트를 반환하는게 논리적으로 뭔가 납득이 가는데, 강의의 내용은 마치 상속관계가 반대의 상황인데도 불구하고 가능한것 처럼 보여집니다.) NativeConstruct() 라는 생성자는 제가 모르는 뭔가 특별한 기능을 가진 생성자이며, 따라서 부모클래스임에도 불구하고 자식클래스인 블루프린트 클래스에 있는 위젯의 정보들까지 미리 전부 탐색할 수 있기 때문에 자식에 있는 PbHpBar까지도 찾아서 포인터를 반환할 수 있는 것인가요?
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
LoL 스킬 사용할 때 바닥에 공격범위가 나오는 기능을 추가로 구현하고 싶습니다.
5.1 버전의 강의를 다 듣고, 5.4 깃허브 업데이트 되어서 다시 복습하다가 제목과 같이 스킬 사용할 때 범위 시각화(배포용) 기능을 구현해보고 싶더라구요. 일단, 캐스캐이드가 Legacy 기능이다보니 나이아가라로 다른 스킬 구현은 완료했고, 스킬의 범위를 바닥에 표현하고 싶은데 GAS 프레임워크에서 스킬 범위를 표기할 때 좋은 class가 따로 구현되어 있을까요? 현재 나이아가라 데칼을 써서 해볼까 실험은 하고있는데, 정석적인 방법(?)이 있다면 먼저 그런 방법으로 해보고 싶어서 질문드려요.
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
4장 UABAT_JumpAndWaitForLanding* CreateTask 에 대한 질문
선생님 안녕하세요.C++ 코드로는 UABGA_Jump::ActivateAbility(); UABAT_JumpAndWaitForLanding::CreateTask(); JumpAndWaitForLanding->ReadyForActivation(); UABAT_JumpAndWaitForLanding::Activate();와 같은 일련의 코드 흐름이 이해가 가는데, UFUNCTION(BlueprintCallable, Category = "Ability|Tasks", meta = (DisplayName = "JumpAndWaitForLanding", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "TRUE")) static UABAT_JumpAndWaitForLanding* CreateTask(UGameplayAbility* OwningAbility);UABAT_JumpAndWaitForLanding* CreateTask()를 Blueprintcallable로 변경하시면서 블루프린트에서 CreateTask가 호출되도록 변경하셨는데.JumpAndWaitForLanding->ReadyForActivation(); 함수를 주석 처리하셨는데도 불구하고, UABAT_JumpAndWaitForLanding::Activate() 함수가 호출되는 이유를 잘 모르겠습니다.void UGameplayAbility::ActivateAbility() { if (bHasBlueprintActivate) K2_ActivateAbility();개인적인 생각으로는 블루프린트 노드를 사용하게 되면 K2_ActivateAbility()가 호출되는걸로 봐서는 이 함수 내부에서 추가로 AbilityTask의 Activate함수를 호출해주는것 같은데, 함수 내부를 볼 수가 없습니다.혹시 어떤 원리로 UABAT_JumpAndWaitForLanding::Activate()가 호출되는지 알수있을까요? 감사합니다.
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
FieldIterator 질문입니다
CharacterStatWidget 클래스에서 TFieldIterator 사용에 관한 질문입니다 TFieldIterator 말고도 다른 Iterator가 존재하고, 여기에서는 이 상황에 맞는 Iterator를 사용해야 하기에 FieldIterator를 사용한 것인지 궁금해서 검색해봤더니, 언리얼 엔진에서의 반복자는 항상 ObjectIterator과 ActorIterator 이 2가지만 언급하더라구요. ObjectIterator는 UObject를 상속받은 클래스들에 대해 순회하는 반복자ActorIterator는 Actor(레벨에 배치된 UObject)를 상속받은 클래스들에 대해 순회하는 반복자검색 결과에서는 항상 이렇게 설명하던데그럼 이와 마찬가지로 FieldIterator는 Ustruct에 등록된 프로퍼티/함수들에 대해 순회하는 반복자로 이해하면 되는 것일까요? 그리고 FieldIterator도 위의 오브젝터와 액터 반복자와 마찬가지로 FFieldIterator는 타입을 특정하지 않고 모든 구조체의 프로퍼티/함수들을 순회하는거고TFieldIterator는 타입을 지정하여 구조체 내의 프로퍼티/함수들을 순회하는 거라고 보면 되는걸까요? 아니면 FieldIterator는 FFieldIterator는 없고 오직 TFieldIterator만 있는 건가요? 그리고 위 스크린샷에서 TFieldIterator<FNumericProperty> PropIt(FABCharacterStat::StaticStruct())이 부분을 TFieldIterator로 FNumericProperty타입을 지정하여, ABCharacterStat 구조체에서 FNumericProperty타입을 지정하여 순회한다로 이해하면 되나요?그런데 ABCharacterStat 구조체에는 FNumericProperty 타입의 변수가 없는데 왜 타입을 FNumericProperty로 지정한 것인지요...?그리고 FNumericProperty가 있으면 그럼 TNumericProperty라는 것도 있는건가요? 아니면 이건 반복자가 아니기 때문에 TNumericProperty라는건 존재하지 않는건가요?복습하면 할수록 질문이 질문에 꼬리를 잇게되네요...
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
10강에서 reinterpret_cast 질문있습니다
인터넷에서 찾아보니 casting 중에서도 가장 강한 cast이며, 주로 패킷 통신할 때 자료를 포인터로 받아오는 경우에 사용하며 그 외엔 잘 사용하지 않는 형변환이다. 포인터끼리, 그리고 포인터와 수치형 간의 변환 이라고 하는데 혹시 ABCharacterStat.h에서 operator+ 구현할 때, reinterpret_cast를 사용하는게 더 좋은 이유가 있을까요? 캐스팅 종류가 많아서 너무 헷갈리네요... 만약에 굳이 reinterpret_cast를 쓰지 않아도 된다면 일반 casting으로도 대체가 가능한지요? 아 그리고 추가로, part2를 다 들으면서 계속 궁금했었던건데 왠만한 모든 변수 선언 시에는 대부분 const를 붙여서 선언하시던데 const가 값을 바꾸지 않는 상수화이지 않나요?? 제가 유니티만 하다가 언리얼로 최근에 바꿨는데 그래서 그런가 제일 적응안되는부분이 모든 변수를 포인터로 쓰는 것과 항상 변수에 const를 붙이는 부분이더라구요. 변수를 포인터로 선언하는 이유는 인터넷 검색으로 이해가 되었는데, const를 거의 항상 사용하는 이유는 아직 잘 모르겠습니다... 변수를 상수화 시키는 것이 어떤 의미가 있는걸까요?? 변수의 값은 보통 게임이 진행되면서 계속 바뀌어야 하지 않나요??
주간 인기글
순위 정보를
불러오고 있어요