๐Ÿ“˜TIL-์ƒ์  UI ๋ ˆ์ด์•„์›ƒ ์žฌ๊ตฌ์„ฑ & NPC ํฌ์ปค์Šค ์นด๋ฉ”๋ผ

HappyCircleยท2026๋…„ 6์›” 22์ผ

Unreal ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
150/163

์ž‘์—… ๋ฐฐ๊ฒฝ

์ƒ์ (Shop) ์‹œ์Šคํ…œ์„ ๋‹ค๋“ฌ์œผ๋ฉฐ ์„ธ ๊ฐ€์ง€ ์ฃผ์ œ๋ฅผ ๋‹ค๋ค˜๋‹ค.

  1. NPC ํฌ์ปค์Šค ์นด๋ฉ”๋ผ: ์ƒ์ ์„ ์—ด๋ฉด ์นด๋ฉ”๋ผ๊ฐ€ NPC ์ •๋ฉด์œผ๋กœ ์ „ํ™˜๋˜๊ณ  ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ๋Š” ์ผ์‹œ์ ์œผ๋กœ ์ˆจ๊ฒจ์ง€๋Š” ์—ฐ์ถœ
  2. ๋ ˆ์ด์•„์›ƒ ์žฌ๊ตฌ์„ฑ: ์ƒ์  ํ™”๋ฉด์„ "์ค‘์•™์— NPC๊ฐ€ ๋ณด์ด๊ณ  ์ขŒ/์šฐยทํ•˜๋‹จ์— ํŒจ๋„ ์นด๋“œ๊ฐ€ ๋–  ์žˆ๋Š”" ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ๋ˆ„๊ฐ€ ์†Œ์œ ํ•˜๋Š”๊ฐ€(C++ vs WBP) ๋ฅผ ์ •๋ฆฌ
  3. ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ ๋ฒ„๊ทธ/์ฆ์ƒ ์ˆ˜์ •: ํฐ ๋ฐ•์Šคยทํ…์ŠคํŠธ, ์ข์€ ์˜์—ญ์—์„œ์˜ ๋„˜์นจยท๊ฒน์นจ, ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ๋ถ•๊ดด, ๋‹ซ๊ธฐยท์ƒํ˜ธ์ž‘์šฉ ํ”„๋กฌํ”„ํŠธ, ๋นˆ์•ฝํ•œ ์ƒ์„ธ ์ •๋ณด

๊ฒ‰๋ณด๊ธฐ์—” "์ฐฝ ์œ„์น˜๋งŒ ์žก์œผ๋ฉด ๋˜๋Š”" UI ์ž‘์—… ๊ฐ™์ง€๋งŒ, ์นด๋ฉ”๋ผ ๋ทฐํƒ€๊นƒ ๋ธ”๋ Œ๋“œ โ†’ ํŒจ๋„ ์ž…๋ ฅ๋ชจ๋“œ/๋‹ซ๊ธฐ ๊ฒฝ๋กœ โ†’ ์œ„์ ฏ์ด ๋Ÿฐํƒ€์ž„์— ์กฐ๋ฆฝ๋˜๋Š”์ง€ ์—ฌ๋ถ€ โ†’ BindWidget ๋ฐ”์ธ๋”ฉ โ†’ CanvasPanel์˜ ํฌ๊ธฐ ๊ณ„์‚ฐ ๋ฐฉ์‹๊นŒ์ง€ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์ด ๋งž๋ฌผ๋ ค ์žˆ์—ˆ๋‹ค.


๋ชฉ์ฐจ

  1. NPC ์ •๋ฉด ํฌ์ปค์Šค ์นด๋ฉ”๋ผ
  2. ์นด๋ฉ”๋ผ๊ฐ€ NPC ๋’ค๋ฅผ ๋น„์ถ”๋Š” ๋ฌธ์ œ
  3. ์ƒ์  ์ง„์ž… ์‹œ ์ˆ˜ ์ดˆ ๋ฉˆ์ถค
  4. ๋‹ซ๊ธฐ ๋ฒ„ํŠผ: ์ปค์„œยท์กฐ์ž‘ยท์นด๋ฉ”๋ผ ๋ณต๊ท€
  5. ๋ ˆ์ด์•„์›ƒ ์†Œ์œ ๊ถŒ: ๋Ÿฐํƒ€์ž„ ์กฐ๋ฆฝ vs WBP
  6. ์–‘ํ”ผ์ง€ ์นด๋“œ์—์„œ ํ…์ŠคํŠธยท์ด๋ฏธ์ง€๊ฐ€ ํฐ์ƒ‰์œผ๋กœ ๋ณด์ž„
  7. ์ข์€ ์นด๋“œ์—์„œ์˜ ํ…์ŠคํŠธยท๋ฒ„ํŠผ ๋„˜์นจ/๊ฒน์นจ
  8. ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ (CanvasPanel ํฌ๊ธฐ)
  9. ์ƒ์„ธ ์ •๋ณด ํ’๋ถ€ํ™”
  10. ์ƒํ˜ธ์ž‘์šฉ ํ”„๋กฌํ”„ํŠธ ์ˆจ๊น€
  11. UMG ์—์…‹์„ ์ž๋™ํ™”๋กœ ํŽธ์ง‘ํ•  ๋•Œ ์ฃผ์˜
  12. ๊ฒ€์ฆ ๊ฒฐ๊ณผ
  13. ๋ฐฐ์šด ์ 
  14. ๋‹ค์Œ์— ๋น„์Šทํ•œ ์ž‘์—…์ด ๋‚˜๋ฉด ๋ณผ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

1. NPC ์ •๋ฉด ํฌ์ปค์Šค ์นด๋ฉ”๋ผ

