์์ (Shop) ์์คํ ์ ๋ค๋ฌ์ผ๋ฉฐ ์ธ ๊ฐ์ง ์ฃผ์ ๋ฅผ ๋ค๋ค๋ค.
๊ฒ๋ณด๊ธฐ์ "์ฐฝ ์์น๋ง ์ก์ผ๋ฉด ๋๋" UI ์์ ๊ฐ์ง๋ง, ์นด๋ฉ๋ผ ๋ทฐํ๊น ๋ธ๋ ๋ โ ํจ๋ ์ ๋ ฅ๋ชจ๋/๋ซ๊ธฐ ๊ฒฝ๋ก โ ์์ ฏ์ด ๋ฐํ์์ ์กฐ๋ฆฝ๋๋์ง ์ฌ๋ถ โ BindWidget ๋ฐ์ธ๋ฉ โ CanvasPanel์ ํฌ๊ธฐ ๊ณ์ฐ ๋ฐฉ์๊น์ง ์ฌ๋ฌ ์์คํ ์ด ๋ง๋ฌผ๋ ค ์์๋ค.
์์ ์ ์ด๋ฉด ์นด๋ฉ๋ผ๊ฐ NPC ์ ๋ฉด์ผ๋ก ๋ถ๋๋ฝ๊ฒ ์ ํ๋๊ณ , ํ๋ ์ด์ด ์บ๋ฆญํฐ๋ ์จ๊ฒจ์ ธ NPC๋ง ๋ณด์ธ๋ค. ๋ซ์ผ๋ฉด ์๋ ์์ ์ผ๋ก ๋ณต๊ท.
ARetrievePlayerController)์์ ์ด๋ฆฐ๋ค. ์ด ์์ ์ ์์ NPC ์กํฐ๋ฅผ ์ ์ ์๋ค.Source/Retrieve/Player/RetrievePlayerController.cpp์ ํฌ์ปค์ค/๋ณต๊ท ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
void ARetrievePlayerController::FocusCameraOnActor(AActor* TargetActor)
{
const FVector NpcLoc = TargetActor->GetActorLocation();
const FVector Forward = TargetActor->GetActorForwardVector();
const FVector Dir = Forward.RotateAngleAxis(ShopCameraOrbitYaw, FVector::UpVector);
const FVector CamLoc = NpcLoc + Dir * ShopCameraDistance + FVector(0,0,ShopCameraHeight);
const FVector LookAt = NpcLoc + FVector(0,0,ShopCameraLookAtHeight);
ShopFocusCameraActor->SetActorLocationAndRotation(CamLoc, (LookAt - CamLoc).Rotation());
SetViewTargetWithBlend(ShopFocusCameraActor, ShopCameraBlendTime,
EViewTargetBlendFunction::VTBlend_Cubic, 0.f, false);
if (bHidePlayerDuringShopCamera)
if (APawn* P = GetPawn()) P->SetActorHiddenInGame(true);
}
FocusCameraOnActor(์์ NPC), ๋ซํ ์ RestorePlayerCameraView()(ํฐ์ผ๋ก ๋ณต๊ท + ํฐ ๋ค์ ํ์).RemoveActivePanelImmediately)์ ๋ฃ์ด ๋๋ฝ์ ๋ง์๋ค.BeginPlay์์ ๋ฏธ๋ฆฌ ์คํฐํด ์ ํ ์๊ฐ์ ์คํฐ ๋น์ฉ์ ์์ด๋ค.ShopCameraDistance, ShopCameraHeight, ShopCameraLookAtHeight, ShopCameraOrbitYaw, ShopCameraBlendTime, bHidePlayerDuringShopCamera.์นด๋ฉ๋ผ๋ฅผ NPC์ ์ ๋ฉด ๋ฐฉํฅ(GetActorForwardVector)์ ๋๊ณ NPC๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํ๋๋ฐ ๋คํต์๊ฐ ๋ณด์๋ค.
์ด NPC๋ ๋ฉ์ ์ ๋ฉด์ด ์กํฐ์ Forward์ ๋ฐ๋ ๋ฐฉํฅ์ด์๋ค(์บ๋ฆญํฐ ๋ฉ์๊ฐ ์กํฐ forward ๋๋น 180ยฐ ํ์ ๋ ํํ ๊ฒฝ์ฐ). "์"์ด๋ผ๊ณ ๋ ์์น๊ฐ ์ค์ ๋ก๋ ๋ค์๋ค.
์นด๋ฉ๋ผ ๋ฐฐ์น ๋ฐฉํฅ์ ํ์ ์คํ์
(ShopCameraOrbitYaw)์ผ๋ก ์กฐ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ๊ธฐ๋ณธ๊ฐ์ 180ยฐ๋ก ๋๋ค. ๋ฉ์ ๋ฐฉํฅ์ด ๋ค๋ฅธ NPC๊ฐ ์๋ ๊ฐ๋ง ๋ฐ๊ฟ ๋ง์ถ ์ ์๋ค(๋ฆฌ๋น๋ ๋ถํ์).
์์ ์ ์ฌ๋ ์๊ฐ ํ๋ฉด์ด ์ ์ด๊ฐ ๋ฉ์ท๋ค๊ฐ ํ ๋ฒ์ ๋ํ๋ฌ๋ค. ์๋ํฐ(PIE)์์ ์ฒซ ์ง์ ยท์์ ์์๋ง ์ฌํ๊ณ , ๋์งธ๋ถํฐ๋ ๋น ๋ฅด๋ฉฐ, ์ธ๋ฒคํ ๋ฆฌ ๋ฑ ๋ค๋ฅธ ํ๋ฉด์๋ ์์๋ค.
์๋ํฐ ์ ์ฉ ํ์์ด๋ฉฐ ํจํค์ง(์ฟก) ๋น๋์๋ ์๋ค. ๊ธฐ๋ฅ ๋ฒ๊ทธ๋ก ์ค์ธํด ์ฝ๋๋ก ๋ฌด๋ฆฌํ๊ฒ ์ก์ผ๋ ค ํ์ง ๋ง ๊ฒ. (์ ํ ์์ ์ ์นด๋ฉ๋ผ ์กํฐ ์คํฐ ๋น์ฉ๋ง ๋ฏธ๋ฆฌ ์คํฐ์ผ๋ก ์ ๊ฑฐ)
์์ ๋ซ๊ธฐ(โ)๋ฅผ ๋๋ฌ๋ ๋ง์ฐ์ค ์ปค์๊ฐ ๋จ๊ณ ํ๋ ์ด์ด ์กฐ์์ผ๋ก ๋์๊ฐ์ง ์์๋ค(์นด๋ฉ๋ผ/ํ๋ ์ด์ด ํ์๋ ๋ณต๊ท ์ ๋จ).
๋ซ๊ธฐ ํธ๋ค๋ฌ๊ฐ ํจ๋์ RemoveFromParent()๋ก ์ง์ ์ ๊ฑฐํด, ์ปจํธ๋กค๋ฌ๊ฐ ๋ด๋นํ๋ ์ ์ ๋ซ๊ธฐ ๊ฒฝ๋ก๋ฅผ ์ฐํํ๋ค. ๊ทธ ๊ฒฝ๋ก ์์์ ์
๋ ฅ๋ชจ๋ ๋ณต๊ทยท์ปค์ ์จ๊นยท์นด๋ฉ๋ผ ๋ณต๊ทยทํ๋ ์ด์ด ํ์๊ฐ ์ฒ๋ฆฌ๋๋๋ฐ ์ ๋ถ ๊ฑด๋๋ด ๊ฒ.
ํจ๋์ด ์ค์ค๋ก ๋ซ์ง ์๊ณ ๋ซ๊ธฐ ์์ฒญ๋ง ๋ณด๋ด ์ปจํธ๋กค๋ฌ๊ฐ ๋ง๋ฌด๋ฆฌํ๊ฒ ์์ํ๋ค.
void UShopPanelWidget::HandleCloseShopClicked()
{
// ์ปจํธ๋กค๋ฌ์ ์ ์ ๋ซ๊ธฐ ๊ฒฝ๋ก๋ก ์์ โ ์
๋ ฅ๋ชจ๋/์ปค์/์นด๋ฉ๋ผ/ํ๋ ์ด์ดํ์๊ฐ ํ ๊ณณ์์ ๋ณต์๋จ
RequestClose();
}
๊ตํ: ๋ถ์ ํจ๊ณผ(์ ๋ ฅยท์ปค์ยท์นด๋ฉ๋ผ ๋ฑ)๊ฐ ๋ฐ๋ผ๋ถ๋ ๋ซ๊ธฐ๋ ๋จ์ผ ๊ฒฝ๋ก๋ก ๋ชจ์์ผ ํ๋ค. ์์ ฏ์ด ์๊ธฐ๋ฅผ ์ง์ ์ ๊ฑฐํ๋ฉด ๊ทธ ๋ถ์ ํจ๊ณผ๊ฐ ํต์งธ๋ก ๋๋ฝ๋๋ค.
์ํ๋ ์นด๋ ๋ ์ด์์์ WBP(WBP_ShopPanel)์์ ๋ง๋ค์๋๋ฐ ํ๋ฉด์ ์ ํ ๋ฐ์๋์ง ์์๋ค.
์์ ์์ ฏ์ C++ NativeConstruct๊ฐ ๋งค๋ฒ ๋ฐํ์์ ๋ ์ด์์์ ๋ค์ ์กฐ๋ฆฝํ๊ณ ์์๋ค. ๋์์ธ ํ์์ ๋ฐฐ์นํ ๋ฐ์ด๋ ์์ ฏ๋ค(๋ชฉ๋ก/์์ธ/์ธ๋ฒคํ ๋ฆฌ/๋์ฌ)์ ๋ผ์ด๋ด ์ฝ๋๋ก ๋ง๋ ์นด๋์ ๋ค์ ๋ด๊ณ , ๋ซ๊ธฐ ๋ฒํผยทํตํ ํ
์คํธยทํ์ดํ๋ฐ๊น์ง ์ฝ๋๋ก ์์ฑํ๋ ๊ตฌ์กฐ์๋ค. ๊ทธ๋์ WBP์์ ๋ฌด์์ ๋ฐ๊ฟ๋ ์คํํ๋ฉด ๋ฎ์ด์จ์ก๋ค.
๋ ์ด์์ ์์ ์๋ฅผ WBP๋ก ์ผ์ํํ๊ธฐ๋ก ํ๊ณ , ๊นจ์ง ์์ด ์ฎ๊ธฐ๊ธฐ ์ํด ์ด๋ ๊ฒ ์งํํ๋ค.
Canvas_ShopRoot)๋ฅผ ๊ฐ์ง๋ฉด ์กฐ๋ฆฝ์ ๊ฑด๋๋ฐ๊ฒ ํด, ์ฎ๊ธฐ๋ ๋์ค์๋ ํ๋ฉด์ด ๊นจ์ง์ง ์๊ฒ ํจ.Canvas_ShopRoot(CanvasPanel) ์๋ ์นด๋ 4๊ฐ(Border, ์ํผ์ง ๋ฐฐ๊ฒฝ)๋ฅผ ๋ง๋ค๊ณ ๊ธฐ์กด ๋ฐ์ด๋ ์์ ฏ์ ๊ทธ ์์ผ๋ก ์ฌ๋ฐฐ์น, ๋น์จ ์ต์ปค๋ก ํ๋ฉด์ ๋ฐฐ์น.์ต์ข ๊ตฌ์กฐ(๋ ์ด์์์ WBP, C++์ ๋ฐ์ดํฐ/๋ก์ง๋ง):
WBP_ShopPanel
โ Canvas_ShopRoot (ํ๋ฉด ์ฑ์)
โ ๊ตฌ๋งค ๋ชฉ๋ก ์นด๋ (์ข์ธก, ์คํฌ๋กค)
โ ์์ธ ์ ๋ณด ์นด๋ (์ฐ์ธก ์)
โ ์ธ๋ฒคํ ๋ฆฌ/ํ๋งค ์นด๋(์ฐ์ธก ์๋)
โ NPC ์ด๋ฆยท๋์ฌ ์นด๋(์ข์ธก ์๋)
โ ๋ซ๊ธฐ(โ) ๋ฒํผ (์ฐํ๋จ)
(๊ฐ์ด๋ฐ๋ ๋น์ NPC๊ฐ ๋ณด์ด๊ฒ)
๋ซ๊ธฐ ๋ฒํผยทํตํ ํ
์คํธ๋ฅผ C++ BindWidget ๋ฉค๋ฒ๋ก ์ก์ผ๋ ค ํ๋๋ WBP ์ปดํ์ผ์ด ์คํจํ๋ค.
Tried to create a property Button_Close ... but another object ... already exists there.
WBP์ ๋ณ์ ์์ ฏ๋ช ๊ณผ C++ ํ๋กํผํฐ๋ช ์ด ๊ฐ์๋ฐ ๋ฐ์ธ๋ฉ์ด ์ ์์ ์ผ๋ก ์กํ์ง ์์ผ๋ฉด ์ค๋ณต ์์ฑ ์ถฉ๋์ด ๋๋ค. โ C++ ๋ฉค๋ฒ๋ฅผ ๋์ง ์๊ณ ์ด๋ฆ์ผ๋ก ์์ ฏ์ ์ฐพ์ ์ฐ๋ฉด ์ด ์ถฉ๋์ ํผํ๋ค.
if (UButton* CloseBtn = Cast<UButton>(GetWidgetFromName(TEXT("Button_Close"))))
CloseBtn->OnClicked.AddDynamic(this, &UShopPanelWidget::HandleCloseShopClicked);
Canvas_ShopRoot๊ฐ ์ธ๋ก ๋ฐ์ค ์์ ๋ค์ด ์๋๋ฐ ์ฌ๋กฏ ํฌ๊ธฐ ๊ท์น์ด Auto๋ผ, CanvasPanel์ ์ค์ค๋ก ์ํ๋ ํฌ๊ธฐ๊ฐ 0์ด์ด์ ๋์ด 0์ผ๋ก ์ฐ๋ถ๋จ.์นด๋ ๋ฐฐ๊ฒฝ์ ๋ฐ์ ์ํผ์ง๋ก ๋ฐ๊พธ์ "ํฐ์ ๋ฌปํ / ํฐ ๋ฐ์ค" ๊ณ์ด ๋ฌธ์ ๊ฐ ์ค์ค์ด ๋๋ฌ๋ฌ๋ค.
| ์ฆ์ | ์์ธ | ์์ |
|---|---|---|
| ์นด๋ ํ ์คํธ๊ฐ ํฐ์์ผ๋ก ๋ฌปํ | ๋ฐ์ ์ํผ์ง + ๋ฐ์/ํฐ ํ ์คํธ | ์นด๋ ์ํผ์ง์ ์ด๋์ด ํดํธ(์ด๋์ด ๊ฐ์)๋ฅผ ๋ฃ์ด ๋๋น ํ๋ณด |
| ์์ธ ์นด๋ ์ ์ฒด๊ฐ ํฐ์ | ์์ธ ํจ๋(Border)์ ๊ธฐ๋ณธ ํฐ ๋ธ๋ฌ์๊ฐ ์นด๋ ์ํผ์ง๋ฅผ ๋ฎ์ | ๊ทธ Border ๋ฐฐ๊ฒฝ์ ๊ทธ๋ฆฌ์ง ์๊ฒ(NoDrawType) ์ค์ |
| ์์ธ ๋ด ์์ ํฐ ๋ฐ์ค(์คํฏ ๋น๊ต) | ์คํฏ ๋น๊ต์ฉ Border์ ํฐ ๋ฐฐ๊ฒฝ + ๋น ์์ด์ฝ ์ด๋ฏธ์ง์ ํฐ์ | Border๋ ๊ทธ๋ฆฌ์ง ์๊ฒ, ์์ด์ฝ์ ํฌ๋ช (์ํ 0) |
| ์ํ ๋ชฉ๋ก ์ค๊ฐ ํฐ ๋ธ๋ก | ๋ชฉ๋ก ํญ๋ชฉ์ ์ฝ์ธ ์์ด์ฝ ์ด๋ฏธ์ง์ ํ ์ค์ฒ๊ฐ ์์ด ํฐ์ | ์ฝ์ธ ์์ด์ฝ ํฌ๋ช (์ํ 0) |
ํต์ฌ: ํ ์ค์ฒ๊ฐ ์๋ Image/Border๋ ํฐ์์ผ๋ก ์ฐํ๋ค. ์ ์ฐ๋ฉด ๊ทธ๋ฆฌ์ง ์๊ฒ ํ๊ฑฐ๋ ํฌ๋ช ์ผ๋ก ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฐ๊ฒฝ ๋ฐ๊ธฐ์ ํ ์คํธ ์์ ํญ์ ํจ๊ป ๋ด์ผ ํ๋ค(๋ฐ์ ๋ฐฐ๊ฒฝ์ผ๋ก ๋ฐ๊พธ๋ฉด ๊ธฐ์กด ๋ฐ์ ํ ์คํธ๊ฐ ๋ฌปํ).
| ์ฆ์ | ์์ธ | ์์ |
|---|---|---|
| ์ธ๋ฒคํ ๋ฆฌ ํด๋ฐ ๋ฒํผ์ด ์ ํ ์ ๋ฐ๋ ค ์์ญ ๋ฐ์ผ๋ก | ์ ํ ๊ฐ์ ํ ์คํธ๊ฐ ๊ธธ์ด์ง๋ฉฐ ๊ฐ๋ก ๋ฐ์ค์์ ๋ฒํผ์ ๋ฐ์ด๋ | ๋ฒํผ์ ๋ด์ฉ ํฌ๊ธฐ(Auto), ์ ํ ๊ฐ์ ํ ์คํธ๋ ๋จ๋ ๊ณต๊ฐ ์ฑ์(Fill) ์ผ๋ก ์ญํ ๋ถ๋ฆฌ |
| ํด๋ฐ ๋ผ๋ฒจ์ด ์๋ก ๊ฒน์นจ | ์ข์ ์นด๋ ๋๋น ๊ธ๊ผด์ด ํผ | ํด๋ฐ ๊ธ๊ผด ์ถ์ |
| ์ฐ์ธก ์์ธ/์ธ๋ฒค ๋ด์ฉ ๋์นจ | ์ฐ์ธก ์นด๋๊ฐ ๋๋ฌด ์ข์ | ์ฐ์ธก ์นด๋ ํญ์ ๋ํ |
| ํ๋งค ์ฌ๋กฏ ์๋ ํ ์คํธ๊ฐ ํฌ๊ณ ํ ๋๋ฆฌ์ ๊ฐ๋ฆผ | ์๋ ํ ์คํธ๊ฐ ์ฌ๋กฏ์ ๊ฐ๋ ์ฑ์ฐ๊ณ , ๊ทธ ์์ ํ๋ ์์ด ๋ง๊ทธ๋ ค์ ธ ๊ฐ๋ฆผ | ์๋ ํ ์คํธ๋ฅผ ๋งจ ์ ๋ ์ด์ด๋ก ์ฌ๋ฆฌ๊ณ ๊ธ๊ผด ์ถ์ + ์ฐํ๋จ ์์ ๋ฐฐ์ง๋ก ์ ๋ ฌ |
ํต์ฌ ๋ ๊ฐ์ง:
- ๊ฐ๋ก ๋ฐ์ค์์ ํ ์์๊ฐ ๋ค๋ฅธ ์์๋ฅผ ๋ฐ์ด๋ด๋ฉด, ๋ฐ๋ฆฌ๋ฉด ์ ๋๋ ์ชฝ(๋ฒํผ)์ Auto, ๋์ด๋๋ ๋๋ ์ชฝ(ํ ์คํธ)์ Fill๋ก ๋๋ค.
- ๊ฒน์ณ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋(Overlay)์์ ๋์ค์ ์ถ๊ฐ๋ ๊ฒ์ด ์๋ค. ๋ฌด์ธ๊ฐ๊ฐ ํ ์คํธ๋ฅผ ๋ฎ์ผ๋ฉด ๊ทธ๋ฆฌ๊ธฐ ์์๋ฅผ ์กฐ์ ํ๋ค.
์ฌ๊ตฌ๋งค ๋ชฉ๋ก ํญ๋ชฉ๋ค์ด ์ธ๋ก๋ก ์์ด์ง ์๊ณ ํ๊ณณ์ ๊ฒน์ณ ๋ณด์๋ค(์ด๋ฆยท๊ฐ๊ฒฉ์ด ๋ถ์ด ๊ฐ์ด ์ด์ํ๊ฒ ๋ณด์ด๊ธฐ๋ ํจ).
๋ฆฌ์คํธ ํญ๋ชฉ ์์ ฏ์ ๋ฃจํธ๊ฐ CanvasPanel์ด์๋ค. CanvasPanel์ ์ค์ค๋ก "์ํ๋ ํฌ๊ธฐ(Desired Size)"๊ฐ 0์ด๋ผ, ์คํฌ๋กค ๋ฐ์ค๊ฐ ๊ฐ ํญ๋ชฉ์ ๋์ด๋ฅผ ์ฃผ์ง ๋ชปํด 0px๋ก ๊ฒน์น๋ค. (๊ฒ๋ค๊ฐ ๋ด๋ถ ๋ด์ฉ์ด ๊ณ ์ ๋ ์์ ๋ฐ์ค์ ๊ฐํ ์์ด ๋ ๋ญ์ณค๋ค)
ํญ๋ชฉ ๋ด๋ถ ์ฝํ ์ธ ๋ฅผ ์์ชฝ์ ๊ฐ๋ก๋ก ๋๋ฆฌ๋ ๋์ด๋ฅผ ๊ณ ์ ํด, ํญ๋ชฉ์ด ์ค์ค๋ก ๋์ด๋ฅผ ๋ณด๊ณ ํ๋๋ก ํ๋ค. ๊ทธ ์์์ ๊ธ๊ผด ์ถ์ + ์ด๋ฆ์ ๋จ๋ ๊ณต๊ฐ ์ฑ์, ๊ฐ๊ฒฉยท๋ฒํผ์ ๋ด์ฉ ํฌ๊ธฐ๋ก ์ ๋ ฌ.
๊ตํ: CanvasPanel์ ์์์ผ๋ก๋ถํฐ ํฌ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ด์ง ์๋๋ค. ์คํฌ๋กค/์ธ๋ก ๋ฐ์ค์ ํญ๋ชฉ ๋ฃจํธ๋ก ์ฐ๋ฉด ๋์ด 0์ผ๋ก ๋ฌด๋์ง๋ค. CanvasPanel์ ์ธ ๋ "๋๊ฐ ์ด ํฌ๊ธฐ๋ฅผ ์ ํ๋๊ฐ"๋ฅผ ํญ์ ์์ํ๋ค(๊ณ ์ ๋์ด๋ฅผ ์ฃผ๊ฑฐ๋, ๋ถ๋ชจ ์ฌ๋กฏ์์ Fill๋ก ์ฑ์ฐ๊ฑฐ๋).
์์ ์์ธ๊ฐ ์ด๋ฆ/๊ฐ๊ฒฉ/์งง์ ์ค๋ช /์คํฏ 1๊ฐ๋ง ๋ณด์ฌ ๋น์ฝํ๋ค.
์์ธ ๊ฐฑ์ ๋ก์ง์์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์ฌ๋ฌ ์ค ์ ๋ณด๋ฅผ ๋ง๋ค์ด ์ค๋ช ํ ์คํธ์ ๋ฃ์๋ค(์ค๋ช ํ ์คํธ๋ ์๋ ์ค๋ฐ๊ฟ).
// ๋ฌด๊ธฐ: ๊ณต๊ฒฉ๋ ฅ / ์ข
๋ฅ / ์์ฑ + ์ค๋ช
// ๋ฐฉ์ด๊ตฌ: ๋ฐฉ์ด๋ ฅ / ๋ถ์ + ์ค๋ช
// ์๋ชจํ: ํ๋ณต๋ / ์์ฑ ์ถฉ์ ๋ฒํ + ์ค๋ช
Detail += FString::Printf(TEXT("๊ณต๊ฒฉ๋ ฅ %.0f\n"), W->AttackPower);
if (W->WeaponTypeTag.IsValid()) Detail += FString::Printf(TEXT("์ข
๋ฅ %s\n"), *TagLeaf(W->WeaponTypeTag));
if (W->WeaponAffinityTag.IsValid()) Detail += FString::Printf(TEXT("์์ฑ %s\n"), *TagLeaf(W->WeaponAffinityTag));
์์ ํจ๋์ด ์ด๋ฆฐ ์ํ์์๋ NPC ์์ "Interact" ํ๋กฌํํธ๊ฐ ๋ ์์๋ค.
์ํธ์์ฉ ํ๋กฌํํธ๋ ํ๋ ์ด์ด ์ปจํธ๋กค๋ฌ์ ์ธํฐ๋ํฐ ์ปดํฌ๋ํธ๊ฐ ํ์ํ๋๋ฐ, ํจ๋์ด ์ด๋ ค๋ ๊ณ์ ๋์ํ๋ค.
ํจ๋ ์ด๋ฆผ/๋ซํ ๋จ์ผ ์ง์ ์์ ์ธํฐ๋ํฐ๋ฅผ ๋นํ์ฑ/ํ์ฑํ๋ค.
// ํจ๋ ์ด๋ฆผ
if (UActorComponent* Interactor = GetInteractorComponent()) Interactor->SetActive(false);
// ํจ๋ ๋ซํ
if (UActorComponent* Interactor = GetInteractorComponent()) Interactor->SetActive(true);
์๋ํฐ ์๋ํ ๋๊ตฌ๋ก WBP๋ฅผ ํธ์งํ๋ฉด์ ๋ฐ๋ณต์ ์ผ๋ก ๋ถ๋ชํ ๊ท์น๋ค. (์ด ํ๋ก์ ํธ๋ UMG ํธ์ง์ ์คํฌ๋ฆฝํธ/์๋ํ๋ก๋ ํ๋ค)
| ํญ๋ชฉ | ์ํ |
|---|---|
| NPC ์ ๋ฉด ์นด๋ฉ๋ผ ์ ํ/๋ณต๊ท | โ |
| ์์ ๋ซ๊ธฐ โ ์ปค์/์กฐ์/์นด๋ฉ๋ผ/ํ๋ ์ด์ด ๋ณต๊ท | โ |
| ๋ ์ด์์ WBP๋ก ์ด์ (์นด๋ 4๊ฐ + ๋ซ๊ธฐ/ํตํ) | โ |
| ๋ฐํ์ ์กฐ๋ฆฝ ์ฝ๋ ์ ๊ฑฐ | โ |
| BindWidget ์ด๋ฆ ์ถฉ๋ | โ ํด์(์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ) |
| ํฐ ๋ฐ์ค/์์ด์ฝ | โ ๊ทธ๋ฆฌ์ง ์๊ฒ/ํฌ๋ช |
| ํด๋ฐ/ํ๋งค ์ฌ๋กฏ/์ฌ๊ตฌ๋งค ํญ๋ชฉ ๊นจ์ง | โ |
| ์์ธ ์ ๋ณด ์ฌ๋ฌ ์ค ํ์ | โ |
| ์ํธ์์ฉ ํ๋กฌํํธ ์จ๊น | โ |
| ํ์ผ | ์์ |
|---|---|
Player/RetrievePlayerController.h/.cpp | ํฌ์ปค์ค ์นด๋ฉ๋ผ(์คํฐ/๋ณต๊ท/์จ๊น/๋ฏธ๋ฆฌ์คํฐ), ์ธํฐ๋ํฐ ํ ๊ธ |
UI/Shop/ShopPanelWidget.cpp | ๋ซ๊ธฐ ์์, ๋ฐํ์ ์กฐ๋ฆฝ ์ ๊ฑฐ, ์์ธ ํ๋ถํ, ๋ซ๊ธฐ/ํตํ ์์ ฏ ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐ |
UI/Shop/ShopPanelWidget.h | ๋ซ๊ธฐ/ํตํ C++ ๋ฉค๋ฒ ์ ๊ฑฐ |
WBP_ShopPanel | ์นด๋ ๋ ์ด์์ยท์ํผ์งยท์ต์ปคยท๋ซ๊ธฐ/ํตํ ์์ ฏ |
WBP_ShopItemEntry | ์ฝ์ธ ์์ด์ฝ ํฌ๋ช |
WBP_ShopSellSlot | ์๋ ํ ์คํธ ์์น/๊ธ๊ผด |
WBP_ShopRepurchaseEntry | ํญ๋ชฉ ๋์ด/๊ธ๊ผด/์ ๋ ฌ |
C++ ๋ณ๊ฒฝ(์นด๋ฉ๋ผยท๋ฐํ์ ์กฐ๋ฆฝ ์ ๊ฑฐยท์์ธยท์ธํฐ๋ํฐ)์ ๋น๋ ํ ์ ์ฉ๋๋ค. WBP ๋ณ๊ฒฝ์ ํธ์ง ํ ์ปดํ์ผยท์ ์ฅ์ด ํ์ํ๋ค(11์ฅ).
WBP๋ฅผ ๊ณ ์ณ๋ ํ๋ฉด์ด ์ ๋ฐ๋๋ฉด, ๊ทธ ์์ ฏ์ C++ NativeConstruct๊ฐ ๋ ์ด์์์ ๋ค์ ๋ง๋ค๊ณ ์๋์ง ๋จผ์ ํ์ธํด์ผ ํ๋ค. ๋ ์ด์์ ์์ ์๊ฐ WBP์ธ์ง C++์ธ์ง๋ฅผ ์ ํ์ง ์์ผ๋ฉด ์๋ฑํ ๊ณณ์ ๊ณ์ ๊ณ ์น๊ฒ ๋๋ค.
๋ฆฌ์คํธ ํญ๋ชฉ ๋ฃจํธ๋ก ์ฐ๋ฉด ์คํฌ๋กค ๋ฐ์ค๊ฐ ๋์ด๋ฅผ ๋ชป ์ค ๊ฒน์น๊ณ , ์ธ๋ก ๋ฐ์ค ์์์ด๋ฉด ์ฌ๋กฏ์ด Auto์ผ ๋ ๋์ด 0์ผ๋ก ๋ฌด๋์ง๋ค. CanvasPanel์ ์ธ ๋ ํฌ๊ธฐ๋ฅผ ๋๊ฐ ์ ํ๋์ง(๊ณ ์ ๋์ด / Fill)๋ฅผ ๋ฐ๋์ ์ฑ๊ธด๋ค.
ํ ์ค์ฒ ์๋ Image/Border๋ ํฐ์์ผ๋ก ์ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ ๋ฐฐ๊ฒฝ์ผ๋ก ๋ฐ๊พธ๋ฉด ๊ธฐ์กด ๋ฐ์ ํ ์คํธ๊ฐ ๋ฌปํ๋ค. ๋ฐฐ๊ฒฝ ๋ฐ๊ธฐ์ ์์ ฏ ์์ ํจ๊ป ๋ด์ผ ํ๋ค.
์์ ฏ์ด ์๊ธฐ๋ฅผ ์ง์ ์ ๊ฑฐํ๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ ์ ๋ ฅยท์ปค์ยท์นด๋ฉ๋ผยทํ์ ๋ณต์์ด ํต์งธ๋ก ๋๋ฝ๋๋ค. ๋ซ๊ธฐ ์์ฒญ์ ํ ๊ฒฝ๋ก๋ก ๋ชจ์ผ๋ฉด ๋ถ์ ํจ๊ณผ๊ฐ ํ๊ณณ์์ ์ ๋ฆฌ๋๋ค.
WBP ์์ ฏ๋ช ๊ณผ C++ ํ๋กํผํฐ๋ช ์ด ๊ฐ์๋ฐ ๋ฐ์ธ๋ฉ์ด ์ ์กํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค. C++ ๋ฉค๋ฒ๋ฅผ ์์ ๊ณ ์ด๋ฆ์ผ๋ก ์์ ฏ์ ์ฐพ์ ์ฐ๋ฉด ๋ฐ์ธ๋ฉ ํ์ด๋ฐ์ ์์กดํ์ง ์๋๋ค.
์บ๋ฆญํฐํ NPC๋ ์๊ธฐ 3์ธ์นญ ์นด๋ฉ๋ผ๋ฅผ ๊ฐ๊ณ ์๊ณ , ๋ฉ์ ์ ๋ฉด์ด ์กํฐ forward์ ๋ฐ๋์ผ ์ ์๋ค. ๋ณ๋ ์นด๋ฉ๋ผ๋ฅผ ์์ ๋๊ณ , ๋ฐฉํฅ์ ํ์ ์คํ์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅํ๊ฒ ๋นผ๋๋ฉด NPC๋ง๋ค ๊ฐ์ผ๋ก ๋ง์ถ ์ ์๋ค.
์ฒซ ์ง์ ยทํน์ ํ๋ฉด์์๋ง ๋๋ ์ ์ด ๋ฉ์ถค์ ๊ธฐ๋ฅ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ ฐ์ด๋ ์ปดํ์ผ/์คํธ๋ฆฌ๋ฐ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํจํค์ง ๋น๋์์ ์ฌ๋ผ์ง๋ฏ๋ก, ์ฝ๋๋ก ์ก์ผ๋ ค ๋ค๊ธฐ ์ ์ "์๋ํฐ ์ ์ฉ์ธ๊ฐ"๋ฅผ ๋จผ์ ํ์ธํ๋ค.
์ปดํ์ผยท์ ์ฅํ์ง ์์ ๋ณ๊ฒฝ์ ์์ ์ฌ๋ก๋ ํ ๋ฒ์ ๋ ์๊ฐ๋ค. ํ ๋ฌถ์๋ง๋ค ์ปดํ์ผยท์ ์ฅ, ๊ทธ๋ฆฌ๊ณ ํ๋ ์ด ์ค์๋ ์ ์ฅ์ด ์ ๋๋ค๋ ์ ๊น์ง ๋ฌถ์ด์ ๊ธฐ์ตํ๋ค.