
하위 C++ 클래스 생성하기 탱크와 터렛은 베이스폰을 기준으로 기본적인 기능을 상속받지만, 둘의 구체적인 기능은 조금씩 다르다. 대표적인 것이 터렛은 움직일 필요가 없고, 탱크는 움직여야 한다. 따라서 기본 베이스폰 클래스를 기준으로 하위 C++ 클래스를 생성하여 구체적인 기능을 기술해줄 필요가 있다. 탱크는 추가적으로 탱크를 포커스하기 위해 카메라 컴포넌트와 스프링 암 컴포넌트가 필요하다. 스프링 암 컴포넌트는 카메라와 탱크를 이어주는 역할을 한다. 두 컴포넌트를 추가해주면 카메라의 시선으로 탱크를 보는 것이 가능하다. 이제 Tank 클래스에서 두 컴포넌트들을 선언해주자. 처음에는 생성자가 없는데, CreateDefaultSubobject 함수 사용을 위해 생성자를 만들어주어야 한다. 이제 컴파일을 하..

컴포넌트 노출 본격적인 컴포넌트 노출에 앞서서, 추가로 알아야할 내용이 있다. 바로 UPROPERTY() 지정자중에서 이벤트 그래프와 관련된 것들은 private로 선언이 불가능하다. 우리가 기존해 선언했던 컴포넌트들은 private이므로, 사용이 불가능하게 되는 것이다. 이를 위해서 추가로 작성해야 하는 내용이 있다. 위 문구를 적으면 C++에서는 여전히 private지만, 언리얼 이벤트 그래프에서는 접근이 가능하게 된다. 이를 토대로 컴포넌트들을 노출시켜주자. 어디에서나 보일 수 있고, 블루프린트에서 읽는 것이 가능하며, 카테고리는 컴포넌트로, private지만 블루프린트에서 사용가능하도록 해주었다. 이제 블루프린트에서 해당 컴포넌트들에 대한 디테일 패널이 활성화된다. 우선 스태틱 메시 컴포넌트에 메..

노출된 변수 편집 저번에 이어서 더 다양한 UPROPERTY()에 대한 지정자와, 이벤트 그래프에도 노출시키는 방법에 대해 알아본다. 저번엔 인스턴스에서만 보이게하는 기능을 배웠었지만, 마찬가지로 디폴트에만 보이게하기 또는 디폴트에서만 편집하기 또는 인스턴스에서만 편집하기도 가능하다. 그리고 이벤트 그래프에 노출시키는 것또한 가능하다. 여기서도 읽기만 할 것인지, 읽기 쓰기 모두 할 것인지 조절이 가능하다. 또한 지정자를 하나만 작성하는 것이 아니라, 2가지 이상을 작성해보는 것도 가능하다. 테스트로 어디서나 볼 수 있고, 이벤트 그래프에서 읽기 쓰기가 모두 가능한 상태의 변수를 선언해보았다. 이벤트 그래프에서 Test에 대한 변수를 가져오거나, 세팅하는 것이 가능하다. 가져온 Test 변수를 통해서 s..

인스턴스 대 디폴트 우리가 VScdoe를 통해 작성한 것을 언리얼로 노출시키는 데에는 UPROPERTY()가 필요하다. 괄호 안에 추가적으로 EditAnywhere, VisibleAnywhere 등을 작성해줄 수 있다. 해당 내용을 작성해주기에 앞서 블루프린트 패널과 인스턴스 패널 어디에 값을 노출시켜주는지 알 필요가 있다. 먼저 우리가 만든 BP_PawnTank의 디테일 패널을 보면 기본적인 디폴트 블루프린트가 존재한다. 여기에는 해당 블루프린트에 대한 모든 기본적인 정보가 담겨있다. 해당 BP_PawnTank를 뷰포트로 드래그하면, 인스턴스가 된다. 우리가 작성하고자 하는 VisibleAnywhre는 디폴트와 인스턴스 둘 다 노출된다. 하지만 VisibleInstanceOnly는 이름 그대로 디폴트에..

블루프린트 클래스 파생 우리가 만든 BasePawn을 기반으로, 탱크와 터렛을 위한 블루프린트 클래스를 만들어보자. 이를 위해 따로 블루프린트의 폰용 폴더를 만들어서 해당 위치에 저장하도록 해주었다. 이제 좌측 상단의 컴포넌트를 보면 우리가 만들었던 컴포넌트들이 전부 존재하는 것을 볼 수 있다. 하지만 해당 컴포넌트들을 눌러보면 우측에 디테일 창에 아무것도 뜨지 않는 것을 볼 수 있다. 해당 컴포넌트에 대한 프로퍼티는 C++ 에서 지정해야하기 때문에 언리얼 디테일 창에서는 아무것도 뜨지 않는다. 따라서 캡슐 컴포넌트를 가져오고 크기를 조정하거나, 우리가 원하는 메시를 스태틱 메시 컴포넌트에 할당하기 위해서는 프로퍼티를 노출시켜주어야 한다. 이는 다음 강의에서 이어서 진행된다.