์š”๊ตฌ์‚ฌํ•ญ

์ƒ์ ์„ ์—ด๋ฉด ์นด๋ฉ”๋ผ๊ฐ€ NPC ์ •๋ฉด์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ „ํ™˜๋˜๊ณ , ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ๋Š” ์ˆจ๊ฒจ์ ธ NPC๋งŒ ๋ณด์ธ๋‹ค. ๋‹ซ์œผ๋ฉด ์›๋ž˜ ์‹œ์ ์œผ๋กœ ๋ณต๊ท€.

๋ถ„์„

  • ์ƒ์ ์€ ๋Œ€ํ™” ์‹œ์Šคํ…œ์„ ๊ฑฐ์ณ ์ปจํŠธ๋กค๋Ÿฌ(ARetrievePlayerController)์—์„œ ์—ด๋ฆฐ๋‹ค. ์ด ์‹œ์ ์— ์ƒ์  NPC ์•กํ„ฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • NPC๊ฐ€ ํ’€ ์บ๋ฆญํ„ฐ(์ž์ฒด 3์ธ์นญ ์นด๋ฉ”๋ผ ๋ฆฌ๊ทธ ๋ณด์œ ) ๋ผ, NPC๋ฅผ ๊ทธ๋Œ€๋กœ ์นด๋ฉ”๋ผ ๋ทฐํƒ€๊นƒ์œผ๋กœ ์‚ผ์œผ๋ฉด NPC์˜ 3์ธ์นญ ์นด๋ฉ”๋ผ(๋’คํ†ต์ˆ˜ ๋„ˆ๋จธ)๊ฐ€ ์žกํžŒ๋‹ค. โ†’ 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์—์„œ ๋ฏธ๋ฆฌ ์Šคํฐํ•ด ์ „ํ™˜ ์ˆœ๊ฐ„์˜ ์Šคํฐ ๋น„์šฉ์„ ์—†์•ด๋‹ค.
  • ์นด๋ฉ”๋ผ ๊ตฌ๋„๋Š” ๋ชจ๋‘ UPROPERTY๋กœ ๋นผ์„œ ์—๋””ํ„ฐ์—์„œ ๋ฆฌ๋นŒ๋“œ ์—†์ด ์กฐ์ • ๊ฐ€๋Šฅ: ShopCameraDistance, ShopCameraHeight, ShopCameraLookAtHeight, ShopCameraOrbitYaw, ShopCameraBlendTime, bHidePlayerDuringShopCamera.

2. ์นด๋ฉ”๋ผ๊ฐ€ NPC ๋’ค๋ฅผ ๋น„์ถ”๋Š” ๋ฌธ์ œ

์ฆ์ƒ

์นด๋ฉ”๋ผ๋ฅผ NPC์˜ ์ •๋ฉด ๋ฐฉํ–ฅ(GetActorForwardVector)์— ๋‘๊ณ  NPC๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ–ˆ๋Š”๋ฐ ๋’คํ†ต์ˆ˜๊ฐ€ ๋ณด์˜€๋‹ค.

์›์ธ

์ด NPC๋Š” ๋ฉ”์‹œ ์ •๋ฉด์ด ์•กํ„ฐ์˜ Forward์™€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ด์—ˆ๋‹ค(์บ๋ฆญํ„ฐ ๋ฉ”์‹œ๊ฐ€ ์•กํ„ฐ forward ๋Œ€๋น„ 180ยฐ ํšŒ์ „๋œ ํ”ํ•œ ๊ฒฝ์šฐ). "์•ž"์ด๋ผ๊ณ  ๋‘” ์œ„์น˜๊ฐ€ ์‹ค์ œ๋กœ๋Š” ๋’ค์˜€๋‹ค.

์ˆ˜์ •

์นด๋ฉ”๋ผ ๋ฐฐ์น˜ ๋ฐฉํ–ฅ์„ ํšŒ์ „ ์˜คํ”„์…‹(ShopCameraOrbitYaw)์œผ๋กœ ์กฐ์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ธฐ๋ณธ๊ฐ’์„ 180ยฐ๋กœ ๋’€๋‹ค. ๋ฉ”์‹œ ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅธ NPC๊ฐ€ ์™€๋„ ๊ฐ’๋งŒ ๋ฐ”๊ฟ” ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค(๋ฆฌ๋นŒ๋“œ ๋ถˆํ•„์š”).


3. ์ƒ์  ์ง„์ž… ์‹œ ์ˆ˜ ์ดˆ ๋ฉˆ์ถค

์ฆ์ƒ

์ƒ์ ์„ ์—ฌ๋Š” ์ˆœ๊ฐ„ ํ™”๋ฉด์ด ์ˆ˜ ์ดˆ๊ฐ„ ๋ฉˆ์ท„๋‹ค๊ฐ€ ํ•œ ๋ฒˆ์— ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์—๋””ํ„ฐ(PIE)์—์„œ ์ฒซ ์ง„์ž…ยท์ƒ์ ์—์„œ๋งŒ ์‹ฌํ•˜๊ณ , ๋‘˜์งธ๋ถ€ํ„ฐ๋Š” ๋น ๋ฅด๋ฉฐ, ์ธ๋ฒคํ† ๋ฆฌ ๋“ฑ ๋‹ค๋ฅธ ํ™”๋ฉด์—๋Š” ์—†์—ˆ๋‹ค.

