C++ 93

UE4 생존게임 제작 - 13 (아이템 제작창 제작)

1. 아이템 제작창 UMG 생성 아이템 제작창 또한 인벤토리처럼 List View를 이용하여 제작하였습니다. 그래서 UMG를 제작하는 과정은 생략하도록 하겠습니다. 2. 아이템 제작창 키 입력 추가 프로젝트 세팅에서 아이템 제작창을 열기 위한 키 입력을 추가하였습니다. PlayerInputComponent->BindAction(TEXT("OpenRecipe"), EInputEvent::IE_Pressed, this, &APlayerSurvivor::OpenRecipe); 그 다음 플레이어의 입력을 감지하는 SetupPlayerInputComponent 함수에서 액션 매핑을 통해 실행될 함수를 등록해주었습니다. // 제작창을 여는 함수 void APlayerSurvivor::OpenRecipe() { if..

UE4 생존게임 제작 - 12 (인벤토리 UI, 아이템 및 아이템 사용 효과 제작)

1. 인벤토리 UMG 생성 List View를 이용하여 인벤토리를 제작해볼 것입니다. List View의 UI를 만들때에는 두개의 UMG가 필요한데, 목록을 가지고 있을 List View UMG와 목록 안에 항목들을 표현할 UMG가 필요합니다. 그리고 인벤토리에 들어갈 항목들의 데이터를 가지고 있을 UObject 타입의 클래스 또한 필요합니다. 일단 두개의 UMG와 데이터를 담고 있을 클래스를 만들어주었습니다. InventoryItem 위젯 블루프린트의 클래스 세팅에서 구현된 인터페이스에 User Object List Entry라는 것을 추가해줘야 합니다. 이걸 추가해줘야 Inventory 위젯 블루프린트에서 InventoryItem 위젯 블루프린트를 인식하고 불러올 수 있습니다. 2. Inventory..

UE4 생존게임 제작 - 11 (몬스터 공격 충돌 시스템 수정 및 Camera Shake 제작)

1. 몬스터 공격 충돌 시스템 수정 이유 기존의 몬스터 공격 충돌 시스템은 몬스터가 박스 컴포넌트를 가지고 있게하여 몬스터가 공격을 시작할 때, 해당 박스 컴포넌트와 플레이어가 Overlap이 되는지 감지한 후 데미지를 주었습니다. 그런데 이렇게 하면 모든 몬스터들이 Overlap을 감지해야 해서 많은 비용이 들어가게 됩니다. 또한, 몬스터가 공격을 할 때 멈추게 되는데, 그때 플레이어가 뒤로 이동하면 몬스터의 박스 컴포넌트와 플레이어가 Overlap이 되지 않아서 몬스터는 공격 모션을 취하지만 플레이어는 데미지를 받지 않게 됩니다. 이러한 이유 때문에 플레이어와의 Overlap을 감지하는 박스 컴포넌트들을 전부 제거하고 몬스터의 애니메이션에 노티파이를 만들어 주어서 몬스터가 공격 모션을 취하면 무조건 ..

UE4 생존게임 제작 - 10 (보스 몬스터 제작)

