전체 글 41

UE4 게임 개발 EscapeGame - 12 : 좀비 AI (비헤이비어트리, 블랙보드)

인공지능을 무엇을 넣으면 좋을까 고민하다가 좀비를 넣어봤습니다. 비헤이비어트리는 아래와같이 구성하였습니다. 블랙보드 키값으로 Target을 가지게했고, 플레이어를 Detect하면 SetTarget으로 플레이어를 Target으로 지정하여 TargetMove 노드를 실행합니다. Target이 없으면, Patrol, Wait 노드를 순차적으로 실행하게됩니다. cpp 프로젝트를 많이 생성해야하는데, Zombie, ZombieAIController, DetectService, PatrolTask, TargetMoveTask를 생성해줍니다. AI를 사용하기 위해, 빌드쪽 모듈에 "AIModule", "GameplayTasks", "NavigationSystem"를 추가해줍니다. AI컨트롤러에 아래와같이 헤더파일도 ..

UE4 게임 개발 EscapeGame - 11 : 좀비 애셋 추가

mixamo.com 에서 무료 에셋 다운로드 할 수 있습니다. 애니메이션을 다운로드할 때, Without Skin을 선택하면 불필요한 중복(머티리얼, 본 등) 다운로드를 막을 수 있습니다. .fbx 파일을 다운로드 받고, 프로젝트에 임포트해서 사용하면 됩니다. 저는 Idle, Patrol, Walk 3가지 애니메이션에 맞는 동작을 찾아서 다운로드했습니다. 플레이어와 마찬가지로, 생성자에서 ConstructorHelpers 함수를 활용해서 애셋 지정해서 사용하면됩니다. // Zombie.cpp #include "Zombie.h" AZombie::AZombie() { // Set this character to call Tick() every frame. You can turn this off to impr..

UE4 게임 개발 EscapeGame - 10 : 카메라 페이드

카메라 페이드라는 기능을 사용해봤습니다. 이런 사소한 부분들이 게임다워지는데 도움을 많이 주는것같습니다. // PlayerCameraManager.cpp void APlayerCameraManager::StartCameraFade(float FromAlpha, float ToAlpha, float InFadeTime, FLinearColor InFadeColor, bool bInFadeAudio, bool bInHoldWhenFinished) { bEnableFading = true; FadeColor = InFadeColor; FadeAlpha = FVector2D(FromAlpha, ToAlpha); FadeTime = InFadeTime; FadeTimeRemaining = InFadeTime; b..

UE4 게임 개발 EscapeGame - 9 : UI(User Interface)

UI는 총 크게 2가지로 구성하였습니다. 추후에 필요에 따라 더 제작할수도 있습니다. 1. 시작 화면 테스트용 배경 사진이며, 맵이 완성되면 맵을 캡쳐해서 시작 화면에 활용할 계획입니다. Play와 Exit 두가지 버튼으로 간단하게 제작하였습니다. // WidgetStartLevel.cpp #include "WidgetStartLevel.h" #include "Components/Button.h" #include "EscapeGameInstance.h" void UWidgetStartLevel::NativeConstruct() { Super::NativeConstruct(); ButtonPlay = Cast(GetWidgetFromName(TEXT("ButtonPlay"))); ButtonExit = C..

UE4 게임 개발 EscapeGame - 8 : 애니메이션 블루프린트와 재질기반사운드

1. 애니메이션 블루프린트 크게 Idle, Run, Jump 세가지로 애니메이션을 구성하였습니다. 상황에 따라 Jump는 필요가 없으므로 제거할수도 있습니다. 애니메이션 노티파이를 설정해준 모습입니다. 원하는 애니메이션 순간에 노티파이 이벤트를 발생시켜서, 여러가지 일을 할 수 있게하는 기능입니다. 앞에서 작업했던 카메라쉐이크, 그리고 지금 작업한 재질 기반 사운드가 그 예 입니다. 2. 재질 기반 사운드 FootStep 노티파이 이벤트가 발생했을 때, 플레이어의 위치와 플레이어로부터 Z좌표가 -150인 지점을 LineTrace 하여 HitResult를 검사합니다. 이 함수가 true이면 해당 Surface Type을 받아서 재질이 무엇인지 구분합니다. 그러고 나서, 해당 재질에 맞는 사운드를 재생시켜줍..