์›์ธ

  • ์ƒ์  ์˜คํ”ˆ ์ž์ฒด๋Š” ๋™๊ธฐ ์ฆ‰์‹œ ์‹คํ–‰์ด๋ผ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์ˆ˜ ์ดˆ ์ง€์—ฐ ์š”์†Œ๊ฐ€ ์—†๋‹ค.
  • "๋ฉˆ์ท„๋‹ค๊ฐ€ ํ•œ ๋ฒˆ์—"๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น์˜ ์ „ํ˜•์ด๋‹ค. ์ฒซ ์ง„์ž…ยท์ƒ์ ์—์„œ๋งŒ ๋‚˜๋Š” ์ด์œ ๋Š”, ์นด๋ฉ”๋ผ๊ฐ€ NPC(๋ชจ๋“ˆ๋Ÿฌ ์บ๋ฆญํ„ฐ)๋ฅผ ๊ฐ€๊นŒ์ด์„œ ์ฒ˜์Œ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ๊ทธ ๋จธํ‹ฐ๋ฆฌ์–ผ๋“ค์˜ ์…ฐ์ด๋”๋ฅผ ๊ทธ ์ž๋ฆฌ์—์„œ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ธ๋ฒคํ† ๋ฆฌ๋Š” ์นด๋ฉ”๋ผ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฒฐ๋ก 

์—๋””ํ„ฐ ์ „์šฉ ํ˜„์ƒ์ด๋ฉฐ ํŒจํ‚ค์ง•(์ฟก) ๋นŒ๋“œ์—๋Š” ์—†๋‹ค. ๊ธฐ๋Šฅ ๋ฒ„๊ทธ๋กœ ์˜ค์ธํ•ด ์ฝ”๋“œ๋กœ ๋ฌด๋ฆฌํ•˜๊ฒŒ ์žก์œผ๋ ค ํ•˜์ง€ ๋ง ๊ฒƒ. (์ „ํ™˜ ์‹œ์ ์˜ ์นด๋ฉ”๋ผ ์•กํ„ฐ ์Šคํฐ ๋น„์šฉ๋งŒ ๋ฏธ๋ฆฌ ์Šคํฐ์œผ๋กœ ์ œ๊ฑฐ)


4. ๋‹ซ๊ธฐ ๋ฒ„ํŠผ: ์ปค์„œยท์กฐ์ž‘ยท์นด๋ฉ”๋ผ ๋ณต๊ท€

์ฆ์ƒ

์ƒ์  ๋‹ซ๊ธฐ(โœ•)๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ๋งˆ์šฐ์Šค ์ปค์„œ๊ฐ€ ๋‚จ๊ณ  ํ”Œ๋ ˆ์ด์–ด ์กฐ์ž‘์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์•˜๋‹ค(์นด๋ฉ”๋ผ/ํ”Œ๋ ˆ์ด์–ด ํ‘œ์‹œ๋„ ๋ณต๊ท€ ์•ˆ ๋จ).

์›์ธ

๋‹ซ๊ธฐ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํŒจ๋„์„ RemoveFromParent()๋กœ ์ง์ ‘ ์ œ๊ฑฐํ•ด, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ์ •์‹ ๋‹ซ๊ธฐ ๊ฒฝ๋กœ๋ฅผ ์šฐํšŒํ–ˆ๋‹ค. ๊ทธ ๊ฒฝ๋กœ ์•ˆ์—์„œ ์ž…๋ ฅ๋ชจ๋“œ ๋ณต๊ท€ยท์ปค์„œ ์ˆจ๊น€ยท์นด๋ฉ”๋ผ ๋ณต๊ท€ยทํ”Œ๋ ˆ์ด์–ด ํ‘œ์‹œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ ์ „๋ถ€ ๊ฑด๋„ˆ๋›ด ๊ฒƒ.

์ˆ˜์ •

ํŒจ๋„์ด ์Šค์Šค๋กœ ๋‹ซ์ง€ ์•Š๊ณ  ๋‹ซ๊ธฐ ์š”์ฒญ๋งŒ ๋ณด๋‚ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒŒ ์œ„์ž„ํ–ˆ๋‹ค.

void UShopPanelWidget::HandleCloseShopClicked()
{
    // ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ •์‹ ๋‹ซ๊ธฐ ๊ฒฝ๋กœ๋กœ ์œ„์ž„ โ†’ ์ž…๋ ฅ๋ชจ๋“œ/์ปค์„œ/์นด๋ฉ”๋ผ/ํ”Œ๋ ˆ์ด์–ดํ‘œ์‹œ๊ฐ€ ํ•œ ๊ณณ์—์„œ ๋ณต์›๋จ
    RequestClose();
}

๊ตํ›ˆ: ๋ถ€์ˆ˜ ํšจ๊ณผ(์ž…๋ ฅยท์ปค์„œยท์นด๋ฉ”๋ผ ๋“ฑ)๊ฐ€ ๋”ฐ๋ผ๋ถ™๋Š” ๋‹ซ๊ธฐ๋Š” ๋‹จ์ผ ๊ฒฝ๋กœ๋กœ ๋ชจ์•„์•ผ ํ•œ๋‹ค. ์œ„์ ฏ์ด ์ž๊ธฐ๋ฅผ ์ง์ ‘ ์ œ๊ฑฐํ•˜๋ฉด ๊ทธ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ํ†ต์งธ๋กœ ๋ˆ„๋ฝ๋œ๋‹ค.


5. ๋ ˆ์ด์•„์›ƒ ์†Œ์œ ๊ถŒ: ๋Ÿฐํƒ€์ž„ ์กฐ๋ฆฝ vs WBP

์ฆ์ƒ

์›ํ•˜๋Š” ์นด๋“œ ๋ ˆ์ด์•„์›ƒ์„ WBP(WBP_ShopPanel)์—์„œ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ํ™”๋ฉด์— ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค.

์›์ธ

