
블루프린트 하위 클래스 움직이는 플랫폼을 매번 다시 생성하는 것은 번거로우니, 우리가 만들었던 C++ 클래스를 바탕으로 블루 프린트 클래스를 생성해준다. 그리고 큐브 모습 그대로면 다소 식상하니, 우리가 다운받았던 에셋에서 골라 적용해주었다. 해당 석면 발판을 기존에는 앞뒤로 움직이게 했지만, 위아래로 움직이게 변경을 해주었다. 기능은 이미 구현을 했기에 언리얼에서도 편집가능하게 했던 PlatformVecloity의 Z 값만 변경해주면 간단히 할 수 있다. 해당 석면 발판으로 끝이 아니라, 석면 발판에 에셋을 추가하여 돌기둥 모습을 만들어주었다. SM_Kit_Wall 메시를 이용하여 발판 아래에 4면으로 붙여주고, 해당 형태를 3단으로 복사해주었다. 이제 해당 블루프린트 클래스를 뷰포트에 드래그하고 실행..

멤버 함수 사용 현재 무사히 앞 뒤로 움직이는 것까지 완료한 상태이다. 하지만 속도 값을 1000으로 변경 후 다시 실행해보면 여전히 시작점을 지나치며 움직이는 현상이 발생할 수 있다. 현재 if문은 끝 지점을 지나쳐야만 하는데, 이때 지나치는 정도가 델타타임에 따라 다르게 되기 때문이다. 델타타임은 속도에 영향을 받기 때문에, 속도가 빠를수록 심해지고, 시간이 지날수록 거리에 오차가 점점 심해질 수 있다. 이를 개선하기 위해서는 원래 시작 위치에서 목표로 한 위치로 가려면 얼마나 이동해야 하는지 미리 계산을 해주는 것이다. 먼저 속도는 화살표로 나타낼 수 있고 방향과 크기를 갖는다. 설정한 만큼만 이동하고 멈추는 정확한 위치를 알 기 위해서는 위 속도 화살표의 방향을 알아야한다. 이 화살표의 방향을 벡..

If 문장 저번에 얼마나 갔는지 체크를 했으니 이제 너무 멀리가면 반대방향으로 갈 차례이다. 블루프린트에서는 브랜치 문을 통해 할 수 있으며, C++에서는 If문에 해당한다. 우선 얼마나 멀리가면 반대방향으로 갈지 기준으로 잡을 거리를 100으로 초기화해주었다. 이제 기존의 얼마나 움직였는지를 체크하는 DistanceMoved 변수를 이용하여 if 문을 작성해준다. 이때 DistacneMoved를 지역변수로 바꾸고, 헤더파일에서 선언했던 것을 지워주었다. 만약 움직인 거리가 기준 거리 100을 넘기면 속력에 음수를 붙혀 반대방향으로 향하도록 해준다. 이 상태에서 컴파일을 하고 실행해보면, 앞뒤로 움직이는 모습을 볼 수 있다. 하지만 문제점이 있는데, 그것은 현재 플랫폼이 시작점을 조금 지나치며 움직인다는..

범위 지정 연산자 현재 작성했던 의사코드 중에서 앞으로 이동하는 부분만 구현한 상태이다. 이제 뒤로 가는 것을 구현하게 된다. 우선 뒤로 가기 위해서 얼마나 이동했는 지 알 필요가 있으며, 이를 위해 필요한 것은 다음과 같다. 플랫폼 시작 위치 플랫폼이 이동한 거리 우선 시작 위치는 언리얼 상에서 굳이 알 필요가 없다. 따라서 UPROPERTY를 작성하지 않고 선언만 해주었다. 그리고 플랫폼이 이동한 거리는 언리얼 상에서 편집할 필요가 없다. 따라서 UPROPERTY(VisibleAnywhere)로 설정함으로써 보이게만 설정해준다. 그리고 해당 거리는 업데이트 된 것을 체크하기 위해 기본 값을 -1로 초기화해주었다. 그럼 이제 시작 위치를 얻을 차례이다. 시작 위치는 당연하게도 맨 처음 플레이를 했을 때..

속도와 델타타임(DeltaTime) 기존에는 속도를 직접 1을 더해주었지만, 속도 전용 변수를 만들어서 적용해준다. 이 과정에서 델타타임이라는 것을 이용해 이동 프레임률을 독립적으로 만드는 방법 또한 알아본다. 기존에는 직접 X 값에 대해서 1을 더하여 하나의 벡터에만 값을 더해주었다. 하지만 벡터에 다른 벡터를 추가할 수 있음을 이제 알기 때문에, 이를 이용하여 새롭게 벡터를 추가해준다. 초기화 값은 (100, 0, 0)으로 설정하였고, 추가로 Category라는 것을 생성하였다. EditAnywhere 옆에 있는 것을 볼 수 있는데, 말그대로 다음과 같은 ("Moving Platform") 카테고리를 생성한다는 것이다. 언리얼에 가서 Moving Plaftform을 보면, 디테일 패널에 위와 같이 M..

