언리얼 - 게임 개발 39

첫 게임 개발 (29) _ 대화 시스템 추가 및 간단한 컷씬 구현

저번에 만든 향상된 대화시스템에서 텍스트가 앞에서부터 출력되는것이 아니라 통째로 바뀌어 좀 밋밋했었다. 먼저 만들었던 간단한 대화 시스템에서는 텍스트가 앞에서부터 글쓰듯이 출력이 되도록 만들었는데 이것을 새롭게 만든 시스템에 적용해볼 것이다. 먼저 대화 위젯에서 TextDelay 변수를 플로트형식으로 추가하고 위와 같이 노드를 추가하였다. 추가한 노드는 전에 만들었던 간단한 대화구현에서와 동일하여 어렵지 않게 추가하였다. Add Dialogue 함수에도 마찬가지로 TextDelay 변수를 추가한다. TextDelay로 각각의 텍스트가 출려되는 속도를 조절할 수 있다. 테스트를 위해 'Z...Z...Z...'의 출력 속도만 위와 같이 느리게 설정하였다.  잘 적용이 된 것을 볼 수 있다. 다음으로는 간단히..

첫 게임 개발 (28) _ 대화 선택지 구현

저번에 대화를 간단히만 구현해보았는데 이번에는 대화에서 직접 선택지를 고를 수 있는 좀 더 향상된 대화 시스템을 구현해보고자 한다.  열거형 블프를 만들어서 위와 같이 2가지의 상태를 입력으로 추가한다. 대화 위젯을 위와 같이 만들었다. 대화 선택지를 고르는 Option 위젯을 만들었다. BPI를 만들고 Interact, ConversationClosed, SetInteractableState 함수를 추가한다. 다음으로 액터 컴포넌트를 만들고 함수를 9개를 추가한다. 이는 대화를 하는 NPC에 들어가는 액터 컴포넌트의 베이스이다. Open Conversation은 대화 위젯을 띄운다.  Close Conversation은 대화 위젯을 지우고 BPI에 신호를 보낸다. 이 신호는 대화가 끝나고 위젯 제거 후..

첫 게임 개발 (27) _ 세이브 로드 시스템 구현하기 2

캐릭터의 속성을 저장하는 방법에 대해서 학습하였고 이번에는 각 슬롯별로 저장 및 로드는 구현해볼 것이다. 구현하고 싶은 세이브 로드 시스템을 정리하면 다음과 같다. 저장 슬롯은 1,2,3,4,5로 총 5개이며 메인메뉴에서 뉴 게임 또는 로드 게임을 선택 할 수 있다. 로드 게임을 선택하고 각 슬롯을 눌렀을 때 저장된 값이 있다면 그 값을 로드한다. 저장된 값이 없다면 아무일도 일어나지 않는다. 뉴 게임을 선택하고 슬롯을 선택할 때 저장된 값이 있다면 새 창을 띄워서 기존파일에 덮어 씌우겠냐고 물어보고 Yes를 누르면 그 슬롯에서 새 게임을 시작하고 No를 누르면 다시 슬롯 선택창으로 돌아온다. 저장된 값이 없다면 바로 새 게임을 시작한다. 하루면 구현가능할 것으로 잡았지만 중간에 다 다시 작업을 뒤엎으면..

첫 게임 개발 (26) _ 세이브 로드 시스템 구현하기 1

세이브 로드 시스템을 구현해 볼 것이다. 여러 강의들과 자료들을 찾아보았지만 능력 구현 저장에 대한 내용은 없어서 구현하기 꽤 애를 먹었다. 제작하려는 게임에서 여러 능력들을 사용하므로 능력 구현 저장이 필수로 들어가기 때문에 여러 시행착오를 거쳤다. 먼저 저장하려는 값들을 구조체 블프의 형태로 저장한다. 체력과 에너지는 Float 형식, 능력은 전에 만들었던 E Abilities 열거형식, 위치는 트랜스폼의 형태로 저장한다. 블프 형식에서 언리얼에서 제공하는 Save 형식의 블프를 만들고 변수로 PlayerSave를 만들어 형식을 위에서 만든 구조체 형식으로 넣는다. BPI를 만들고 위와 같이 4개의 함수를 추가한다. 단순히 ESC를 누르고 게임을 저장하는 방식이 아니라 특정 위치에서 물체와 상호작용시..

첫 게임 개발 (25) _ 메인 메뉴 만들기

메인메뉴에 세이브와 로드 시스템까지 엮여있어 한번에 하려 했으나 세이브 로드 시스템이 생각보다 복잡하고 적용해야하는 것들이 많아서 따로 분리하였다.먼저 메인메뉴와 게임내에서 일시정지창을 구현할 것이다. 간단히 메인메뉴 창을 디자인하였다. 로드게임은 아직 구현하지 않았고 나머지는 위와같이 구성하였다. 뉴게임 버튼은 Open Level로 캐릭터 컨트롤러를 받아서 실행하도록 하였다. Quit 버튼은 Quit Game 함수로 간단히 구현할 수 있다. Settings 버튼은 누르면 화면에서 위젯을 제거 후 Settings 위젯을 Add to Viewport하도록 하였다. 다음은 게임내에서의 일시정지 위젯이다. ESC를 누르면 동작하도록 할당하였다. Resume 버튼은 누르면 다시 게임으로 돌아가야 하므로 게임 P..

첫 게임 개발 (24) _ 레벨 이동