์ƒ์  ์œ„์ ฏ์˜ C++ NativeConstruct๊ฐ€ ๋งค๋ฒˆ ๋Ÿฐํƒ€์ž„์— ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ์กฐ๋ฆฝํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋””์ž์ธ ํƒ€์ž„์— ๋ฐฐ์น˜ํ•œ ๋ฐ”์šด๋“œ ์œ„์ ฏ๋“ค(๋ชฉ๋ก/์ƒ์„ธ/์ธ๋ฒคํ† ๋ฆฌ/๋Œ€์‚ฌ)์„ ๋–ผ์–ด๋‚ด ์ฝ”๋“œ๋กœ ๋งŒ๋“  ์นด๋“œ์— ๋‹ค์‹œ ๋‹ด๊ณ , ๋‹ซ๊ธฐ ๋ฒ„ํŠผยทํ†ตํ™” ํ…์ŠคํŠธยทํƒ€์ดํ‹€๋ฐ”๊นŒ์ง€ ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ๊ทธ๋ž˜์„œ WBP์—์„œ ๋ฌด์—‡์„ ๋ฐ”๊ฟ”๋„ ์‹คํ–‰ํ•˜๋ฉด ๋ฎ์–ด์จ์กŒ๋‹ค.

ํ•ด๊ฒฐ: ๋ ˆ์ด์•„์›ƒ์„ WBP๋กœ ์˜ฎ๊ธฐ๊ณ  ๋Ÿฐํƒ€์ž„ ์กฐ๋ฆฝ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐ

๋ ˆ์ด์•„์›ƒ ์†Œ์œ ์ž๋ฅผ WBP๋กœ ์ผ์›ํ™”ํ•˜๊ธฐ๋กœ ํ•˜๊ณ , ๊นจ์ง ์—†์ด ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ–ˆ๋‹ค.

  1. ๋Ÿฐํƒ€์ž„ ์กฐ๋ฆฝ ์ฝ”๋“œ์— ๊ฐ€๋“œ ์ถ”๊ฐ€ โ€” WBP๊ฐ€ ์นด๋“œ ๋ฃจํŠธ(Canvas_ShopRoot)๋ฅผ ๊ฐ€์ง€๋ฉด ์กฐ๋ฆฝ์„ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ํ•ด, ์˜ฎ๊ธฐ๋Š” ๋„์ค‘์—๋„ ํ™”๋ฉด์ด ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•จ.
  2. WBP์— ์นด๋“œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์ถ• โ€” Canvas_ShopRoot(CanvasPanel) ์•„๋ž˜ ์นด๋“œ 4๊ฐœ(Border, ์–‘ํ”ผ์ง€ ๋ฐฐ๊ฒฝ)๋ฅผ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ๋ฐ”์šด๋“œ ์œ„์ ฏ์„ ๊ทธ ์•ˆ์œผ๋กœ ์žฌ๋ฐฐ์น˜, ๋น„์œจ ์•ต์ปค๋กœ ํ™”๋ฉด์— ๋ฐฐ์น˜.
  3. ๋Ÿฐํƒ€์ž„ ์กฐ๋ฆฝ ์ฝ”๋“œ ์ œ๊ฑฐ โ€” ๋” ์ด์ƒ ์“ฐ์ง€ ์•Š๋Š” ์กฐ๋ฆฝ ๋กœ์ง์„ ์‚ญ์ œ. ์ด๋•Œ ๋‹ซ๊ธฐ ๋ฒ„ํŠผยทํ†ตํ™” ํ…์ŠคํŠธ๋Š” WBP ์œ„์ ฏ์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ C++์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฐพ์•„ ์—ฐ๊ฒฐ.

์ตœ์ข… ๊ตฌ์กฐ(๋ ˆ์ด์•„์›ƒ์€ WBP, C++์€ ๋ฐ์ดํ„ฐ/๋กœ์ง๋งŒ):

WBP_ShopPanel
โ”” Canvas_ShopRoot (ํ™”๋ฉด ์ฑ„์›€)
   โ”œ ๊ตฌ๋งค ๋ชฉ๋ก ์นด๋“œ   (์ขŒ์ธก,   ์Šคํฌ๋กค)
   โ”œ ์ƒ์„ธ ์ •๋ณด ์นด๋“œ   (์šฐ์ธก ์œ„)
   โ”œ ์ธ๋ฒคํ† ๋ฆฌ/ํŒ๋งค ์นด๋“œ(์šฐ์ธก ์•„๋ž˜)
   โ”œ NPC ์ด๋ฆ„ยท๋Œ€์‚ฌ ์นด๋“œ(์ขŒ์ธก ์•„๋ž˜)
   โ”” ๋‹ซ๊ธฐ(โœ•) ๋ฒ„ํŠผ     (์šฐํ•˜๋‹จ)
   (๊ฐ€์šด๋ฐ๋Š” ๋น„์›Œ NPC๊ฐ€ ๋ณด์ด๊ฒŒ)

๊ณ๋“ค์—ฌ ๋ฐœ๊ฒฌํ•œ ํ•จ์ •: BindWidget ์ด๋ฆ„ ์ถฉ๋Œ

๋‹ซ๊ธฐ ๋ฒ„ํŠผยทํ†ตํ™” ํ…์ŠคํŠธ๋ฅผ 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์œผ๋กœ ์ฐŒ๋ถ€๋จ.
  • ์ˆ˜์ •: ๊ทธ ์Šฌ๋กฏ์„ Fill๋กœ ๋ฐ”๊ฟ” ์บ”๋ฒ„์Šค๊ฐ€ ํ™”๋ฉด์„ ์ฑ„์šฐ๊ฒŒ ํ•˜๋‹ˆ ๋น„์œจ ์•ต์ปค ์นด๋“œ๋“ค์ด ์ œ ์œ„์น˜๋กœ ๊ฐ”๋‹ค.