함수 반환 값 이번에는 저번에 작성했던 의사코드를 구현을 하게 된다. 기존에 작성했던 코드를 지우고 함수 반환 값을 이용하여 구현을 시도 한다. 함수 반환 값을 이해하기 전에 잠깐 다음 두 가지 용어에 대한 개념을 이해할 필요가 있다. 첫 번째는 표현식(Expression)으로 값을 생성하는 코드 조각에 해당한다. 다음으로 문(Statement)으로 수행되어야할 동작을 의미한다. 이 두 가지는 관련되어있으며, 거의 항상 표현식은 동작을 실행시켜야할 때 코드 조각의 값을 계산하기 위해 포함된다. 하지만 반대로 문은 통해 값이 나타나지는 않는다. 다음 표현식의 예시를 살펴보자. MyVector LocalVector.Z + 100 GetActorLocation() C++에서 MyVector를 입력하면 해당 변..

의사코드 VScode 코딩하는 화면을 보다보면, 함수위에 //와 함께 초록색으로 적힌 텍스트를 볼 수 있다. 해당 코멘트는 주석이라고 하며, 컴파일러에서 무시하는 코드이다. // 뒤에 작성하는 내용은 주석처리되며, 초록색으로 작성되는 것을 볼 수 있다. 이러한 주석을 이용하여 앞으로 어떠한 것을 구현하려는지 참조할 수 있는 의사 코드를 작성할 수 있다. 현재 움직이는 플랫폼은 오른쪽으로 밖에 움직이지 않는다. 우리는 앞으로 앞뒤로 움직이는 플랫폼을 만들 예정이다. 이를 의사 코드를 이용해 어떻게 구현할지 미리 다음과 같이 작성해볼 수 있다.

