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
다음으로 어디에서나 현재 캐릭터를 얻어올 수 있는 중요한 함수를 알 수 있습니다. 현재 캐릭터의 파워를 갱신해 주는데 공식은
-시간흐름 * 약해지는 속도(비율) * 캐릭터의 초기 파워 입니다.
그럼 블루 프린트에 대해 알아보겠습니다. 블루 프린트를 처음 사용해 보아서 약간 당황했습니다. 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에 연결시켜 줍니다.
16 - Enabling UMG
17 - Creating the HUD Blueprint
그리고 .cpp로 가서 UserWidget을 사용하기 위해
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"를 선언해 줍니다.
그다음 솔루션 탐색기에서 BatteryCollector.Build.cs 파일을 찾습니다.
PublicDependencyModuleNames 배열에 "UMG"를 추가해 주고
아래 라인에
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
를 추가합니다.
다시 **GameMode.cpp에 가서 BeginPlay()를 구현해 줍니다.
18 - Setting Up the Play States
이제부터 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 |