[TIL] 251113

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

โœ๏ธToday I Learned

๐Ÿ“… 2025-11-13

  • ์–ธ๋ฆฌ์–ผ ๋„คํŠธ์›Œํฌ ๋ณต์ œ: Actor ์ด๋ฆ„์€ ์›”๋“œ๋ณ„๋กœ ๋…๋ฆฝ์ ์ด๋‹ค
  • ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€ ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ๋ณต์ œ ์กฐ๊ฑด

์–ธ๋ฆฌ์–ผ ๋„คํŠธ์›Œํฌ ๋ณต์ œ: Actor ์ด๋ฆ„์€ ์›”๋“œ๋ณ„๋กœ ๋…๋ฆฝ์ ์ด๋‹ค

๐Ÿค” ๋ฌธ์ œ ์ƒํ™ฉ

๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ํ™˜๊ฒฝ์—์„œ Client๊ฐ€ BP_TSCharacter_C_0์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  "์–ด? Player 1์ธ๋ฐ ์™œ 0๋ฒˆ ์บ๋ฆญํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์ง€?"๋ผ๊ณ  ์ฐฉ๊ฐํ–ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ ๊ฐœ๋…

๊ฐ ์›”๋“œ(Server, Client)๋Š” ์ž์‹ ๋งŒ์˜ Actor ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋ฆ„์€ ๊ฐ ์›”๋“œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

Server ์›”๋“œ:
โ”œโ”€ BP_TSCharacter_C_0 (Server Player)
โ””โ”€ BP_TSCharacter_C_1 (Client Player)

Client ์›”๋“œ:
โ”œโ”€ BP_TSCharacter_C_0 (์ž์‹  = AutonomousProxy) โ† ์„œ๋ฒ„์˜ C_1๊ณผ ๋™๊ธฐํ™”!
โ””โ”€ BP_TSCharacter_C_1 (์„œ๋ฒ„ ๋ณต์ œ๋ณธ = SimulatedProxy)

Actor ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ Role ๊ฐ’์œผ๋กœ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค:

  • Role: ROLE_AutonomousProxy (2) = ๋‚ด๊ฐ€ ์ œ์–ดํ•˜๋Š” ์บ๋ฆญํ„ฐ
  • Role: ROLE_SimulatedProxy (1) = ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด์˜ ๋ณต์ œ๋ณธ
  • Role: ROLE_Authority (3) = ์„œ๋ฒ„

โœ… ๊ฒฐ๋ก 

  • Actor ์ด๋ฆ„(C_0, C_1)์€ ๊ฐ ์›”๋“œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋จ
  • "๊ฐ™์€ Player"๋ผ๋„ Server ์›”๋“œ์™€ Client ์›”๋“œ์—์„œ ์ด๋ฆ„์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
  • Role ๊ฐ’์ด ์ง„์‹ค! ์ด๋ฆ„๋งŒ ๋ณด๊ณ  ํŒ๋‹จํ•˜๋ฉด ์•ˆ ๋จ

๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€ ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ๋ณต์ œ ์กฐ๊ฑด

๐Ÿค” ๊ธฐ์กด ์ง€์‹

"๊ตฌ์กฐ์ฒด ์•ˆ์— ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๋‚ด๋ถ€ ๊ฐ’๋งŒ ๋ฐ”๊ฟจ์„ ๋•Œ ๋ณต์ œ ์•ˆ ๋˜๋‹ˆ๊นŒ ForceNetUpdate() ์จ์•ผ ํ•œ๋‹ค"

๐Ÿ’ก ์‹ค์ œ๋กœ๋Š”?

์ตœ์ƒ์œ„ ๋ณ€์ˆ˜์— ReplicatedUsing์„ ์„ ์–ธํ•˜๊ณ , ๋‚ด๋ถ€ ๊ฐ’๋“ค์„ UPROPERTY๋กœ ์ •์˜ํ•˜๋ฉด ์–ธ๋ฆฌ์–ผ์ด ์•Œ์•„์„œ ์ง๋ ฌํ™”ํ•ด์„œ ๋ณต์ œํ•ด์ค€๋‹ค!

// ๊ตฌ์กฐ์ฒด ์ •์˜
USTRUCT(BlueprintType)
struct FSlotStructMaster
{
    GENERATED_BODY()
    
    UPROPERTY()  // โœ… UPROPERTY๋งŒ ์žˆ์œผ๋ฉด ๋จ!
    int32 CurrentStackSize;
    
    UPROPERTY()
    FItemInstance ItemData;  // ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ๊ตฌ์กฐ์ฒด๋„ OK
};

// ์ปดํฌ๋„ŒํŠธ
UPROPERTY(ReplicatedUsing = OnRep_HotkeyInventory)  // โœ… ์ตœ์ƒ์œ„๋งŒ ์„ ์–ธ
FInventoryStructMaster HotkeyInventory;

๋‚ด๋ถ€ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด:

HotkeyInventory.InventorySlotContainer[0].CurrentStackSize = 10;
// โœ… ์ž๋™์œผ๋กœ OnRep_HotkeyInventory() ํ˜ธ์ถœ๋จ!
// ForceNetUpdate() ๋ถˆํ•„์š”!

โœ… ์กฐ๊ฑด

  1. ์ตœ์ƒ์œ„ ๋ณ€์ˆ˜์— ReplicatedUsing ์„ ์–ธ
  2. ๊ตฌ์กฐ์ฒด์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— UPROPERTY ๋งคํฌ๋กœ
  3. GetLifetimeReplicatedProps์— ๋“ฑ๋ก

โ†’ ์–ธ๋ฆฌ์–ผ์ด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ฐ ์ง๋ ฌํ™”!


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

๋„คํŠธ์›Œํฌ ๋ณต์ œ๋Š” "๋ˆˆ์— ๋ณด์ด๋Š” ๊ฒƒ"๊ณผ "์‹ค์ œ ๋™์ž‘"์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค. Actor ์ด๋ฆ„ ๊ฐ™์€ ํ‘œ๋ฉด์ ์ธ ์ •๋ณด์— ์†์ง€ ๋ง๊ณ , Role์ด๋‚˜ NetMode ๊ฐ™์€ ๋ณธ์งˆ์ ์ธ ๊ฐ’์„ ๋ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ธ๋ฆฌ์–ผ์˜ ๋ณต์ œ ์‹œ์Šคํ…œ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋˜‘๋˜‘ํ•ด์„œ, UPROPERTY๋งŒ ์ œ๋Œ€๋กœ ์„ ์–ธํ•˜๋ฉด ๋ณต์žกํ•œ ๊ตฌ์กฐ์ฒด๋„ ์•Œ์•„์„œ ์ง๋ ฌํ™”ํ•ด์ค€๋‹ค. ๋ถˆํ•„์š”ํ•œ ForceNetUpdate() ๋‚จ๋ฐœ์„ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

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