6. ์–‘ํ”ผ์ง€ ์นด๋“œ์—์„œ ํ…์ŠคํŠธยท์ด๋ฏธ์ง€๊ฐ€ ํฐ์ƒ‰์œผ๋กœ ๋ณด์ž„

์นด๋“œ ๋ฐฐ๊ฒฝ์„ ๋ฐ์€ ์–‘ํ”ผ์ง€๋กœ ๋ฐ”๊พธ์ž "ํฐ์ƒ‰ ๋ฌปํž˜ / ํฐ ๋ฐ•์Šค" ๊ณ„์—ด ๋ฌธ์ œ๊ฐ€ ์ค„์ค„์ด ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.

์ฆ์ƒ์›์ธ์ˆ˜์ •
์นด๋“œ ํ…์ŠคํŠธ๊ฐ€ ํฐ์ƒ‰์œผ๋กœ ๋ฌปํž˜๋ฐ์€ ์–‘ํ”ผ์ง€ + ๋ฐ์€/ํฐ ํ…์ŠคํŠธ์นด๋“œ ์–‘ํ”ผ์ง€์— ์–ด๋‘์šด ํ‹ดํŠธ(์–ด๋‘์šด ๊ฐˆ์ƒ‰)๋ฅผ ๋„ฃ์–ด ๋Œ€๋น„ ํ™•๋ณด
์ƒ์„ธ ์นด๋“œ ์ „์ฒด๊ฐ€ ํฐ์ƒ‰์ƒ์„ธ ํŒจ๋„(Border)์˜ ๊ธฐ๋ณธ ํฐ ๋ธŒ๋Ÿฌ์‹œ๊ฐ€ ์นด๋“œ ์–‘ํ”ผ์ง€๋ฅผ ๋ฎ์Œ๊ทธ Border ๋ฐฐ๊ฒฝ์„ ๊ทธ๋ฆฌ์ง€ ์•Š๊ฒŒ(NoDrawType) ์„ค์ •
์ƒ์„ธ ๋‚ด ์ž‘์€ ํฐ ๋ฐ•์Šค(์Šคํƒฏ ๋น„๊ต)์Šคํƒฏ ๋น„๊ต์šฉ Border์˜ ํฐ ๋ฐฐ๊ฒฝ + ๋นˆ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€์˜ ํฐ์ƒ‰Border๋Š” ๊ทธ๋ฆฌ์ง€ ์•Š๊ฒŒ, ์•„์ด์ฝ˜์€ ํˆฌ๋ช…(์•ŒํŒŒ 0)
์ƒํ’ˆ ๋ชฉ๋ก ์ค‘๊ฐ„ ํฐ ๋ธ”๋ก๋ชฉ๋ก ํ•ญ๋ชฉ์˜ ์ฝ”์ธ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€์— ํ…์Šค์ฒ˜๊ฐ€ ์—†์–ด ํฐ์ƒ‰์ฝ”์ธ ์•„์ด์ฝ˜ ํˆฌ๋ช…(์•ŒํŒŒ 0)

ํ•ต์‹ฌ: ํ…์Šค์ฒ˜๊ฐ€ ์—†๋Š” Image/Border๋Š” ํฐ์ƒ‰์œผ๋กœ ์ฐํžŒ๋‹ค. ์•ˆ ์“ฐ๋ฉด ๊ทธ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ํˆฌ๋ช…์œผ๋กœ ๋ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ๊ฒฝ ๋ฐ๊ธฐ์™€ ํ…์ŠคํŠธ ์ƒ‰์€ ํ•ญ์ƒ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค(๋ฐ์€ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ธฐ์กด ๋ฐ์€ ํ…์ŠคํŠธ๊ฐ€ ๋ฌปํž˜).


7. ์ข์€ ์นด๋“œ์—์„œ์˜ ํ…์ŠคํŠธยท๋ฒ„ํŠผ ๋„˜์นจ/๊ฒน์นจ

์ฆ์ƒ์›์ธ์ˆ˜์ •
์ธ๋ฒคํ† ๋ฆฌ ํˆด๋ฐ” ๋ฒ„ํŠผ์ด ์„ ํƒ ์‹œ ๋ฐ€๋ ค ์˜์—ญ ๋ฐ–์œผ๋กœ์„ ํƒ ๊ฐœ์ˆ˜ ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ง€๋ฉฐ ๊ฐ€๋กœ ๋ฐ•์Šค์—์„œ ๋ฒ„ํŠผ์„ ๋ฐ€์–ด๋ƒ„๋ฒ„ํŠผ์€ ๋‚ด์šฉ ํฌ๊ธฐ(Auto), ์„ ํƒ ๊ฐœ์ˆ˜ ํ…์ŠคํŠธ๋Š” ๋‚จ๋Š” ๊ณต๊ฐ„ ์ฑ„์›€(Fill) ์œผ๋กœ ์—ญํ•  ๋ถ„๋ฆฌ
ํˆด๋ฐ” ๋ผ๋ฒจ์ด ์„œ๋กœ ๊ฒน์นจ์ข์€ ์นด๋“œ ๋Œ€๋น„ ๊ธ€๊ผด์ด ํผํˆด๋ฐ” ๊ธ€๊ผด ์ถ•์†Œ
์šฐ์ธก ์ƒ์„ธ/์ธ๋ฒค ๋‚ด์šฉ ๋„˜์นจ์šฐ์ธก ์นด๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ข์Œ์šฐ์ธก ์นด๋“œ ํญ์„ ๋„“ํž˜
ํŒ๋งค ์Šฌ๋กฏ ์ˆ˜๋Ÿ‰ ํ…์ŠคํŠธ๊ฐ€ ํฌ๊ณ  ํ…Œ๋‘๋ฆฌ์— ๊ฐ€๋ฆผ์ˆ˜๋Ÿ‰ ํ…์ŠคํŠธ๊ฐ€ ์Šฌ๋กฏ์„ ๊ฐ€๋“ ์ฑ„์šฐ๊ณ , ๊ทธ ์œ„์— ํ”„๋ ˆ์ž„์ด ๋ง๊ทธ๋ ค์ ธ ๊ฐ€๋ฆผ์ˆ˜๋Ÿ‰ ํ…์ŠคํŠธ๋ฅผ ๋งจ ์œ„ ๋ ˆ์ด์–ด๋กœ ์˜ฌ๋ฆฌ๊ณ  ๊ธ€๊ผด ์ถ•์†Œ + ์šฐํ•˜๋‹จ ์ž‘์€ ๋ฐฐ์ง€๋กœ ์ •๋ ฌ

