언리얼 엔진 시작하기 2

2016. 11. 30. 13:43기술/언리얼 스터디

반응형

현재시간 2016-12-01 오전 10시 12분, 오후 12시 10분 ~ 오후 1시 점심시간 및 휴식시간 ( 언리얼 엔진 공부 3일째 )

튜토리얼이 이제 절반 정도 남았습니다. 다시 튜토리얼을 진행해 보도록 하겠습니다.

13 - Powering Down the Character

14 - Changing the Character's Speed and Material

이번 두 장에서는 캐릭터의 파워가 실시간으로 감소되고 본격적으로 블루 프린트를 사용하는 것을 보여줍니다.
BtteryCollectorGameMode.h 에 DecayRate (약해지는 속도) 변수를 하나 선언하고 Tick 함수를 선언합니다.
참고로 Tick 함수에 마우스 오른쪽 클릭을 하고 빠른 작업 > Create Declaration을 하면 자동으로 cpp에 함수가 정의 됩니다.
그리고 Ctrl+K, O를 하면 .cpp파일로 가서 코드를 작성할 수 있습니다.



다음으로 어디에서나 현재 캐릭터를 얻어올 수 있는 중요한 함수를 알 수 있습니다. 현재 캐릭터의 파워를 갱신해 주는데 공식은

-시간흐름 * 약해지는 속도(비율) * 캐릭터의 초기 파워 입니다.


그럼 블루 프린트에 대해 알아보겠습니다. 블루 프린트를 처음 사용해 보아서 약간 당황했습니다. 2번정도 해 보니 굉장히 편리한 것 같습니다.



일단 TheridPersonCharacter의 블루 프린트를 열면 Construction Script를 볼 수 있습니다.

함수를 하나씩 찾아서 사용합니다. 일단 Get Materials를 검색해서 놓고 Return Value로 Get을 놓습니다.

그리고 Create Dynamic Material Instance 함수를 검색해서 놓고 Return Value로 Set PowerMaterial를 놓습니다.

그리고 타겟, Source Material등 선을 연결해 줍니다.

만들어 나가는 과정이 해당 함수들을 알고 있어야 가능할 것 같습니다. 블루 프린트를 계속 사용해 보면서 익혀야 할 것 같습니다.


위 그림의 의미는 생성자에서 Create Dynamic Material Instance 함수를 호출 하는데 타겟이 Mesh이고 Source Material은 Mesh에서 Get Materials의 0번째 재질이라는 것이고 생성한 재질을 Power Material에 세팅한다는 것입니다.



위 그림은 이벤트 그래프인데 일단 플레이어의 Current Power와 Inital Power를 가져와서 float 나눗셈을 해줍니다. 그 다음 Clamp 함수를 통해서 최소 최대값을 정해 줍니다. 다음으로 선형보간 함수인 Lerp (Linear Color)를 이용해서 Alpha값에 대입해 줍니다.

그럼 캐릭터의 파워가 내려갈수록 재질의 색상이 창백하게 변하게 됩니다.

PowerChangeEffect 함수가 호출 될 때에 SetVectorParameterValue 함수를 호출해서 타겟은 PowerMaterial 값은 LinearColor를 설정 해주면 됩니다.



C++ 코드에서 UFUNCTION으로 지정해 준 부분이 매우 중요합니다. 저는 아직 정확한 의미를 알지 못합니다. 차츰 알아가도록 하겠습니다. 이 변수가 잘못 될 경우 블루 프린트가 오작동 합니다.



창백하게 변하는 캐릭터와 베터리를 습득 했을 때 노란색으로 변하는 캐릭터를 확인할 수 있습니다. ( 현재 시간 오후 2시 13분, 10분간 휴식)

15 - Adding Particles to the Battery Pickup

다음으로 코딩을 하지 않고 블루 프린트만으로 파티클을 추가합니다.


BatteryPickup 블루 프린트로 가서 Was Collected 이벤트를 추가합니다.

그다음 파티클을 추가하는 Spawn Emitter Attached를 추가하고 Emitter Template에 P_electricity를 선택해 주고 오른쪽에 찾기 아이콘을 누른다음 파티클을 편집합니다.

참고로 선을 더블 클릭 하면 중간 점이 생기고 Alt 키를 누른 다음 선을 클릭하면 선이 사라집니다.



이 파티클이 추가되는 오브젝트는 PickupMesh입니다. Attach to Component에 연결시켜 줍니다.

Spawn Emitter Attached의 Return Value로 Set Beams Target Point를 호출해서 어디에 붙일지 알려줍니다.
어디를 알아내야 하는데 Get Player Character를 호출해 준 다음 Return Value로 GetMesh를 호출해 줍니다.
다음 Get Socket Location을 호출해 주는데 캐릭터 블루 프린트의 스켈레톤 메쉬를 더블클릭 해보면 본 이름을 찾을 수 있습니다.
Socket Name에 본 이름을 써 줍니다. 그리고 이 반환값을 Set Beam Target의 New Target Point에 연결 시켜 줍니다.

