[TIL] 251121

๊น€์„ธํฌยท2025๋…„ 11์›” 21์ผ

โœ๏ธToday I Learned

๐Ÿ“… 2025-11-21

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์ƒํ˜ธ์ž‘์šฉ ์œ„์ ฏ ํ‘œ์‹œ ์‹œ์Šคํ…œ ์ถ”๊ฐ€
  • ํ”ฝ์—… ์•„์ดํ…œ ์•กํ„ฐ ๊ตฌํ˜„ ๋ฐ AddItem ํ…Œ์ŠคํŠธ
  • ์ปจํ…Œ์ด๋„ˆ ์•กํ„ฐ ๊ตฌํ˜„
  • ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ (RunOnServer ํŒจํ„ด)

์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์ƒํ˜ธ์ž‘์šฉ ์œ„์ ฏ ํ‘œ์‹œ ์‹œ์Šคํ…œ

๊ธฐ์กด ์ฝ”๋“œ (ํŒ€์› ์ž‘์—…)

  • ์บ๋ฆญํ„ฐ์—์„œ ๋ผ์ธํŠธ๋ ˆ์ด์Šค๋กœ CurrentHitActor, LastHitActor ์ €์žฅ
  • ์•กํ„ฐ ์ „ํ™˜ ๊ฐ์ง€ ๊ธฐ๋Šฅ

์ถ”๊ฐ€ ๊ตฌํ˜„ ๋‚ด์šฉ

1. IInteractableInterface ํ™•์ธ ํ›„ ์œ„์ ฏ ํ‘œ์‹œ

// ์ด์ „ ์•กํ„ฐ ์ฒ˜๋ฆฌ
	if (IsValid(LastHitActor.Get()))
	{
		if (LastHitActor->Implements<UIInteraction>())
		{
			IIInteraction* InteractionInterface = Cast<IIInteraction>(LastHitActor);
			if (InteractionInterface)
			{
				InteractionInterface->HideInteractionWidget();
			}
		}
	}

	// ํ˜„์žฌ ์•กํ„ฐ ์ฒ˜๋ฆฌ
	if (IsValid(CurrentHitActor.Get()))
	{
		if (CurrentHitActor->Implements<UIInteraction>())
		{
			IIInteraction* InteractionInterface = Cast<IIInteraction>(CurrentHitActor);
			if (InteractionInterface && InteractionInterface->CanInteract(this))
			{
				InteractionInterface->ShowInteractionWidget(this);
			}
		}
	}

2. ํ”ฝ์—… ์•„์ดํ…œ ์•กํ„ฐ ๊ตฌํ˜„

  • FItemInstance ๋ฐ์ดํ„ฐ ๋ณด์œ  (StaticDataID, CreationServerTime)
  • Widget Component๋กœ "์ค๊ธฐ [E]" ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
  • Interact() ํ˜ธ์ถœ ์‹œ UTSInventoryMasterComponent::AddItem() ์—ฐ๋™
  • AddItem ์„ฑ๊ณต ์‹œ ์•กํ„ฐ Destroy <- ์ถ”ํ›„ ํ’€๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ • ์˜ˆ์ •
  • ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ํ…Œ์ŠคํŠธ ์™„๋ฃŒ

3. ์ปจํ…Œ์ด๋„ˆ ์•กํ„ฐ ๊ตฌํ˜„

  • UTSInventoryMasterComponent ๋ณด์œ 
  • "์—ด๊ธฐ [E]" ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
  • Interact() ํ˜ธ์ถœ ์‹œ PlayerController์˜ HUD์—์„œ ToggleContainer() ์‹คํ–‰

RunOnServer ํŒจํ„ด์œผ๋กœ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

๋ฌธ์ œ ์ƒํ™ฉ

Eํ‚ค ์ƒํ˜ธ์ž‘์šฉ ์‹œ ์‹คํ–‰ ์œ„์น˜๊ฐ€ ์•กํ„ฐ๋งˆ๋‹ค ๋‹ฌ๋ผ์•ผ ํ•˜๋Š” ๋ฌธ์ œ:

  • ํ”ฝ์—… ์•„์ดํ…œ: AddItem()์€ ์ธ๋ฒคํ† ๋ฆฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด๋ฏ€๋กœ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ํ•„์š”
  • ์ปจํ…Œ์ด๋„ˆ: HUD์˜ ToggleContainer()๋Š” UI ์กฐ์ž‘์ด๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰ ํ•„์š”

๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ๋Š” ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์„ ServerInteract RPC๋กœ ๋ณด๋‚ด๋ฉด ์ปจํ…Œ์ด๋„ˆ์—์„œ HUD๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: RunOnServer() ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜ ์ถ”๊ฐ€

1. ์ธํ„ฐํŽ˜์ด์Šค์— ์‹คํ–‰ ์œ„์น˜ ํŒ๋ณ„ ํ•จ์ˆ˜ ์ถ”๊ฐ€

// IInteractableInterface
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
bool RunOnServer();

2. ๊ฐ ์•กํ„ฐ์—์„œ ์‹คํ–‰ ์œ„์น˜ ๋ฐ˜ํ™˜

// ATSPickupItem - ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•จ
bool ATSPickupItem::RunOnServer_Implementation()
{
    return true;  // AddItem()์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰
}

// ATSContainerActor - ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•จ
bool ATSContainerActor::RunOnServer_Implementation()
{
    return false;  // ToggleContainer()๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰
}

3. ์บ๋ฆญํ„ฐ์—์„œ ์‹คํ–‰ ์œ„์น˜ ๋ถ„๊ธฐ

void ATSCharacter::OnInteract(const struct FInputActionValue& Value)
{
	UE_LOG(LogTemp, Log, TEXT("e pressed"));

	if (!IsValid(CurrentHitActor.Get()))
	{
		return;
	}
	if (CurrentHitActor->Implements<UIInteraction>())
	{
		IIInteraction* InteractionInterface = Cast<IIInteraction>(CurrentHitActor);
		if (InteractionInterface && InteractionInterface->CanInteract(this))
		{
			if (InteractionInterface->RunOnServer())
			{
				ServerInteract(CurrentHitActor.Get());
			}
			else
			{
				InteractionInterface->Interact(this);
			}
		}
	}
}

ํŒจํ„ด์˜ ์žฅ์ 

  • โœ… ํ™•์žฅ์„ฑ: ์ƒˆ๋กœ์šด ์•กํ„ฐ ์ถ”๊ฐ€ ์‹œ RunOnServer()๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์—์„œ ์‹คํ–‰
  • โœ… ๋ช…ํ™•์„ฑ: ๊ฐ ์•กํ„ฐ๊ฐ€ ์ž์‹ ์˜ ์‹คํ–‰ ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ
  • โœ… ์œ ์ง€๋ณด์ˆ˜์„ฑ: ์บ๋ฆญํ„ฐ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์•กํ„ฐ๋ณ„ ๋™์ž‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)

1. ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„์˜ ์œ ์—ฐ์„ฑ

  • RunOnServer() ํ•จ์ˆ˜ ํ•˜๋‚˜ ์ถ”๊ฐ€๋กœ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰ ๋ถ„๊ธฐ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๊ฐ ์•กํ„ฐ๊ฐ€ ์ž์‹ ์˜ ์‹คํ–‰ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์— ๋ถ€ํ•ฉํ•˜๊ณ  ํ™•์žฅ์„ฑ๋„ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

2. ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๋ณต์žก์„ฑ

  • ๊ฐ™์€ Eํ‚ค ์ž…๋ ฅ์ด๋ผ๋„ ์•กํ„ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์ค‘ ์–ด๋””์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ด ํฅ๋ฏธ๋กœ์› ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ˆ˜์ •์€ ์„œ๋ฒ„, UI ์กฐ์ž‘์€ ํด๋ผ์ด์–ธํŠธ๋ผ๋Š” ๊ธฐ๋ณธ ์›์น™์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

3. ํŒ€ ์ž‘์—…์˜ ํšจ์œจ์„ฑ

  • ํŒ€์›์ด ๊ตฌํ˜„ํ•œ ๋ผ์ธํŠธ๋ ˆ์ด์Šค ์‹œ์Šคํ…œ ์œ„์— ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜‘์—…์ด ์ž˜ ์ด๋ฃจ์–ด์กŒ๋‹ค.
  • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ˜‘์—… ์‹œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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