ํ•ต์‹ฌ ๋‘ ๊ฐ€์ง€:

  • ๊ฐ€๋กœ ๋ฐ•์Šค์—์„œ ํ•œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ๋ฐ€์–ด๋‚ด๋ฉด, ๋ฐ€๋ฆฌ๋ฉด ์•ˆ ๋˜๋Š” ์ชฝ(๋ฒ„ํŠผ)์€ Auto, ๋Š˜์–ด๋‚˜๋„ ๋˜๋Š” ์ชฝ(ํ…์ŠคํŠธ)์€ Fill๋กœ ๋‘”๋‹ค.
  • ๊ฒน์ณ ๊ทธ๋ฆฌ๋Š” ์ปจํ…Œ์ด๋„ˆ(Overlay)์—์„œ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ์œ„๋‹ค. ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ๋ฎ์œผ๋ฉด ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•œ๋‹ค.

8. ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ (CanvasPanel ํฌ๊ธฐ)

์ฆ์ƒ

์žฌ๊ตฌ๋งค ๋ชฉ๋ก ํ•ญ๋ชฉ๋“ค์ด ์„ธ๋กœ๋กœ ์Œ“์ด์ง€ ์•Š๊ณ  ํ•œ๊ณณ์— ๊ฒน์ณ ๋ณด์˜€๋‹ค(์ด๋ฆ„ยท๊ฐ€๊ฒฉ์ด ๋ถ™์–ด ๊ฐ’์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด๊ธฐ๋„ ํ•จ).

์›์ธ

๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ์œ„์ ฏ์˜ ๋ฃจํŠธ๊ฐ€ CanvasPanel์ด์—ˆ๋‹ค. CanvasPanel์€ ์Šค์Šค๋กœ "์›ํ•˜๋Š” ํฌ๊ธฐ(Desired Size)"๊ฐ€ 0์ด๋ผ, ์Šคํฌ๋กค ๋ฐ•์Šค๊ฐ€ ๊ฐ ํ•ญ๋ชฉ์— ๋†’์ด๋ฅผ ์ฃผ์ง€ ๋ชปํ•ด 0px๋กœ ๊ฒน์นœ๋‹ค. (๊ฒŒ๋‹ค๊ฐ€ ๋‚ด๋ถ€ ๋‚ด์šฉ์ด ๊ณ ์ •๋œ ์ž‘์€ ๋ฐ•์Šค์— ๊ฐ‡ํ˜€ ์žˆ์–ด ๋” ๋ญ‰์ณค๋‹ค)

์ˆ˜์ •

ํ•ญ๋ชฉ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ์œ„์ชฝ์— ๊ฐ€๋กœ๋กœ ๋Š˜๋ฆฌ๋˜ ๋†’์ด๋ฅผ ๊ณ ์ •ํ•ด, ํ•ญ๋ชฉ์ด ์Šค์Šค๋กœ ๋†’์ด๋ฅผ ๋ณด๊ณ ํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ ์œ„์—์„œ ๊ธ€๊ผด ์ถ•์†Œ + ์ด๋ฆ„์€ ๋‚จ๋Š” ๊ณต๊ฐ„ ์ฑ„์›€, ๊ฐ€๊ฒฉยท๋ฒ„ํŠผ์€ ๋‚ด์šฉ ํฌ๊ธฐ๋กœ ์ •๋ ฌ.

๊ตํ›ˆ: CanvasPanel์€ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ ํฌ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ์Šคํฌ๋กค/์„ธ๋กœ ๋ฐ•์Šค์˜ ํ•ญ๋ชฉ ๋ฃจํŠธ๋กœ ์“ฐ๋ฉด ๋†’์ด 0์œผ๋กœ ๋ฌด๋„ˆ์ง„๋‹ค. CanvasPanel์„ ์“ธ ๋• "๋ˆ„๊ฐ€ ์ด ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๋Š”๊ฐ€"๋ฅผ ํ•ญ์ƒ ์˜์‹ํ•œ๋‹ค(๊ณ ์ • ๋†’์ด๋ฅผ ์ฃผ๊ฑฐ๋‚˜, ๋ถ€๋ชจ ์Šฌ๋กฏ์—์„œ Fill๋กœ ์ฑ„์šฐ๊ฑฐ๋‚˜).


9. ์ƒ์„ธ ์ •๋ณด ํ’๋ถ€ํ™”

์ฆ์ƒ

์ƒ์  ์ƒ์„ธ๊ฐ€ ์ด๋ฆ„/๊ฐ€๊ฒฉ/์งง์€ ์„ค๋ช…/์Šคํƒฏ 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));

10. ์ƒํ˜ธ์ž‘์šฉ ํ”„๋กฌํ”„ํŠธ ์ˆจ๊น€