그다음 Set Beam Target에 시퀀스를 주어서 Delay를 두개 실행합니다. 하나는 1초뒤에 Was Collected의 부모가 호출되게 해 두면 Implementation이 호출되어 객체가 파괴 됩니다.
0.1초 뒤에는 다시 파티클 실행에 연결시켜 주어서 0.1초마다 파티클 위치가 갱신되는 것을 볼 수 있습니다. (현재 시간 3시 38분)



16 - Enabling UMG

17 - Creating the HUD Blueprint

이 두 장에서는 UI에 대해서 설명합니다. 내용은 그냥 프로그래스바 하나 추가해 주는 것입니다. "사장님이 프로그래스바 하나 추가 하는게 뭐가 어려워!!" 라고 윽박 지를지 모르겠지만 내용을 보면 다소 복잡합니다.

일단은 BatteryCollectorGameMode.h에 다음과 같이 변수를 선언해 줍니다.


그리고 .cpp로 가서 UserWidget을 사용하기 위해

#include "Runtime/UMG/Public/Blueprint/UserWidget.h"를 선언해 줍니다.

그다음 솔루션 탐색기에서 BatteryCollector.Build.cs 파일을 찾습니다.

PublicDependencyModuleNames 배열에 "UMG"를 추가해 주고

아래 라인에

PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

를 추가합니다.


다시 **GameMode.cpp에 가서 BeginPlay()를 구현해 줍니다.


승리시 캐릭터의 파워 변수를 설정해 주고 UI 객체를 생성해 주는 코드 입니다.

그다음 콘텐츠 브라우저에서 유저 인터페이스 > 위젯 블루프린트를 하나 만들어 줍니다. ( UI 레이아웃 )


더블 클릭하면 다음 창이 열립니다.

아, 집 컴퓨터가 메모리가 4GB인데 탭을 여러개 띄어 놓으면 메모리 부족으로 언리얼 에디터가 종료되는 것 같습니다. 고사양 엔진인 것 같습니다. 불필요한 탭들은 그때 그때 닫아 주어야겠군요. 복원 기능이 있어서 좋습니다만 복원 눌러도 에디터가 종료 됩니다.


프로그래스 바를 하나 레이아웃에 배치한 다음 우측에서 앵커를 맞추고 위치와 Alignment를 맞춥니다.
그다음 콘텐츠 브라우저에서 마우스 우클릭 > 블루 프린트 클래스를 클릭해서 생성합니다. 모든 클래스에서 BatteryCollectorGameMode를 선택합니다. 이름은 GameMode_BP 입니다.
더블 클릭해서 HUDWidget Class를 BatteryHUD로 지정해 줍니다.

그다음 세팅 > 프로젝트 세팅 > 맵 & 모드에 가서 Default GameMode를 GameMode_BP로 설정합니다.


창백해지다가 베터리를 먹으면 재질 색상이 노란색으로 되는것을 확인할 수 있습니다.
언리얼 엔진은 그래픽이 정말 좋군요! 유니티 하다가 신세계를 보는 느낌 입니다. ( 현재 시간 5시 43분, 오늘은 다른일이 있어서 6시간 정도 공부하고 마무리 해야겠습니다. )

UPDATE DAY - 오늘은 컴퓨터 정리 좀 하고 각종 업데이트 이슈를 처리 하였습니다.
2016-12-02 오전 9시 49분 아침 식사를 하고 언리얼 새로운 기능 좀 보고 Visual Studio 2015 Update 3 설치하고 있습니다. 최근 유니티도 버전업 주기가 짧아진 것 같습니다. 5.5.0f3 버전이 새로 나와서 업그레이드 중입니다. 집 컴퓨터 램이 부족한거 같아서 DDR3 10600 RAM 8기가도 새로 구입했네요. 메인보드가 12GB 까지 지원한다고 합니다.)

18 - Setting Up the Play States

2016-12-03 오전 7시 40분 시작, 8시 50분 ~ 9시 6분(아침 식사)

이제부터 SyntaxHighlighter 를 사용하도록 하겠습니다.


블루프린트 키워드 가운데 BlueprintPure 는 계산이 빠르고 자주 변경되는 값일 때 쓰면 좋다고 합니다.


ABatteryCollectorGameMode 클래스에 enum을 추가합니다. UENUM은 블루프린트에서 쓰기 위해서 선언해 줍니다.