로컬 변수 (지역 변수) 우리가 여태 사용해온 변수들은 클래스 변수이다. 클클래스 변수는 클래스의 인스턴스가 있는 한 유지된다. 변수가 유지되는 기간을 스코프라 하며, 클래스의 인스턴스만큼 유지되는 것 이외에도 함수만큼 유지되는 경우도 있다. 로컬 변수는 후자에 해당하게 된다. 로컬 변수는 함수 내에서만 존재하고, 함수를 호출할 때 마다 초기화가 된다. 먼저 다음과 같이 값을 할당해보았다. 기존의 MyVector의 경우 매 프레임마다 Y 값을 계속 더해줌으로써 우측으로 이동했지만, LocalVector의 경우 매 프레임마다 Z 값을 계속 더해줘도 위로 이동하지 않는다. 매 프레임마다 (1, 2, 3)의 위치로 초기화를 진행하고 Z 값을 1을 더해주는 것이기 때문에, Z 값을 더해준다 한들 다시 (1, 2..

Tick 움직이는 플랫폼을 위해서는 Tick 함수를 알아야 한다. Tick 함수를 이해하기 위해서는 대부분의 게임 엔진을 구축하는 게임 루프 과정을 우선 알 필요가 있다. 1. 게임 엔진이 플레이어의 인풋을 가져옴 (스페이스바, 마우스 버튼 등) 2. 위 정보를 이용해 게임 상태를 업데이트 (플레이어 이동, 공 튀어오름 등) 3. 게임 엔진에서 게임 상태를 가져와 화면에 렌더링 렌더링을 통해 일련의 숫자들이 화면에 표시될 이미지로 바뀌며, 이러한 이미지가 프레임이다. 동영상을 구성하는 그림 중에서 그림 하나가 프레임이라고 생각하면 된다. 이러한 프레임을 초당 얼마나 많이 나타낼 수 있는가를 프레임률(FPS)이라고 한다. 컴퓨터가 1초당 통과할 수 있는 게임 루프의 수이자, 인풋을 처리하고 상태를 업데이트..

C++에서 함수 호출하기 저번에는 구조체를 사용해 위치를 직접 할당해줬지만, 이번에는 함수를 호출하여 위치를 지정해준다. 블루 프린트에서 SetActorLocation이라는 함수를 사용했던 것을 기억할 것이다. C++에서도 같은 함수를 사용하며, 인수라고 불리는 인풋을 받는다. FVector로 할당했던 1, 2, 3을 생성자를 통해 직접 할당해줄 수 있다. 컴파일 후 언리얼로 돌아가서 확인을 해보는데, 현재 MovingPlatform2 액터에는 컴포넌트가 존재하지 않는다. 따라서 사실상 위치를 가질 수 없는 상태이다. 이를 위해 컴포넌트로 큐브를 추가해주었다. 우리는 FVector(1, 2, 3)의 값을 FVector 타입 변수인 MyVector에 저장했었다. 따라서 SetActorLocation에 FV..

C++에서 구조체 사용하기 전 강의를 통해 간단한 변수를 사용해보았지만 벡터나 트랜스폼 같이 더 복잡한 유형은 어떻게 해야할까? 과정은 변수를 선언할 때와 거의 동일하다. 마찬가지로 언리얼에 노출시키기 위해 UPROPERTY(EditAnywhere)를 작성해주고, 이번에는 FVector 타입을 선언한다. 블루프린트에서 다뤘던 벡터를 이렇게 다루는데, 여기서 맨앞에 작성한 F는 구조체를 뜻한다. 앞서 MovingPlatform2에 A를 붙여 액터를 나타낸 것과 같은 방식이다. 값을 할당할 때에는 기존 변수 때와는 달리, 새 구조체나 클래스 값을 만드는 생성자가 필요하다. 생성자는 항상 데이터 타입과 이름이 같으며, 테스트로 X, Y, Z에 대해 각각 1, 2, 3을 할당해보았다. 이렇게 만든 값을 다른 값..

C++ 파일 및 BeginPlay 저번 강의를 통해 C++ 변수를 선언해주었지만, 아직 기능을 실행하는 방법은 모른다. 이번엔 간단한 기능을 테스트해보게 된다. 블루프린트에서 BeginPlay를 기억할 것이다. Vscode에서 cpp 파일을 보면 마찬가지로 BeginPlay 항목이 존재한다. 블루 프린트 때와 마찬가지로 실행시에 해당 항목을 적용한다는 것이다. 우선 간단하게 전에 만들었던 MyInt의 값을 게임 플레이 시에 9로 바뀌도록 해보자. 단순히 MyInt에 9를 할당해주면 된다. 이제 언리얼로 돌아가 플레이를 누르면 MyInt의 값이 9로 바뀌어있다. 이번엔 할당이 아니라 간단한 덧셈을 테스트해보자. 이를 위해 입력받는 값 A, B와 결과값 APlusB를 선언해주었다. 이를 cpp 파일에서 단순..

UPROPERTY 변수 레벨 블루 프린트에서 변수를 만들었던 것을 기억할 것이다. 이번엔 VScode에서 C++ 변수를 생성해준다. 순서대로 타입, 변수명을 적고 이후에 원하는 값을 할당해주면 된다. 여기서 주의해야 할 것은 그냥 변수만 선언하면 VScode상에서만 수정이 가능한 코드이다. 만약 해당 변수를 레벨 블루 프린트때와 같이 언리얼에서도 사용하고 싶다면 변수 작성하기 전에 UPROPERTY를 선언해주어야 한다. 그리고 바로 다음에 오는 괄호에는 EditAnywhere을 적어주었는데, 이는 어디에서나 편집가능하도록 선언해준 것이다. 이후에 빌드를 해주는데, 언리얼 상에는 라이브코딩이라는 기능이 존재한다. 우측 하단에 위 빨간 박스로 체크한 이미지를 누르면 즉석에서 VScode를 통해 적었던 C++..

C++ 프로젝트 컴파일링하기 이번에는 드디어 설치한 에디터를 통해 C++ 클래스를 생성하고 컴파일하는 과정을 직접 해보게 된다. 우선 언리얼에는 기본 에디터가 우리가 사용할 비주얼 스튜디오 코드(이하 VScode)가 아닌 비주얼 스튜디오로 되어있다. 따라서 이를 바꿔주는 작업이 필요하다. 위와 같이 편집 -> 에디터 개인설정을 들어가면 좌측에 소스코드 칸이 있다. 해당 칸에서 소스 코드 에디터를 전환하는 것이 가능하다. 전환후에는 언리얼을 재시작하는 것이 필요하다. 이제 C++ 클래스를 생성할 차례이다. 상단 툴에서 새로운 C++ 클래스를 선택하여 생성이 가능하다. 우리가 만들고자하는 것은 움직이는 플랫폼이기에 액터를 선택하여 만들어준다. 생성 과정에서 위와 같은 메시지가 뜨는 것을 볼 수 있다. 여기서..

VScode 설치하기 저번 비주얼 스튜디오를 설치한데에 이어 이번엔 비주얼 스튜디오 코드를 설치할 차례이다. 이번엔 저번보다 더욱 간단하다. 우선 해당 사이트에 들어가 바로 보이는 다운로드 버튼을 눌러준다. 사이트 링크 : https://code.visualstudio.com/ Visual Studio Code - Code Editing. Redefined Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux,..