์ฆ์ƒ

์ƒ์  ํŒจ๋„์ด ์—ด๋ฆฐ ์ƒํƒœ์—์„œ๋„ NPC ์œ„์— "Interact" ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋–  ์žˆ์—ˆ๋‹ค.

์›์ธ

์ƒํ˜ธ์ž‘์šฉ ํ”„๋กฌํ”„ํŠธ๋Š” ํ”Œ๋ ˆ์ด์–ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ธํ„ฐ๋ž™ํ„ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œํ•˜๋Š”๋ฐ, ํŒจ๋„์ด ์—ด๋ ค๋„ ๊ณ„์† ๋™์ž‘ํ–ˆ๋‹ค.

์ˆ˜์ •

ํŒจ๋„ ์—ด๋ฆผ/๋‹ซํž˜ ๋‹จ์ผ ์ง€์ ์—์„œ ์ธํ„ฐ๋ž™ํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑ/ํ™œ์„ฑํ•œ๋‹ค.

// ํŒจ๋„ ์—ด๋ฆผ
if (UActorComponent* Interactor = GetInteractorComponent()) Interactor->SetActive(false);
// ํŒจ๋„ ๋‹ซํž˜
if (UActorComponent* Interactor = GetInteractorComponent()) Interactor->SetActive(true);

11. UMG ์—์…‹์„ ์ž๋™ํ™”๋กœ ํŽธ์ง‘ํ•  ๋•Œ ์ฃผ์˜

์—๋””ํ„ฐ ์ž๋™ํ™” ๋„๊ตฌ๋กœ WBP๋ฅผ ํŽธ์ง‘ํ•˜๋ฉด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ถ€๋”ชํžŒ ๊ทœ์น™๋“ค. (์ด ํ”„๋กœ์ ํŠธ๋Š” UMG ํŽธ์ง‘์„ ์Šคํฌ๋ฆฝํŠธ/์ž๋™ํ™”๋กœ๋„ ํ•œ๋‹ค)

  • ํŽธ์ง‘ ํ›„ ๋ฐ˜๋“œ์‹œ ์ปดํŒŒ์ผ + ์ €์žฅํ•œ๋‹ค. ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์€ ์—์…‹์ด ๋‹ค์‹œ ๋กœ๋“œ๋˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค. ํ•œ ๋ฌถ์Œ ์ž‘์—…์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์ปดํŒŒ์ผ โ†’ ์ €์žฅ๊นŒ์ง€ ๋งˆ์ณ์•ผ ์•ˆ์ „ํ•˜๋‹ค.
  • ํ”Œ๋ ˆ์ด(PIE) ์ค‘์—๋Š” ์—์…‹ ์ €์žฅ์ด ๋ง‰ํžŒ๋‹ค. ์ €์žฅ์€ ํ”Œ๋ ˆ์ด๋ฅผ ๋ฉˆ์ถ˜ ๋’ค์— ํ•œ๋‹ค.
  • WBP ์œ„์ ฏ๋ช…๊ณผ C++ ํ”„๋กœํผํ‹ฐ๋ช…์ด ๊ฐ™์œผ๋ฉด ๋ฐ”์ธ๋”ฉ ์ถฉ๋Œ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ถฉ๋Œํ•˜๋ฉด C++ ๋ฉค๋ฒ„๋ฅผ ๋‘์ง€ ๋ง๊ณ  ์ด๋ฆ„์œผ๋กœ ์œ„์ ฏ์„ ์ฐพ์•„ ์“ด๋‹ค(5์žฅ ์ฐธ๊ณ ).
  • ๋นˆ Image/Border๋Š” ํฐ์ƒ‰์œผ๋กœ ๋ณด์ธ๋‹ค. ์•ˆ ์“ฐ๋ฉด ๊ทธ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ํˆฌ๋ช…์œผ๋กœ ๋ˆ๋‹ค.
  • CanvasPanel์€ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ ํฌ๊ธฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค(8์žฅ). ํ•ญ๋ชฉ/์ž์‹์œผ๋กœ ์“ธ ๋• ๊ณ ์ • ๋†’์ด๋‚˜ Fill๋กœ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์ค€๋‹ค.

12. ๊ฒ€์ฆ ๊ฒฐ๊ณผ

ํ•ญ๋ชฉ์ƒํƒœ
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์žฅ).


13. ๋ฐฐ์šด ์ 

UI๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์žฌ์กฐ๋ฆฝ๋˜๊ณ  ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ์˜์‹ฌํ•œ๋‹ค

WBP๋ฅผ ๊ณ ์ณ๋„ ํ™”๋ฉด์ด ์•ˆ ๋ฐ”๋€Œ๋ฉด, ๊ทธ ์œ„์ ฏ์˜ C++ NativeConstruct๊ฐ€ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋ ˆ์ด์•„์›ƒ ์†Œ์œ ์ž๊ฐ€ WBP์ธ์ง€ C++์ธ์ง€๋ฅผ ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์—‰๋šฑํ•œ ๊ณณ์„ ๊ณ„์† ๊ณ ์น˜๊ฒŒ ๋œ๋‹ค.

CanvasPanel์€ ์Šค์Šค๋กœ ํฌ๊ธฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค

๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ๋ฃจํŠธ๋กœ ์“ฐ๋ฉด ์Šคํฌ๋กค ๋ฐ•์Šค๊ฐ€ ๋†’์ด๋ฅผ ๋ชป ์ค˜ ๊ฒน์น˜๊ณ , ์„ธ๋กœ ๋ฐ•์Šค ์ž์‹์ด๋ฉด ์Šฌ๋กฏ์ด Auto์ผ ๋•Œ ๋†’์ด 0์œผ๋กœ ๋ฌด๋„ˆ์ง„๋‹ค. CanvasPanel์„ ์“ธ ๋• ํฌ๊ธฐ๋ฅผ ๋ˆ„๊ฐ€ ์ •ํ•˜๋Š”์ง€(๊ณ ์ • ๋†’์ด / Fill)๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฑ™๊ธด๋‹ค.