UE4 게임 개발 EscapeGame - 7 : 카메라쉐이크(CameraShake)

카메라쉐이크는 게임에 극적인 요소를 주기 좋은 장치입니다. 간단하게 구현 가능합니다. 코드를 보면, // CameraShakeObstacle.h #pragma once #include "GameInfo.h" #include "Camera/CameraShake.h" #include "CameraShakeObstacle.generated.h" /** * */ UCLASS() class ESCAPEGAME_API UCameraShakeObstacle : public UCameraShake { GENERATED_BODY() public: UCameraShakeObstacle(); }; // CameraShakeObstacle.cpp #include "CameraShakeObstacle.h" UCameraShak..

UE4 게임 개발 EscapeGame - 6 : 디스트럭터블 메시(Destructible Mesh)

바닥에 빠지는 함정을 만들기 위해 디스트럭터블 메시를 이용해봤습니다. 원하는 스태틱 메시를 우클릭하여 디스트럭터블 메시 생성을 합니다. 프랙처 세팅에 Cell Site Count와 Random Seed값을 조절하여 원하는 디스트럭터블 메시를 만들고, 꼭 디스트럭터블 세팅 탭의 Damage에 Enable Impact Damage를 true로 체크해줍니다. 프랙처 메시를 누르고, 폭발량을 조절해서 확인해보고 저장해줍니다. 월드에 배치하고 잘 동작하는지 확인해봅니다. 벽이나 일반 액터의 경우 플레이어가 닿았을 때, 제대로 적용되는걸 볼 수 있었습니다. 하지만 저는 바닥이 부숴져야하는데 바닥은 적용되지않았습니다. 이유를 생각해보니 힘의 방향때문인듯하여, TakeDamage 함수를 이용하기로 했습니다. 1. Ta..

UE4 게임 개발 EscapeGame - 5 : 트리거 클래스 구성

트리거 클래스를 두가지로 구성하면 훨씬 다양한 기능을 연출할 수 있습니다. 1. 트리거 클래스 // TriggerBoxRock.h #pragma once #include "GameInfo.h" #include "GameFramework/Actor.h" #include "ObstacleRock.h" #include "TriggerBoxRock.generated.h" UCLASS() class ESCAPEGAME_API ATriggerBoxRock : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ATriggerBoxRock(); protected: UPROPERTY(VisibleAnywhe..

UE4 게임 개발 EscapeGame - 4 : 트리거 활용

트리거를 활용해서 여러가지 장애물들을 만들어봤습니다. 의외로 만드는 방법은 간단합니다. 액터에 박스컴포넌트를 입혀서 플레이어와 오버랩(겹침) 됐을 경우 함수를 호출하고, 그 함수에 소스코드를 작성하면 됩니다. 1. 문 문의 경우, 해당 액터의 Z축을 회전시켰습니다. 2. 돌 굴러오기 굴러오는 돌의 경우, 해당 액터의 Y축을 회전시키면서, 위치를 조정해서 굴러오는 느낌을 표현했습니다. 3. 낙석 떨어지는 돌의 경우, 돌을 스폰하는 액터를 공중에 두고, 물리를 적용시켜서 떨어지게했습니다. 다음에는 또 다른 트리거 활용과, 디스트럭터블 메시를 이용해서 바닥에 빠지는 함정을 만들어보겠습니다.

UE4 게임 개발 EscapeGame - 3 : TriggerBox와 BeginOverlap/EndOverlap

1. 콜리전 세팅 Object Channels에 Player와 Obstacle(장애물) 채널을 기본 블록으로 세팅하고, Preset에 Player와 Obstacle 서로 겹침 설정하였습니다. 장애물과 겹침처리하고 BeginOverlap 함수를 이용해 플레이어와 닿으면 게임오버 시킬 계획입니다. 2. 트리거박스 제작 게임에 핵심이 되는 코딩입니다. 장애물 이동, 문 열기, 다음 레벨로 이동 등 전부 트리거박스로 구현해야합니다. 액터를 상속받아서 클래스를 생성하고, 그 클래스를 상속받아서 블루프린트 클래스를 생성합니다. 멤버로 박스 컴포넌트를 선언하고, 비긴오버랩과 엔드오버랩 함수를 선언합니다. protected: UPROPERTY(Category = TriggerBox, VisibleAnywhere, Bl..