1. 보스 몬스터 메시 선정 및 제작 보스 몬스터는 게임의 배경이 아프리카인 점을 고려하여 코끼리로 하였습니다. AElephant::AElephant() { PrimaryActorTick.bCanEverTick = true; // 스켈레탈 메시를 얻어온다 static ConstructorHelpers::FObjectFinder MeshAsset(TEXT("SkeletalMesh'/Game/AfricanAnimalsPack/Elephant/Meshes/SK_Elephant.SK_Elephant'")); // 스켈레탈 메시가 유효할 경우 메시 적용 if (MeshAsset.Succeeded()) GetMesh()->SetSkeletalMesh(MeshAsset.Object); // 애니메이션 블루프린트 클래..

UE4 생존게임 제작 - 9 (플레이어 원거리 공격 및 공격 모션 상하체 블렌딩 제작)

1. 발사체 액터 제작 먼저 발사체의 액터로 지정할 클래스를 만들었습니다. protected: // 스태틱 메시 UPROPERTY(Category = Mesh, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UStaticMeshComponent* Mesh; // 충돌을 감지할 박스 컴포넌트 UPROPERTY(Category = Collision, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UBoxComponent* ArrowBox; // 파티클 UPROPERTY(Category = Particle, VisibleAnywhere, B..

UE4 생존게임 제작 - 8 (시작 화면 UI 제작)

1. Start 레벨 생성 Start 레벨을 생성해주고 프로젝트 세팅의 맵&모드에서 에디터 시작 맵과 게임 기본 맵을 Start 레벨로 설정하였습니다. 2. 위젯 블루프린트 제작 위젯 블루프린트를 만들고 캔버스 패널 안에 이미지와 버튼 2개를 넣었습니다. 그리고 이미지를 캔버스 패널 크기로 설정하여 전체 화면에 꽉 차도록 만들었습니다. 버튼은 Style 카테고리를 통해 버튼에 이미지를 입히고 사운드를 적용할 수 있습니다. 전체 캔버스 패널의 모습입니다. 3. C++ 위젯 클래스 제작 위젯 블루프린트의 부모 클래스로 줄 C++ 위젯 클래스를 생성하였습니다. C++ 위젯 클래스를 만드는 이유는 버튼을 눌렀을 때의 동작을 코드로 지정해주기 위함입니다. protected: UPROPERTY(VisibleAnyw..

UE4 생존게임 제작 - 7 (몬스터 공격 충돌 시스템 및 플레이어 상태 UI 제작)

1. 몬스터 공격 충돌 시스템 제작 UI를 제작하기 전에 플레이어의 피가 감소하는 모습을 보기 위해서 몬스터 공격 충돌 시스템을 먼저 제작하도록 하겠습니다. 몬스터 공격 충돌 시스템은 플레이어 충돌 시스템과 거의 유사합니다. protected: UPROPERTY(Category = Collision, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UBoxComponent* AttackBox; 먼저 콜리전 세팅에서 AnimalAttack 채널과 프로파일을 만들었습니다. 그리고 나서 해당 프로파일을 적용할 박스 컴포넌트를 생성하였습니다. AttackBox->SetupAttachment(GetMesh(), TEXT("LION..

UE4 생존게임 제작 - 6 (PreyAnimal AI Controller 및 Data Table 제작)

1. 블랙보드와 비헤이비어 트리 생성 PredatorAnimal AI Controller를 제작할 때와 마찬가지로 블랙보드와 비헤이비어 트리를 생성하였습니다. 먼저 블랙보드를 생성하여 타겟을 찾을 수 있도록 오브젝트 타입으로 타겟 변수를 생성하였고 비헤이비어 트리에 생성한 블랙보드를 적용하였습니다. APreyAIController::APreyAIController() { static ConstructorHelpers::FObjectFinder BTAsset(TEXT("BehaviorTree'/Game/Animal/BTPrey.BTPrey'")); if (BTAsset.Succeeded()) m_pBTAsset = BTAsset.Object; static ConstructorHelpers::FObjectF..

UE4 생존게임 제작 - 5 (PredatorAnimal AI Controller 제작)

1. 블랙보드와 비헤이비어 트리 생성 먼저 블랙보드를 생성하여 타겟을 찾을 수 있도록 오브젝트 타입으로 타겟 변수를 생성하였습니다. 그리고 비헤이비어 트리에 블랙보드 에셋에 생성한 블랙보드를 적용하였습니다. APredatorAIController::APredatorAIController() { static ConstructorHelpers::FObjectFinder BTAsset(TEXT("BehaviorTree'/Game/Animal/BTPredator.BTPredator'")); if (BTAsset.Succeeded()) m_pBTAsset = BTAsset.Object; static ConstructorHelpers::FObjectFinder BBAsset(TEXT("BlackboardData'/..

UE4 생존게임 제작 - 4 (랜드스케이프 제작)

1. 매터리얼 제작 랜드스케이프에서 사용할 매터리얼을 생성합니다. Layer Blend를 이용해 다양한 매터리얼을 묶어서 사용할 수 있도록 하였습니다. 그리고 나서 해당 Layer Blend를 랜드스케이프 매터리얼의 베이스 컬러로 주었습니다. 같은 방식으로 Normal 정보도 Layer Blend로 묶어서 랜드스케이프 매터리얼의 Normal에 넣어주었습니다. Layer Blend로 엮은 매터리얼들과 Normal에 LandscapeCoords를 사용해서 좌표를 넣어주었습니다. 제작한 매터리얼의 전체 형태입니다. 중간에 이 부분은 메탈, 스페큘러, 러프니스에 대한 값들을 넣어준 것입니다. 메탈은 디폴트 값으로 0을, 스페큘러 또한 0을 주었고 러프니스 값만 1을 주었습니다. 좀 더 표면이 거칠거칠하게 보이게..