묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
69번 강의에서 에러 발생 보고
안녕하세요69번 강의에서 HUD를 모두 구성한 뒤 테스트하는 과정에서 발생한 에러에 대해 보고드립니다.강의자님이 테스트하는 과정에서 부스터를 사용한 뒤에 부스터 아이템을 먹으면 정상적으로 부스터 게이지가 충전되는 것으로 확인해 주셨는데요. 게임 시작후에 부스터를 한번도 사용하지 않고, 부스터 아이템을 먹게 되면 boost_tween 부분에 null 에러가 발생하게 됩니다.이를 개선하기 위해 아래와 같이 수정하면 null 에러가 발생하지 않게 되는데요.시간 괜찮으실때 강의에 추가해 주시면 좋을것 같습니다. 'PICK_BP': if boost_tween and boost_tween.is_valid(): boost_tween.stop()
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
#include d3dx12.h 추가했지만 오류
#include d3dx12.h 추가했지만 오류가 나서 파일 안에 들어가보면 #include "d3d12.h" 인식을 못하는데 어떤 파일들을 어디에 추가해야하나요??? p.s EnginePch.h부분에 #include <windows.h> #include <tchar.h> 이 부분은 왜 인식을 못하는걸까요..?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
explicit을 붙였을 때 빨간줄이 뜨는 이유가 맞는지 궁금합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 루키스님. 좋은 강의 제공해주셔서 감사합니다. 13:56초에서 한개의 인자를 받는 Pos 생성자에 explicit을 붙이니 main 함수에 있는 일부 문법들이 빨간줄이 뜨는 이유가, 암시적으로 변환되던 아래의 구문이Pos pos1 = 10; -> Pos pos1(10);explicit 키워드를 붙임으로써 대입연산자의 생성자로 암시적 변환이 막힌 것이고, 따라서 빨간줄이 뜬다고 생각하면 되는걸까요?
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
노드의 내장 시그널 이용 관련 문의
안녕하세요 강사님꾸준하게 피드백 주셔서 감사드립니다.시간이 부족하다는 핑계로 수업 진도가 좀 많이 늦어졌네요 ㅠ 51강의 1:45초 부근에 대한 질문입니다.player 씬에서 BoostTimer의 내장 시그널(timeout())을 이용하여 시그널이 연결되어 있었는데, 이것을 삭제하고 수동으로 연결을 해주셨습니다. 그런데 보다보니 '굳이?' 라는 생각이 듭니다.내장 시그널을 이용하면 코드를 직접 작성할 필요가 없고, 시그널이 연결된 함수를 찾아가기에도 편하고 여러모로 편한것 같은데, 직접 작성하시는 이유가 궁금합니다~!
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?
StatInfo 라는 구조체를 활용해서 포인터 연산을 설명해주셨는데, 만약 구조체 생성부분에서 바이트 패딩을 주는 경우엔 포인터 연산 처리가 어떻게 되는지 궁금합니다.
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
46. 상속씬(3) 수업 질문
상속씬(3)의 수업 중 11:31초 부근입니다.func _ready()에서는 super()를 통해서 -ready의 기능을 오버라이딩 했는데,func on-area-entered에서는 super()를 사용하지 않았습니다.그 이유는 super()가 -ready에서만 한번 해주면 다른 함수들을 포함해서 전체적으로 오버라이딩이 되기 때문인가요,아니면 원래는 일일이 super()를 해줘야 되지만, on-area-entered에서는 오버라이딩 할것이 없기 때문에 하지 않은것인가요?참고로, 파이썬에서는 super()를 아무데서나 한번 해주면 부모 클래스의 모든 메서드와 변수를 상속받습니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
LNK1104 error, DirectXTexD.lib 파일을 열 수 없습니다.
같은 위치에 있는 DirectXTex.lib파일은 에러가 안나는데 디버그용파일만 에러가 나오네요. 계속해서 파일위치 확인했지만 찾을 수가 없어 qna남깁니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
리소스 매니저 강의 18분 부근
ResourceManager::Clear() 에 해당하는 부분에 대해 질문이 있습니다.ResourceManager이 싱글톤으로 만들어지고, Game의 소멸자에서 또 ResourceManager의 Clear을 호출함으로써, Clear을 총 두번 호출하게 됩니다.이 때, ResourceManager::Clear 내부에 unordered_map에서 메모리 해제를 하기 위해 SAFE_DELETE을 사용하고 있는데, for문이 auto mesh로 값복사를 하여 호출하는데, 이러면 힙 메모리는 delete시켰지만, map에서 관리되고 있는 포인터는 아직 해당 주소를 가리키고있어 두번째 Clear에서 또 값을 복사해오고 주소값자체는 복사해오므로 if(ptr)도 통과한 상태로 delete을 다시한번 시도하여 오류를 내는것으로 보입니다.근데 궁금한건, 왜 Game의 소멸자로 싱글톤의 Clear을 호출하는 것인지, 각 매니저의 생명주기를 RAII로 관리하게 하면 이런 이중 삭제를 고려안해도 되지 않나요?또한, for문으로 참조로 SAFE_DELETE를 한다면, Clear두번 호출되어도 이중 삭제 방지되지만, 왜 map의 clear로 해당 상황을 방지하는 선택을 하셨는지 궁금합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
[Service강의] owner -> shared_ptr
아직 다음 강의를 안들어서 잘 예측이 안되지만, owner에 보통 이벤트를 발생시킨 Session의 shared_from_this()를 넣어줄 것으로 예상을 해봅니다. 만약 이 상황에서 io작업이 밀려 오래 걸리거나 누락되어 shared_ptr로 물고 있던 session들이 해제 안되는 문제가 생길 수 있지 않나요?그렇기 때문에 weak_ptr로 owner을 관리하고, 다만 session이 만료되어 없어지면 유효하지 않은 이벤트이므로 .lock()을 통해 nullptr로 반환 시 예외 처리해주는게 더 안전하지 않나요?공부를 더 해야겠지만, 사실 아직 잘 이해가 안갑니다. owner와 event등의 수명 주기가 어떤 관계가 있는지 정확히 모르겠지만 방향성을 알려주시면 감사하겠습니다.
-
미해결게임 엔진을 지탱하는 게임 수학
github 코드 질문 + 서적 내용 - Transform 계층구조 쪽
transform 계층구조를 구현하는 쪽에서 경우의 수부모의 월드 transform이 변경된 경우나의 local transform이 변경된 경우나의 world transform이 변경된 경우새로운 부모를 설정하기부모의 로컬값은 부모의 부모와의 거리이므로 결국 월드값이 변경될 것이기에 상관이 없다.하나씩 따져보자.부모의 월드transform이 변경되었으면 나의 local은 유지되어야 하고, 이에따라 자신의 world transform값이 변경되어야 한다. 따라서 자신의 local과 부모의 world로 자신의 world를 구해주는 것이때, 자신의 자식도 동일한 상황이다.나의 local transform이 변경된 경우에는 나의 world transform값을 여기에 맞게 바꿔줘야 한다. 따라서 부모의 world와 자신의 local을 이용하여 자신의world값을 구해주면 된다.이 때, 자신의 world값이 변경되었으므로 자신의 자식들에 대해서는 1번 상황이 발생한다.나의 world가 변경되었으면 나의 local값을 변경된 정도에 따라 수정해줘야 한다. ( 부모를 옮길 수는 없으므로 ) 따라서 변경된 나의 world값과 부모의 world값을 비교해 자신의 local값을 구해줘야 한다.이 때, 자신의 world값이 변경되었으므로 자신의 자식들에 대해서는 1번 상황이 발생한다.으로 이해했습니다.따라서 자신의 world값이 변경된다면 -> local값을 world값에 맞춰주고 -> 이에 따라 자식들의 world값을 업데이트 해준다. 이므로void TransformComponent::UpdateWorld() { // 자신의 월드 정보 업데이트 if (HasParent()) { const TransformComponent& parent = *GetParentPtr(); _WorldTransform = _LocalTransform.LocalToWorld(parent.GetWorldTransform()); } else { _WorldTransform = _LocalTransform; } // 월드 정보 변경 시 자식의 월드 정보도 업데이트 ( 로컬 정보는 변함 없음. ) UpdateChildrenWorld(); }는 이해를 했는데 위쪽의 논리대로라면 자신의 local값이 변경된다면 world값을 맞춰주고 자식들의 world값을 업데이트 해줘야하지 않습니까? 근데 github코드에서는 자식들에 대해서 UpdateChildrenWorld();함수 호출을 하지 않고있습니다.void TransformComponent::UpdateLocal() { if (HasParent()) { const TransformComponent& parent = *GetParentPtr(); _LocalTransform = _WorldTransform.WorldToLocal(parent.GetWorldTransform()); } else { _LocalTransform = _WorldTransform; } } 이유가 궁금합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
C#에서 생성자 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 유니티와 C#의 부족한 지식을 위해 강의를 듣고있는데 궁금한 점이 생겨 질문합니다.개인 프로젝트를 진행할 때 Init함수 등을 사용해서 오브젝트 풀링한 몬스터들을 Init함수로 전체 데이터를 초기화 해왔었는데, C#에서도 생성자를 사용해서 첫 생성된 오브젝트들의 변하지 않는 데이터(이름, 공격력, 방어력 등)를 생성자로 초기화를 하고, 다시 풀링되는 오브젝트들의 변하는 데이터 (HP, MP 등)은 Init함수를 통해 풀링하는 식으로 만드는것이 좋은 방법인가요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
특정 조건에서만 함수를 반환할 때
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 반환 값이 있는 함수를 작성할 때 특정 조건에서만 반환해도 컴파일 단계에서 문제 없이 컴파일 됩니다.빌드를 시켜 실행 시키면 1로 반환 되던데 1로 반환 되는 이유는 뭔가요??
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
3. 미니 슈터게임 > 레이저씬 에서 global_position 과 position 차이??
미니 슈터게임 > 레이저씬 에서 global_position 대신 position으로 변경해서 작성해도. 결과는 똑같습니다. 굳이 global_position를 사용한 이유를 알고 싶네요..^^
-
미해결게임 엔진을 지탱하는 게임 수학
예제 13_4 {VM행렬을 사용하여 평면의 방정식을 로컬 좌표로 생성하기
13장 절두체에 대해 공부하다가 예제 13_3, 13_4로 넘어가는 중다음과 같이 학습 내용을 정리하게 되었는데, 제가 갖은 의문이 타당한 것인지, 잘못된 추론인지 알고싶어 문의드립니다. -정리 내용-예제 13_3에서는 뷰 공간에서의 영역 판정을 위해 원근 투영 행렬을 사용해 평면의 방정식을 만들었는데, 사실 뷰 공간 역시 모델링 행렬과 뷰 행렬을 로컬 좌표에 곱한 갑으로 분해하여 표현할 수 있다. 정리해 본다면 수식은 다음과 같이 나타난다.V(clip)-> = Dot(P,V(view)->) == Dot(P V M, (V(local)->))이 수식을 통해 절두체 컬링을 수행할 때 로컬 공간에서의 평면의 방정식을 만들 수 있고, 이 평면의 방정식과 캐싱된 바운딩 볼륨을 비교하여 컬링 대상인지 아닌지를 빠르게 판단할 수 있다는 것을 알 수 있다.또한 추가적인 장점도 있다. 특수한 경우(화각을 직접 조정하는 경우)가 아니라면 절두체 공간은 회전변환과 이동 변환만을 수행한다.대부분의 경우 로컬 공간의 평면의 방정식을 캐싱해두고 사용할 수 있다는 소리다. 단점은 모델링 행렬 자체가 변환되는 경우이다. 본질적으로 평면의 방정식을 로컬 공간으로 변환해서 비교한다는 것은 각 오브젝트 마다 서로 다른 평면의 방정식을 가지고 있다는 소리가 된다.(모델링 행렬은 각 오브젝트마다 전부 다르므로)또한 뷰 공간으로 변환하여 비교를 하던지, 로컬 공간에서 비교를 하던지 어차피 해야하는 계산이라는 것은 변하지 않는다는 것이다. 이 단점을 커버하는 것이 아마도 Static 오브젝트 설정인 것으로 나는 추측한다. 정적 게임 오브젝트는 그 형태가 변하지 않는 불변의 객체이므로, 모델링 행렬이 변하지 않는다. 그렇다면 이 오브젝트에 대해서는 항상 같은 로컬 공간의 평면의 방정식이 형성되고, 캐싱되어 사용할 수 있기 때문에, 카메라의 현재 설정값에만 영향을 받아 바운딩 볼륨을 언제나 즉시 비교할 수 있다는 것을 알 수 있다.
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
안드로이드, iOS빌드
안녕하세요. 좋은 강의 잘듣고 있습니다. 혹시 안드로이드, iOS로 빌드하는 방법을알려주실 수 있을까요? 모바일 게임 제작 강의도 출시해주시면 열심히수강하도록 하겠습니다. 감사합니다.
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
우주선 회전
섹션5 이동에서 우주선을 회전시키는데 우주선이 대각선을 바라볼때 키보드를 떼면 스냅이 걸린 것 처럼 상하좌우 중 하나로 움직입니다. 그러니까 대각선으로 멈추질 못하고 위나 아래 왼쪽이나 오른쪽으로만 멈춥니다. 뭐가 문제일까요? 코드는 똑같습니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
스택 empty
안녕하세요stack empty 함수에 return size() > 0으로 하게되면 비어있으면 false가 나올텐데 의미가 반대로 사용된 것 아닌가요??🙃
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
섹션4 배열실습 질문입니다.
배열을 통해 콘솔에 5x5 맵을 표현하는 부분에서 while (true) {HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { 0, 0 };::SetConsoleCursorPosition(output, pos); for (int y = 0; y < MAP_SIZE; y++) { for (int x = 0; x < MAP_SIZE; x++) { switch (GMap2D[y][x]) { case 0: cout << " □ "; break; case 1: cout << " ■ "; break; case 2: cout << " ● "; break; } } cout << endl; } }위와 같이 메인에 함수에 축약해서 코드를 짜놓았습니다. (실제로 헤더와 추가 cpp에서 도는것을 질문하기 쉽게 축약한것이라 실제 구동에는 차이가 없는것 같습니다.)위 코드에서 궁금한 부분이 2가지 생겼습니다.위 부분에서 while true로 돌고 있는데 무엇때문에 한번만 출력되는지 궁금합니다.위 코드를 작성하게 되면 다른 코드를 작성했을 때 콘솔창에 나타나는 "~~~~ 코드와 함게 종료되었습니다.... ~~~ 이 창을 닫으려면 아무 키나 누르세요.." 와 같은 프로그램의 끝을 알리는 자동 구문도 안뜨더군요.위 두 가지가 궁금합니다.
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
섹션3 '파일분할' 강의 질문입니다.
Helper.h 헤더파일에서 void Test, void Test2 는선언만 하고 Helper.cpp에서 초기화 한 뒤GameCoding.cpp 메인에서 바로 사용이 가능했는데,int GTest 는 왜 extern을 붙여줘야하는건가요?? 실험해보니 extern 안붙여주니 사용이 안되던데 함수형과 변수형에서 차이가 나는건가요?
-
해결됨고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!
시그널 - 자식에서 부모노드로 접근
훌륭한 강의 잘 보고 있습니다~! 감사합니다. ● 의문점:시그널 강의 결론은,"자식 노드쪽에서 부모 노드 쪽을 접근할 때 시그널을 사용하라" 입니다.헌데 강의의 예시를 살펴보면부모 씬의 스크립트(game .gd) 에서 시그널을 선언하고, 그 시그널을 부모 씬의 스크립트 함수와 연결하고, 부모 씬의 함수가 발동되고 있는데요그럼 그냥 부모 씬에서 모든 것이 이루어지는 것이지 자식 쪽에서 부모를 접근하는 것으로 보기가 어려웠습니다.뭔가 자식 쪽 시그널이 발동되면부모의 함수가 호출되는 상황이어야 할 것 같은데시그널로 이게 가능한지요?