게임의 필수 요소인 맵 사이의 이동을 간단히 구현해 볼 것이다. 먼저 앞서서 적 AI의 내비게이션 빌드를 위해 모든 땅에 투명 큐브를 설치하였는데 더 간단한 방법을 찾았다. 타일맵에서 콜리전 두께를 조절하여 두껍게 만들면 정상적으로 내비게이션 빌드가 이루어졌다. 위와 같이 모든 땅에 자동적으로 적용된 것을 볼 수 있다. 먼저 맵간 이동을 위한 게이트를 만들기 위해 Gate 블프를 만들었다. 맵 간의 이동을 위해 전에 나이아가라를 이용하여 만들었던 포탈을 추가해주고 Box 콜리전을 넣었다. 위젯 블프를 만들어 이미지를 화면 전체로 넣어주고 점차 검은 화면으로 바뀌는 애니메이션을 추가하였다.  커스텀 이벤트를 만들고 Play Animation으로 Fade애니메이션을 동작하도록 한다. 맵 이동을 위해 앞선 맵..

첫 게임 개발 (23) _ 간단한 대화 구현

플레이어 캐릭터에 상호작용 키를 만들고 특정 물체와 상호작용시 간단한 대화가 나타나도록 구현해볼 것이다. 먼저 E키에 상호작용을 위한 키를 할당하였다. 플레이어 BP에 InteracTrace 함수를 추가하여 위와 같이 구성하였다. Sphere Trace 함수를 이용하여 캐릭터의 앞에 물체를 감지하는 Trace를 구현하는 함수이다. 상호작용할때 Dialogue_C 클래스가 있을 시 Dialogue_C의 Speaking이벤트를 발생하도록 하였다. E키를 누르면 위와 같이 캐릭터의 앞에 Trace가 나타나는 것을 볼 수 있다.  BPI를 만들어 CheckSpeaking과 Speaking함수를 추가하였다. Dialogue_C 액터 컴포넌트이다. 필요한 물체에 넣어야하기 때문에 액터 컴포넌트 블루프린트가 적당하다..

첫 게임 개발 (22) _ 타일 맵으로 맵 및 미니맵 만들기

전에 구한 에셋들로 타일맵을 이용하여 맵을 만들어 볼 것이다. 타일 맵을 이용하여 위와 같이 간단한 맵을 구성하였다. 위의 맵을 새 레벨에 끌고와 위치시킨다. 타일맵에서 설정한 블록에 얇은 콜리전이 구성된 것을 볼 수 있다.  하지만 적의 AI이동을 위해서  NavMeshBoundsVolume로 맵 전체를 커버하면 콜리전이 얇아서 동작하지 않았다. 이를 해결하기 위해 여러 방법을 찾았고 시행착오 끝에 가장 적절한 것은 투명한 콜리전 큐브를 겹치도록 설치하는 방법이 가장 적당하였다. 위의 사진처럼 초록색으로 내비게이션 빌드가 이루어진 것을 볼 수 있다.  전에 만든 비 나이아가라 시스템을 이용하여 일정 부분에 비를 흩뿌렸다. 2D에서 카메라가 Y축 1200으로 고정되므로 비 이펙트로 Y축 방향 600정도로..

첫 게임 개발 (21) _ 땅에서 솟아나는 공격 구현

땅에 위험 표시가 뜬 뒤에 잠시 후 공격이 들어오는 방식은 매우 흔하다.이번에는 이러한 공격을 구현해 볼 것이다.  땅에 나타나는 경고표시를 위해 위와 같이 간단한 플립북을 블프로 만들었다. 땅에서 솟아나는 공격도 블프로 간단히 만들고 히트 박스를 크기에 맞게 조절한다. 히트박스와 오버랩시 플레이어에게 데미지를 입히도록 설정한다. 앞서 만든 연속 투사체 애니메이션을 재활용해서 ANS만 새로 만들었다. 적 블프에서 GroundAttack 커스텀 이벤트를 만들고 애니메이션을 부여하였다. 공격을 구현하는 핵심인 ANS를 만드는데 좀 시간이 걸렸다.우선 ANS 시작시 플레이어의 위치를 벡터변수로 저장한다.경고표시는 바닥에 생기기 때문에 핀분할을 해서 Z축만 0으로 가져와 저장하고 그 위치에 경고 블프를 Spaw..

첫 게임 개발 (20) _ CoyoteTime, JumpBuffering 구현

코요테 타임(CoyoteTime)이란 캐릭터가 절벽 끝에서 점프할 때 떨어지고 난 직후 약간의 시간동안 점프를 눌러도 점프가 가능한 시간을 뜻한다.점프 버퍼링은 캐릭터가 지면에 닿아야만 점프가 가능한 시스템에서 지면에 닿기 직전에 미리 눌러도 점프가 되게하는 의미이다.이 둘은 게임의 조작감을 편하게하므로 대부분의 플래포머 게임에 적용되어 있다.이 둘을 구현해 볼 것이다. 먼저 플레이어 블프에서 Event On Waling Off Ledge라는 이벤트를 호출한다.이는 언리얼에서 기본적으로 제공한다. 캐릭터가 가장자리에서 떨어지는 순간을 불러오는 이벤트이다.Is In Coyote Time 불리언 변수를 만들고 Coyote Time Length라는 변수를 만들어 코요테 타임을 0.2초로 지정하였다. 다음으로 ..