스태틱 메시 컴포넌트 저번 캡슐 컴포넌트에 이어서 스태틱 메시 컴포넌트를 생성할 차례이다. 큰 틀은 저번 강의와 거의 동일하다. 탱크를 위한 베이스와 터렛 부분 2가지를 생성하게 된다. 스태틱 메시 컴포넌트의 경우 클래스 전방 선언이 필요없다. 스태틱 메시 컴포넌트는 기본적으로 모든 액터에 포함되는데, 우리가 사용하고 있는 폰은 액터에서 상속된 클래스이기 때문이다. 헤더 오류 방지를 위해 그냥 클래스 전방 선언을 선언해버리는 것도 하나의 방법이기는 하다. 이번 경우는 이미 포함되어있는데 클래스 전방 선언을 해버리는 것이라 중복되는 케이스이나, 언리얼 엔진 타입의 파일에는 여러 번 포함되지 않도록 하는 보호 장치가 존재하여 상관은 없다. 헤더 파일 보다 위에 존재하는 #pragma once가 그 보호 장치..

캡슐 생성 캡슐 컴포넌트를 직접 생성해볼차례이다. CreateDefaultSubobject()라는 템플릿 함수를 통해서 생성하게 된다. 템플릿 함수이므로 우리가 원하는 컴포넌트인 UCapsuleComponent를 안에 넣어주게 되고, 이름은 () 안에 넣어준다. 또한 해당 함수는 생성자에서만 실행 가능한 함수이다. 안에 UCapsuleComponent를 넣음으로서 우리는 UCapsuleComponent를 사용하게 된다. 따라서 전방 선언만 했던 저번 강의와 달리, 이번엔 해당 헤더 파일을 선언해줄 필요가 생긴다. 그리고 CreateDefaultSubobject는 새로 생성된 컴포넌트의 주소를 반환하며, 우리가 미리 선언했던 UCapsuleComponent 포인터에 저장하게 된다. 이제 캡슐 컴포넌트를 루..

전방 선언 우리는 이제 BasePawn에 캡슐 컴포넌트, 스태틱 메시 컴포넌트 등이 필요한 것을 알고 있다. 이제 VScode에서 간단하게 캡슐 컴포넌트를 선언해보자. 현재 컴파일러가 UCapsuleComponent가 무엇인지 모르므로, 헤더파일을 선언해주어야 한다. 해당 내용은 "Components/CapsuleComponent.h"에 들어있다. 위 헤더파일을 선언해주면 간단하게 해결된다. 하지만 우리는 UCapsuleComponent 타입을 선언하는 것만 원하는 것이지, 해당 헤더파일에 있는 다른 기능들을 원하는 것이 아니다. 헤더를 선언하면 헤더에 속한 모든 내용을 가져오게 되므로, 파일의 용량이 커지게 된다. 이를 방지하기 위해 사용하는 것이 전방 선언이다. 전방 선언은 새 포인터를 선언할 때 사..

컴포넌트 생성 이번에는 우리가 생성했던 BasePawn이 필요한 컴포넌트에 대해서 살펴본다. 클래스에 컴포넌트를 추가할 때는 해당 컴포넌트가 어떤 클래스에 속하는지를 결정해야한다. 다음 선택지를 살펴보자. 씬 컴포넌트 - 변형과 같은 속성이 있음 - 트랜스폼, 어태치먼트이 가능 - 시각적 표현이 불가능 캡슐 컴포넌트 - 씬에서 상속 - 충돌을 처리가 가능 스태틱 메시 컴포넌트 - 씬에서 상속 - 시각적 표현이 가능 우선 폰 클래스의 기본 컴포넌트로 루트 컴포넌트가 존재한다. VScode에서 루트컴포넌트를 작성하고 정의로 찾아가보면, 액터에 속해있으며 씬 컴포넌트로 되어있는 것을 볼 수 있다. 따라서 루트 컴포넌트를 캡슐컴포넌트로 재할당해줌으로서 충돌 처리를 해주고, 쓰태틱 메시 컴포넌트를 붙여줌으로서 메..
이번 섹션의 목표는 탱크 게임을 만드는 것이다.플레이어가 조종할 수 있는 탱크를 만들고, 탱크를 움직이며 발사체를 발사하여 적 포탑을 부수게 된다.적 포탑 또한 탱크를 공격할 수 있으며, 서로의 HP가 먼저 0이 되는 쪽이 승리하게 된다. 기본적인 탱크 움직임을 위한 액션 매핑 및 축 매핑이나, 사운드를 위한 에셋등은 강의자료로 올라와있다.따라서 해당 강의자료를 다운로드하여 사용하게 되는데 나는 4.25버전을 다운로드하여 내가 사용중인 엔진 버전인 5.3으로 실행하였다. 폰 클래스 생성우선 우리는 탱크와 포탑이 필요하다.이를 위해 베이스폰 클래스를 생성해주고, 동일한 기능(발사체 발사)을 가진 탱크와 포탑 자식 클래스를 생성할 수 있다.C++ 클래스를 생성하게 되며, 이때 부모 클래스를..
Crypt Raider: 마무리 이번 섹션을 통해 알아본 것은 다음과 같다. 액터 컴포넌트와 씬 컴포넌트 루멘 시스템 모듈식 레벨 디자인 라인 트레이싱 및 콜리전 헤더 파일 추가 C++ 포인터 및 레퍼런스 반복문 및 배열 블루프린트에서 C++ 호출 전에 배웠던 것들을 토대로, 좀 더 심화된 내용들을 다루게 된 섹션이다. 이번 섹션에서 배웠던 것중 집는 기능이 가장 기억에 남는데, 집는 것이 상당히 복잡한 과정을 거치는 것에 다소 놀라웠다. 처음 생각한 것은 단순히 그냥 눈에 보이는 사물을 집는 것이라고만 생각했다. 하지만 집는 사람이 누구인지, 무엇을 집을 것인지, 특히 집는 것이 어디있는지 찾는 과정이 존재했다. 집는 것이 어디있는지 찾는 과정인 라인 트레이싱이 가장 색다른 느낌을 받았음과 동시에 가장..

