Tutorial - B477042/GraduationProject GitHub Wiki
About Tutorial
ํํ ๋ฆฌ์ผ์ ๋ง๋๋ ์์ ์ด ์๋นํ ์ด๋ ต๊ฒ ๋๊ปด์ก์ต๋๋ค. ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ์ด๋ ค์ด ๊ฒ ๋ณด๋ค ์ด๋ป๊ฒ ํํํ๋๊ฒ ์ข์ ๋ฐฉ๋ฒ์ผ์ง ์ ํ๋๊ฒ ๋ฌธ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ํ๋ฉด ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ์ ์ ๋ฌํ ์ ์์์ง ์๊ฐ์ ๋ง์ด ํ์ต๋๋ค.
ํํ ๋ฆฌ์ผ์ ์งํ ๋ฐฉํฅ์ฑ
์ ๋ ํ๋ ์ด ์ค ๋ฉ์ถ๋ ํํ ๋ฆฌ์ผ ๋ณด๋ค ์ค์๊ฐ์ผ๋ก ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ ํํ ๋ฆฌ์ผ ์ชฝ์ด ๋ ์ข์ ํํ ๋ฆฌ์ผ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ฃผ์ด์ง ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ค์๊ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ฐ๋ผํด๋ณผ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ์ ๊ฐ ์๊ฐํ ๋ฐฉ์๋ค์ ๋ชจ๋ ๊ฒ์์ ์งํ ์ํ์ผ ๊ฒ์ ์ ์ ๋ก ํ์ต๋๋ค.
1์ - ๊ธ์ ๋์ฐ๊ธฐ
2์ - GIF๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
UE4์ ์ธ๋ถ ํ๋ฌ๊ทธ์ธ์ผ๋ก Gif๋ฅผ ์ฌ์ํ ์ ์๊ฒ ํด์ฃผ๋ ํด์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด ํด์ ์ด์ฉํ์ฌ Gif๋ก ์์๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด ์ฌ์ฉ์์๊ฒ ๋ ์ข๊ฒ ๋ณด์ฌ์ง ๊ฒ์ผ๋ก ์๊ฐํ๊ณ CSV ํ์ผ์ ์์ ์ ์ฃผ์๋ฅผ ๋ฃ๊ณ ๋น๋๊ธฐ ๋ก๋๋ฅผ ํ๋ ์๋๋ฅผ ํ์ต๋๋ค. ํ์ง๋ง ์ ๊ฐ Gif์ ๋ํด ์๊ณ ์๋ ์ฌ์ค์ด ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Gif๋ ์ฉ๋์ด ํฝ๋๋ค. ์ด ํฐ ์์ ์ ๋น๋๊ธฐ ๋ก๋ํ ๊ฒฝ์ฐ, ํํ ๋ฆฌ์ผ UI๋ ์ถ๋ ฅ๋์ง๋ง Gif๋ ํ๋ฉด์ ํ์๋์ง ์๋ ๊ฒฝ์ฐ๋ ์๊ธธ ์ ์์ต๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก ์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ธํ ์ค๋ฅ๊ฐ ์ฌ๊ฐ ํ์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ๊ณต๋ถํ์ง ์๊ณ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ผ์ด๋ ์ผ์ ๋๋ค. VS ๋๋ฒ๊ฑฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ ํ ์ ์์ง๋ง Nullptr์ ์ ๊ทผํด์ Crash๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด ๋จ์ ๋ค๋ก ์ธํด ์ด ๋ฐฉ๋ฒ๋ ํฌ๊ธฐ ํ์ต๋๋ค.
3์ - ๊ฐ๋จํ ํ ์คํธ ๋ฉ์์ง๋ฅผ ๋ง๋ค๊ธฐ
์๋ ์๋ฆฌ
3๋ฒ์ ๋ฐ๊ฟจ์ง๋ง ์๋๋๋ ์๋ฆฌ๋ ๋ณํ์ง ์์์ต๋๋ค.
- ํํ ๋ฆฌ์ผ ๋ฉ์์ง๋ค์ ๋ชจ๋ CSVํ์ผ๋ก ์ ์ฅ์ ํ์ต๋๋ค.
TutorialNotify.h
UENUM(BlueprintType)
enum class ENotifyType :uint8
{
E_None=0 UMETA(DisplayName = "None"),
E_AttackInput UMETA(DisplayName = "AttackInput"),
E_ChargeAttack UMETA(DisplayName = "ChargeAttack"),
E_Claymore UMETA(DisplayName = "Claymore"),
E_FireBallTrap UMETA(DisplayName = "FireBallTrap")
//์๋ต
}
UCLASS()
class ESCAPEGAME_API ATutorialNotify : public AActor
{
protected:
UPROPERTY(BlueprintReadOnly, Category = "Data", meta = (AllowPrivateAccess = true))
TMap<ENotifyType, FName> SetOfTypesOfNotifications;
UPROPERTY(BlueprintReadWrite, EditInstanceOnly, Category = "Data", meta = (AllowPrivateAccess = true))
ENotifyType NotifyType;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "DataTable", meta = (AllowPrivateAccess = true))
class UDataTable* DT_Tutorial;
};
๋ฉ์์ง์ ์ข ๋ฅ๋ฅผ enum์ผ๋ก ์ ์ํ ํ Editor์์ ์ด๋ค ๊ฒ์ ์๋ ค์ค์ง ์ ํ ์ ์๊ฒ ํ์ต๋๋ค.
Tutorialnotify.cpp
void ATutorialNotify::OnOverlapBegin(AActor * OvelappedActor, AActor * OtherActor)
{
auto Player = Cast<AEGPlayerCharacter>(OtherActor);
if (!Player)return;
auto Controller = Cast<AEGPlayerController>(Player->GetController());
if (!Controller)return;
Controller->ShowTutorialMessage((uint8)NotifyType);
}
Player์ ์ปจํธ๋กค๋ฌ์ ์๋ Widget์๊ฒ ์ด๋ค ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋์ง ์๋ ค์ค๋๋ค.
EGPlayerController.cpp
void AEGPlayerController::ShowTutorialMessage(uint8 TutorialMessage)
{
auto tempData = DT_Tutorial->FindRow<FTutorialDataTable>(FName(*FString::FormatAsNumber(TutorialMessage)), FString(""));
if (!tempData)
{
EGLOG(Error, TEXT(" Data Load FAiled"));
return;
}
}
CSV์์ ํด๋น๋๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์์ Widget์ TEXT๋ฅผ ์์ ํฉ๋๋ค.
์ด๋ ค์ ๋ ์
2์์ Gif๋ฅผ ์ด์ฉํ ๋ฐฉ์ ๋๋ฌธ์ ์ผ์ด๋ ๋ฒ๊ทธ๋ฅผ ์ก์๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ด๋ ค์ ์ต๋๋ค. VS๋๋ฒ๊ฑฐ๋ก ๋๋ฒ๊น ์ ํ ๋, ์ค๋จ์ ์ด ์๋๋ผ๋ nullptr์ ์ ๊ทผํ ๊ฒฝ์ฐ ์ค๋จ๋๋ ์ง์ ๊ณผ Callstack์ ํตํด ์ถ์ ํ ์ ์์์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ๋ ๊ทธ ๋ฐฉ๋ฒ์ด ์ ํตํ์ต๋๋ค. ๊ทธ๋์ ๋ฌธ์ ๊ฐ ๋ ๋งํ ์ ์ ์ฐพ๊ธฐ ์ํด ์๊ฑฐ๋ฒ์ผ๋ก ์ ๊ฑฐํ๋ฉด์ ์ด ๋ฒ๊ทธ๋ฅผ ์ฐพ์๋ด์ผ ํ์ต๋๋ค. ์ด์ํ ์ ์ PIE๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ํจํค์ง์ ํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒผ๋ ์ ์ ๋๋ค. ์ด ์ ๋๋ฌธ์ ๋ ํผ๋์ค๋ฌ์์ ์ฐพ์๋ด๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ์ด ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ ๋ชจ๋ฅด๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ผญ ๋ด๋ถ ์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ๋ค๋ ๊ตํ์ ์ป๊ฒ ๋์ต๋๋ค.