ํฐ ๋ฐ•์Šคยทํฐ ํ…์ŠคํŠธ๋Š” "๋นˆ ๊ธฐ๋ณธ๊ฐ’ + ๋Œ€๋น„"์˜ ๋ฌธ์ œ๋‹ค

ํ…์Šค์ฒ˜ ์—†๋Š” Image/Border๋Š” ํฐ์ƒ‰์œผ๋กœ ์ฐํžŒ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์€ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ธฐ์กด ๋ฐ์€ ํ…์ŠคํŠธ๊ฐ€ ๋ฌปํžŒ๋‹ค. ๋ฐฐ๊ฒฝ ๋ฐ๊ธฐ์™€ ์œ„์ ฏ ์ƒ‰์„ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค.

๋‹ซ๊ธฐยท์ž…๋ ฅ ๋ณต๊ท€๋Š” ๋‹จ์ผ ๊ฒฝ๋กœ๋กœ ์œ„์ž„ํ•œ๋‹ค

์œ„์ ฏ์ด ์ž๊ธฐ๋ฅผ ์ง์ ‘ ์ œ๊ฑฐํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•˜๋˜ ์ž…๋ ฅยท์ปค์„œยท์นด๋ฉ”๋ผยทํ‘œ์‹œ ๋ณต์›์ด ํ†ต์งธ๋กœ ๋ˆ„๋ฝ๋œ๋‹ค. ๋‹ซ๊ธฐ ์š”์ฒญ์„ ํ•œ ๊ฒฝ๋กœ๋กœ ๋ชจ์œผ๋ฉด ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ํ•œ๊ณณ์—์„œ ์ •๋ฆฌ๋œ๋‹ค.

BindWidget ์ด๋ฆ„ ์ถฉ๋Œ์€ "์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ"๋กœ ํ”ผํ•œ๋‹ค

WBP ์œ„์ ฏ๋ช…๊ณผ C++ ํ”„๋กœํผํ‹ฐ๋ช…์ด ๊ฐ™์€๋ฐ ๋ฐ”์ธ๋”ฉ์ด ์•ˆ ์žกํžˆ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. C++ ๋ฉค๋ฒ„๋ฅผ ์—†์• ๊ณ  ์ด๋ฆ„์œผ๋กœ ์œ„์ ฏ์„ ์ฐพ์•„ ์“ฐ๋ฉด ๋ฐ”์ธ๋”ฉ ํƒ€์ด๋ฐ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ’€ ์บ๋ฆญํ„ฐ NPC๋ฅผ ์นด๋ฉ”๋ผ ํƒ€๊นƒ์œผ๋กœ ์“ฐ๋ฉด ๋’คํ†ต์ˆ˜๊ฐ€ ๋ณด์ธ๋‹ค

์บ๋ฆญํ„ฐํ˜• NPC๋Š” ์ž๊ธฐ 3์ธ์นญ ์นด๋ฉ”๋ผ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋ฉ”์‹œ ์ •๋ฉด์ด ์•กํ„ฐ forward์™€ ๋ฐ˜๋Œ€์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ณ„๋„ ์นด๋ฉ”๋ผ๋ฅผ ์•ž์— ๋‘๊ณ , ๋ฐฉํ–ฅ์„ ํšŒ์ „ ์˜คํ”„์…‹์œผ๋กœ ์กฐ์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋นผ๋‘๋ฉด NPC๋งˆ๋‹ค ๊ฐ’์œผ๋กœ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

์—๋””ํ„ฐ์—์„œ์˜ "๋ฉˆ์ถค"์€ ์…ฐ์ด๋” ์ปดํŒŒ์ผ์ผ ์ˆ˜ ์žˆ๋‹ค

์ฒซ ์ง„์ž…ยทํŠน์ • ํ™”๋ฉด์—์„œ๋งŒ ๋‚˜๋Š” ์ˆ˜ ์ดˆ ๋ฉˆ์ถค์€ ๊ธฐ๋Šฅ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์…ฐ์ด๋” ์ปดํŒŒ์ผ/์ŠคํŠธ๋ฆฌ๋ฐ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํŒจํ‚ค์ง• ๋นŒ๋“œ์—์„  ์‚ฌ๋ผ์ง€๋ฏ€๋กœ, ์ฝ”๋“œ๋กœ ์žก์œผ๋ ค ๋“ค๊ธฐ ์ „์— "์—๋””ํ„ฐ ์ „์šฉ์ธ๊ฐ€"๋ฅผ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.

UMG ์ž๋™ ํŽธ์ง‘์€ "์ปดํŒŒ์ผ + ์ €์žฅ"์ด ์ „๋ถ€๋‹ค

์ปดํŒŒ์ผยท์ €์žฅํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์€ ์—์…‹ ์žฌ๋กœ๋“œ ํ•œ ๋ฒˆ์— ๋‚ ์•„๊ฐ„๋‹ค. ํ•œ ๋ฌถ์Œ๋งˆ๋‹ค ์ปดํŒŒ์ผยท์ €์žฅ, ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋ ˆ์ด ์ค‘์—๋Š” ์ €์žฅ์ด ์•ˆ ๋œ๋‹ค๋Š” ์ ๊นŒ์ง€ ๋ฌถ์–ด์„œ ๊ธฐ์–ตํ•œ๋‹ค.

profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€