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๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ํŒจํ‚ค์ง•์„ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋˜ ์ ์ž…๋‹ˆ๋‹ค. ์ด ์  ๋•Œ๋ฌธ์— ๋” ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž˜ ๋ชจ๋ฅด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ผญ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค๋Š” ๊ตํ›ˆ์„ ์–ป๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.


Back to Planning & Implementation