레벨 다듬기 이제 게임의 마무리 단계이다. 우리는 영묘에서 보물 조각상을 가져가야 하는데, 만약 보물 조각상을 가져가려하면 창살이 내려와 나가는 문이 닫힌다. 이를 위해 대신할 물건을 가져와 단상에 두어야 한다. 이 부분들을 이제 구현하게 된다. 먼저 대영묘에 단상과 조각상을 비치해주자. 기본적인 조각상의 크기가 매우 작아서 스케일을 조정해주어야 한다. 그런데 이후에 씬이 점점 어두워지는 모습을 볼 수 있다. 이는 씬의 노출 보정 메소드 때문에 벌어지는 현상이다. 포스트 프로세스 볼륨의 노출 칸에 있는 미터링 모드를 변경함으로서 해결이 가능하다. 해당 볼륨은 사실 작은 크기의 블록 형태로, 해당 블록 내에서만 방금 설정한 기능이 작동하게 된다. 우리가 만든 레벨 전체에 적용하기 위해서는 블록의 크기를 키..

불리언(Boolean) 논리 연산자 저번에 만든 액터 태그를 이용하여, 실제 구현을 해줄 차례이다. 이를 위해서는 우선 접근가능한 액터있는지 확인하고, 다음으로 해당 액터가 잡힌 상태인지를 알아야한다. 2가지에 대해 체크를 해주어야하므로, 여기서 불리언 논리 연산자를 사용하게 된다. 접근 가능한 액터를 찾는 함수에서 수정을 하게 되는데, 기존 if문에서 접근 가능한 액터가 있을 시 바로 액터를 반환해준 부분을 수정해주면된다. 먼저 접근 가능한 액터가 있는 지 체크해주고, 잡지 않은 액터인지도 이어서 체크해준다. 위 케이스의 경우 And 연산이기에 && 기호를 사용하였다. 만약 Or 연산을 하게된다면 || 기호를 사용하게 된다. 이러한 불리언 논리 연산자를 사용하여 if 문이 여러개인 것을 하나로 묶어 주..

태그 추가 및 삭제 드디어 비밀문이 제대로 작동하는 것처럼 보이지만, 아직 문제가 남아있다. 바로 잡고 있는 가고일 조각상을 놓지도 않았는데 비밀문이 작동해버리는 것이다. 이를 위해 잡았을 때와 놓았을 때를 알기 위한 태그를 추가해주는 작업이 필요하다. 먼저 잡았다는 내용의 태그를 추가해주자. 간단하게 Tags.Add를 통해 원하는 이름의 태그를 추가하는 것이 가능하다. 플레이를 해보면 가고일 조각상을 잡을 때 새롭게 "Grabbed" 태그가 생긴 것을 볼 수 있다. 이제 놓는 내용의 태그를 추가해주자. 액터를 얻기 위해 GetOwner()를 사용해줄 필요가 있다. 놓는 경우는 기존에 잡았던 "Grabbed" 태그를 지워주는 경우이다. 따라서 Tags.Remove를 통해 해당 태그를 지우게 된다. 집고 ..

캐스팅과 액터 부착 가고일 석상이 트리거 박스 내에 고정시키기 위해서는 가고일 석상을 트리거 박스에 부착시켜서 고정시켜줄 필요가 있다. 이를 위해 액터를 부착시키는 것 이외에도 부착 이후 가고일 석상의 물리 시뮬레이트를 false로 바꿔주어야 한다. 먼저 부착을 위해서 다음 함수를 사용한다. 그리고 물리 시뮬레이트 비활성화를 위해서는 다음 함수를 사용한다. 이제 구현을 해보는데, 먼저 가고일 석상의 루트 컴포넌트를 얻어야 한다. 이를 위해 기존 트리거 cpp 내에서 선언했던 Actor를 사용할 수 있고, GetRootComponent 함수를 사용하여 루트 컴포넌트를 얻을 수 있다. 하지만 여기서 문제가 생긴다. GetRootComponent 함수가 반환하는 컴포넌트는 UScene 컴포넌트이지만, SetS..