ABatteryCollectorGameMode 는 언리얼에서 자동 생성된 게임 모드 관련 클래스 입니다.



 EBatteryPlayState CurrentState; 변수를 private로 선언해 주는데 프로그래밍 할 때 변수는 기본적으로 private을 생각합니다. 그리고 하위 클래스에서 사용 가능 하도록 할 때 protected로 풀어주고 전체적으로 공개 할 필요가 있을 때는 public으로 풀어 줍니다. 하지만 변수를 public으로 풀어주면 문제가 생길 수 있습니다. 위에서 CurrentState값을 아무데서나 변경할 수 있도록 한다면 게임 상태에 버그가 발생할 수 있습니다.

 그리고 언리얼에서는 블루 프린트를 주로 사용하므로 그냥 Set, Get 함수를 만들어 주는게 좋습니다.

 Get 함수에서 뒤에 const를 붙이는 이유는 그냥 읽기 전용이라고 생각하시면 됩니다.


언리얼 에디터에서 BatteryHUD 블루 프린트를 열고 상단 중앙에 Text를 하나 만든 다음 우측에서 Text의 바인딩 생성을 하면 블루 프린트를 편집할 수 있습니다.


 GetGameMode를 하고 BatteryCollectorGameMode 형변환을 합니다. As Battery Collector Game Mode에 Get Current State를 하면 enum값을 얻어 올 수 있는데 Return Value에 선택(Select)를 달아주고 텍스트를 입력 한 다음 반환 노드에 설정해 주면 됩니다.

 블루 프린트도 자주 사용하다 보면 익숙해질 것입니다.


사실 중요한 것은 "어떻게 게임 상태를 변경할 것인가?" 입니다. 그냥 C++ 코드로 작성하면 정말 쉽죠. 그것을 UI에 표시하거나 하기가 다소 어려운데 언리얼 엔진에서는 블루 프린트를 사용해 주는 것이구요.


게임 상태 변경에 따른 문자열 변환 처리를 블루 프린트로 해 보았습니다.


19 ~ 20 장은 코드를 수정해 주는 부분 입니다.

SpawnVolume을 얻어와서 SpawnVolumeActor에 넣어주고


SetCurrentState를 할 때, State를 Handle 해 주는데 주요 코드는 다음과 같습니다.

내용은 GameOver가 되었을 때, 입력 방지, 점프 방지, 모든 Spawn을 멈추고 캐릭터에 물리 효과를 주는 것입니다.


캐릭터가 저렇게 부셔지는 효과는 해골 몬스터에게 적용 시켜 주면 좋겠군요. 일반 캐릭터는 죽는 모션이 있습니다.


21장에서는 이번 튜토리얼을 마무리 합니다. ( 실무 프로젝트에서도 마무리가 정말 중요하죠. )

일단 SpawnVolume의 크기를 맞춰 줍니다. ( 전체적인 맵에서 베터리가 떨어지게 해줍니다. )

플레이어의 위치도 맵의 정 중앙으로 맞춰 줍니다. 그다음 캐릭터 파워가 감소하는 속도를 조절해 주면서 게임 플레이가 재미 있도록 밸런스를 맞추어 줍니다.

벨런스 테스트는 계속 플레이 해 볼 수 밖에 없습니다.

상단바 UI Text 폰트 크기도 수정해 줍니다.


다음으로 파티클 이펙트 설정 조금 수정해 주면 이 튜토리얼이 마무리 됩니다. 파티클 이펙트 설정 수정은 어렵지 않습니다. ( 아마도 디자이너의 업무일 것 같습니다. )



이 게임의 법칙(Rule)은 다음과 같습니다.

  • 시간이 지남에 따라 캐릭터의 파워가 줄어듭니다.

  • 캐릭터의 파워가 전부 소모되면 실패로 게임이 끝납니다.

  • 땅에 떨어지는 베터리를 먹으면 캐릭터의 파워를 채울 수 있습니다.

  • 캐릭터의 파워가 전부 차게 되면 성공으로 게임이 끝납니다.


동영상 설명 : 동영상에서 캐릭터는 놀고 있다가 파워가 줄어들어서 사망하고 맙니다. 하지만, 괜찮습니다. 게임은 다시 시작하면 되니까요. 한 번 죽었던 캐릭터는 열심히 뛰어 다니며 베터리를 줍습니다. 그리고 성공합니다.


게임의 법칙을 잘 지켜야겠죠?


( 현재 시간 : 오후 1시 18분 점심 식사를 해야겠네요. )

반응형

'기술 > 언리얼 스터디' 카테고리의 다른 글

언리얼 엔진 시작하기 6  (0) 2017.01.02
언리얼 엔진 시작하기 5  (0) 2016.12.30
언리얼 엔진 시작하기 4  (0) 2016.12.12
언리얼 엔진 시작하기 3  (0) 2016.12.03
언리얼 엔진 시작하기 1  (0) 2016.11.28