NPC는 던전 내에 일정 확률로 등장하게 되는데가까이 다가가면 말을 걸 수 있게 T 표시가 나오며T를 누를 경우 다이얼로그에 대화창이 나오면서 예 아니오를 눌러 선택할 수 있게 해보자.NPC 블루 프린트NPC는 CharacterBase를 상속 받는다.물론 지금은 움직일 수 없는 오브젝트로 만들 계획이기 때문에 필요 없을 수 있지만나중에 움직일 수 있는 NPC를 제작할 수 도 있기에 그렇게 설계 했다.NPC랑 대화할 때 카메라 줌인을 위해 NPC에게 전용 카메라를 두었다.// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Character..
이번 작업은 상당히 까다로운 작업이 많았다.일단 UI 작업과 월드맵을 만드는 과정이 복잡하고 힘들었다.(안해봐서 그런걸지도...)미니맵 만들기미니맵은 현재 내가 어느 위치에 있는지 표기해야 했다. 이는 항상 표시되어야 했으며 전투중에는 가려져야 했다. 미니맵을 만드는 것은 어렵지 않았다. 플레이어의 항공뷰 카메라를 만들고 그것을 UI 머티리얼로 뿌린다음 그걸 UI에 이미지에 적용하는 방식이다.// - MiniMapCamera: 미니맵 카메라UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Camera, Meta = (AllowPrivateAccess = "true"))TObjectPtr MiniMapCamera;// - MiniMapCameraBoom: 미..
이번에는 게임에서 가장 첫번째로 마주하게 될 Title UI와 볼륨과 게임을 종료할 수 있는 메뉴 UI를 만들어 보도록 하자. Title UI타이틀 UI 같은 경우 최대한 심플하게 만들자는 것이 목표였다.로고와 화면을 터치 시 게임에 접속하게 하는 버튼, 메뉴를 틀 수 있는 버튼만 넣자라는 생각이었다. 그리고 이러한 단조로운 구성을 애니메이션으로 넘어가자 라고 생각했다.따라서 다음과 같은 구조를 형성했다. 게임의 로고 이미지 같은 경우는 ChatGPT에게 부탁해 제작했다.이러한 로고가 2초 정도 페이드 인 아웃이 된 다음. 다음과 같은 화면이 6초에 걸쳐 페이드 인 된다.애니메이션은 이렇게 구성하면 된다. 타이틀 화면이 심심하지 않게 타이틀 레벨을 만들고 이 레벨에서 시네마틱을 재생해 화면을 채워보겠다...
이번에는 몬스터를 스폰해보자.몬스터를 스폰하는 건 어렵지 않다. 몬스터 스폰하기먼저 몬스터의 스폰을 관리하는 액터를 만들고 이 액터를 필요한 Room에서 가지고 있도록 해보자.Spawner의 역할인 것이다.// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "GameFramework/Actor.h"#include "RASMonsterSpawner.generated.h"UCLASS()class PROJECTRAS_API ARASMonsterSpawner : public AActor{ GENERATED_BODY() public: ARASMo..
이번 포스팅은 UI에 스킬의 쿨타임을 표기해보고 포션을 마셔 피를 회복해보자.UI 스킬 쿨타임 표기하기스킬을 쿨타임은 이미 타이머 시스템을 이용해 관리중이었다.해당 스킬에 맞는 타이머를 빈 함수로 설정해두고 그 타이머가 현재 존재 한다면 쿨타임이라고 판단하고 스킬을 무시하도록 설계되었다. 이에 맞추어 스킬을 사용함과 동시에 UI를 업데이트 해보자.Image Mask 효과 내기UI의 아이템과 스킬 칸은 이런식으로 되어있다.Retainer Box를 통해 유니티의 Image Mask 효과를 냈다.내가 가지고 있는 UI의 포션과 스킬 아이콘은 정사각형이지만, 지금 적용해야 될 이미지는 Hex 모양이기 때문에 이미지 마스크가 필요했다. 언리얼에서 이미지를 마스크 하는 방법은 나름 간단했다. Retainer Box..
보스 패턴을 제작함에 있어 많은 고민과 시행착오가 있었다.원래는 보스의 패턴을 플레이어와의 거리 및 현재 남은 체력을 고려해 행동트리를 제작하려고 했다. 다만 이렇게 하자니 플레이 하는 입장에서 어떤 패턴을 쓸지 예측이 가능해진다는 점이플레이 하는 입장에서 단조롭게 느껴질 수 있다고 판단했다. 그래서 Utility System AI를 이용하기로 결정했다. 거창하지만 단순하게 얘기하자면 현재 모든 상황을 고려했을 때 가장 좋은 행동을 하자! 가 아이디어의 주제이다. 가중치 Utility System을 이용하기 위해선 정해진 가중치가 존재해야한다.가령 체력이 낮을땐 어떤 기술의 가중치가 높고, 거리가 멀거나 가까울 땐 특정 스킬의 가중치가 높아 그 기술을 선택하게끔 하는 것이다. 그렇다면 고려해야될 가중치를..
이전 포스팅에서 만들어둔 맵들을 이용해서 Map을 랜덤하게 생성하게 해보자.아이디어 구상절차적 맵 생성에 대해 검색하면 여러 알고리즘이 나오지만 막상 적용하기 어렵거나 큰 틀만 작성되어있어 내용이 부실한 경우가 많았다. (한국어로만 검색하면 그러하다)BSP 알고리즘검색해봤을 때 가장 많이 나오는 알고리즘은 BSP 알고리즘 이다.이는 재귀적으로 특정한 크기의 공간을 계속 나누고 나누어 일정 크기가 되었을 때, 방을 생성시킨 후, 차례대로 돌아가면서 길을 잇는 방식으로 주로 구현된다.구현 자체는 생각보다 어렵지 않았다. 특정한 공간 벡터의 비율을 정한 뒤 그 공간의 가로 길이와 세로 길이를 비교하며 수평과 수직으로 나누는 작업을 반복하면 된다.하지만, 이번 프로젝트에 적용하기엔 무리가 있었다. 이미 정해준 ..
지금 계획중인 게임 플레이 방법은접속시 맵이 절차적으로 랜덤하게 생성되고 그 맵들 중 보스 방을 찾아 보스를 처치하면 클리어하게 만들 것이다. 맵을 절차적으로 생성하기 이전에 맵들을 디자인 하고 블루프린트로 만들어 프리셋 해보자. 맵은 총 6개로 구성할 것이다.1. 메인 룸 : 플레이어가 처음 스폰되는 장소이다.2. 일자형 복도 : 룸과 룸을 잇는 일자형 복도이다.3. 기역자형 복도 : 룸과 룸을 잇는 기역자형 복도이다.4. 몬스터 룸 : 몬스터들이 스폰되는 장소이다.5. NPC 룸 : 상점으로 사용될 장소이다.6. 보스 룸 : 최종 보스가 스폰되는 장소이다. 맵은 Fab에 있는 무료 에셋인 MedievalDungeon을 재구성하여 제작했다.맵들은 빛을 차단하기 위해 검은색 플레인으로 둘러 쌓인다.메인..
스테미나 시스템HP와 동일하게 델리게이트로 UI와 연동하고 스테미나가 0이 되면 추후 처리를 위해 제작해보자.스테미나가 0이되면 즉사할 수 있게끔 해보자. 스텟 컴포넌트에 추가해준다.float URASStatComponent::ApplyStaminaDamage(float InStaminaDamageAmount){ const float PrevStamina = GetStamina(); const float ActualStaminaDamage = FMath::Clamp(InStaminaDamageAmount, 0, InStaminaDamageAmount); if (ActualStaminaDamage > 0) RecoveryDelayRemaining = RecoveryDelayDuration; SetStam..
정확한 타이밍에 패링하기다크 소울류 게임을 보면 패링을 정확한 타이밍에 하면적의 스테미나를 한번에 많이 감소시킨다던지 등 다양한 효과가 존재한다. 그래서 이번에는 정확한 타이밍에 적의 공격을 막아내면 주변 적들을 넉백 시켜보도록 하겠다.정확한 타이밍 체크하기패링을 하는건 우클릭으로 할 수 있다.그랬을 때, 패링한 시간을 정확히 기억한다.그리고 적의 공격을 받았고 내가 패링중이라면, 공격받은 타이밍과 기억해둔 시간과의 차이가 0.1초 일 경우에정확한 타이밍이라고 인식하도록 한다.void ARASPlayer::PressRightClick(){ if (CombatState == EPlayerCombatState::Breaking || CombatState == EPlayerCombatState::Armorin..