[TIL] 251117

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

โœ๏ธToday I Learned

๐Ÿ“… 2025-11-17

  • OnPreviewMouseButtonDown vs OnMouseButtonDown ์ฐจ์ด์ 
  • ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ์—์„œ ์ขŒํด๋ฆญ/์šฐํด๋ฆญ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
  • DragDropOperation์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๋Š” ํŒจํ„ด
  • ์–ธ๋ฆฌ์–ผ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ์ˆœ์„œ (Tunneling vs Bubbling)

OnPreviewMouseButtonDown vs OnMouseButtonDown ์ฐจ์ด์ 

์–ธ๋ฆฌ์–ผ ์—”์ง„์˜ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋Š” ๋‘ ๋‹จ๊ณ„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค:

1. Tunneling ๋‹จ๊ณ„ (Preview)

OnPreviewMouseButtonDown
- ๋ถ€๋ชจ โ†’ ์ž์‹ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ โฌ‡๏ธ
- ์›๋ณธ ์ด๋ฒคํŠธ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ›์Œ
- Get Effecting Button์ด ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•จ

2. Bubbling ๋‹จ๊ณ„ (์ผ๋ฐ˜)

OnMouseButtonDown
- ์ž์‹ โ†’ ๋ถ€๋ชจ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ โฌ†๏ธ
- ์ž์‹ ์œ„์ ฏ์ด ์ด๋ฒคํŠธ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌ
- ์ด๋ฒคํŠธ ์ •๋ณด๊ฐ€ ๋ณ€ํ˜•๋˜๊ฑฐ๋‚˜ ์†์ƒ๋  ์ˆ˜ ์žˆ์Œ

์‹ค์ œ ๋ฌธ์ œ ์ƒํ™ฉ

Button (๋˜๋Š” Canvas Panel)
โ”œโ”€ Image
โ””โ”€ TextBlock
  • OnMouseButtonDown ์‚ฌ์šฉ: Image/TextBlock์ด ๋จผ์ € ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ๋ณ€ํ˜• โ†’ ๋ถ€๋ชจ๊ฐ€ ๋ฐ›์„ ๋•Œ๋Š” ๋ฒ„ํŠผ ์ •๋ณด ์†์ƒ
  • OnPreviewMouseButtonDown ์‚ฌ์šฉ: ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์›๋ณธ ์ด๋ฒคํŠธ ๋ฐ›์Œ โ†’ ๋ฒ„ํŠผ ์ •๋ณด ์ •ํ™•ํ•จ โœ…

๊ฒฐ๋ก : ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ ๊ตฌํ˜„ ์‹œ OnPreviewMouseButtonDown์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์œ„์ ฏ ํƒ€์ž…(Button, Canvas Panel ๋“ฑ)๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž์‹ ์œ„์ ฏ์ด ์žˆ์œผ๋ฉด Preview๋ฅผ ์จ์•ผ ํ•œ๋‹ค.


๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ์—์„œ ์ขŒํด๋ฆญ/์šฐํด๋ฆญ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

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

  • ์ขŒํด๋ฆญ ๋“œ๋ž˜๊ทธ: ์•„์ดํ…œ ์ „์ฒด ์ด๋™ (bIsFullStack = true)
  • ์šฐํด๋ฆญ ๋“œ๋ž˜๊ทธ: ์•„์ดํ…œ 1๊ฐœ๋งŒ ์ด๋™ (bIsFullStack = false)

์ž˜๋ชป๋œ ์ ‘๊ทผ โŒ

OnMouseButtonDown์˜ ๋ฐ˜ํ™˜๊ฐ’(true/false)์ด
โ†’ OnDragDetected๋‚˜ OnDrop์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ์ƒ๊ฐ

โ†’ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค! ๊ฐ ์ด๋ฒคํŠธ์˜ FPointerEvent ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•จ.

์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ โœ…

1๋‹จ๊ณ„: ๋ฒ„ํŠผ ์ •๋ณด ์บ์‹ฑ

OnPreviewMouseButtonDown:
  Mouse Event โ†’ Get Effecting Button
    โ†’ Set CachedMouseButton (์œ„์ ฏ ๋ณ€์ˆ˜์— ์ €์žฅ)
    โ†’ Branch (Left or Right?)
       True: Detect Drag ๋ฐ˜ํ™˜
       False: Unhandled ๋ฐ˜ํ™˜

2๋‹จ๊ณ„: DragOperation์— ์ •๋ณด ์ €์žฅ

OnDragDetected:
  CachedMouseButton ์‚ฌ์šฉ
    โ†’ Branch (Left?)
       True: 
         - bIsFullStack = true
         - TransferQuantity = CurrentStackSize
       False:
         - bIsFullStack = false
         - TransferQuantity = 1
    โ†’ DragOperation ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜

3๋‹จ๊ณ„: OnDrop์—์„œ ์‚ฌ์šฉ

OnDrop:
  DragOperation โ†’ bIsFullStack ์ฝ๊ธฐ
    โ†’ ServerTransferItem(..., bIsFullStack)

DragDropOperation์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๋Š” ํŒจํ„ด

ํ•ต์‹ฌ ์›์น™

๋ฒ„ํŠผ ํ™•์ธ์€ ํ•œ ๋ฒˆ๋งŒ, ์ €์žฅํ•ด์„œ ์žฌ์‚ฌ์šฉ

๊ตฌ์กฐ

UCLASS()
class UMyDragDropOperation : public UDragDropOperation
{
    UPROPERTY(BlueprintReadWrite)
    bool bIsFullStack;
    
    UPROPERTY(BlueprintReadWrite)
    int32 TransferQuantity;
};

์žฅ์ 

  1. ์ค‘๋ณต ํ™•์ธ ์ œ๊ฑฐ: OnDragDetected์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ™•์ธ
  2. ๋“œ๋ž˜๊ทธ ๋น„์ฃผ์–ผ: TransferQuantity๋กœ ๊ฐœ์ˆ˜ ํ‘œ์‹œ ๊ฐ€๋Šฅ
  3. OnDrop ๊ฐ„์†Œํ™”: ์ €์žฅ๋œ ๊ฐ’๋งŒ ์ฝ์œผ๋ฉด ๋จ

ํ๋ฆ„

OnPreviewMouseButtonDown (๋ฒ„ํŠผ ํ™•์ธ ๋ฐ ์บ์‹ฑ)
    โ†“
OnDragDetected (DragOperation์— ๋ฐ์ดํ„ฐ ์ €์žฅ)
    โ†“
OnDrop (์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ)

์ถ”๊ฐ€ ํ•™์Šต ๋‚ด์šฉ

OnMouseButtonDown ๋ฐ˜ํ™˜๊ฐ’์˜ ์˜๋ฏธ

  • Detect Drag: ๋“œ๋ž˜๊ทธ ๊ฐ์ง€ ์‹œ์ž‘ (๊ฐ€์žฅ ์ผ๋ฐ˜์ )
  • Handled: ์ด๋ฒคํŠธ๋งŒ ์†Œ๋น„, ๋“œ๋ž˜๊ทธ ์•ˆ ํ•จ
  • Unhandled: ์ด๋ฒคํŠธ ๋ฌด์‹œ, ๋ถ€๋ชจ๋กœ ์ „ํŒŒ

OnDragDetected์˜ ๋ฒ„๊ทธ

OnDragDetected์˜ Pointer Event์—์„œ Get Effecting Button โ†’ None ๋ฐ˜ํ™˜

  • ๋“œ๋ž˜๊ทธ ๊ฐ์ง€ ํ›„ ์‹œ์ ์ด๋ผ ์›๋ณธ ๋ฒ„ํŠผ ์ •๋ณด ์†์‹ค
  • ํ•ด๊ฒฐ์ฑ…: OnPreviewMouseButtonDown์—์„œ ๋ฏธ๋ฆฌ ์บ์‹ฑ

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

์–ธ๋ฆฌ์–ผ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์ด ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ OnMouseButtonDown์—์„œ ๋ฐ˜ํ™˜๊ฐ’์„ ์กฐ์ž‘ํ•˜๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š”:

  1. ์ด๋ฒคํŠธ ์ „ํŒŒ ์ˆœ์„œ (Preview โ†’ Normal)
  2. ์ž์‹/๋ถ€๋ชจ ์œ„์ ฏ ๊ฐ„ ์ด๋ฒคํŠธ ํ๋ฆ„
  3. ๊ฐ ์ด๋ฒคํŠธ ํ•จ์ˆ˜์˜ Pointer Event ๋…๋ฆฝ์„ฑ

์ด ๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํŠนํžˆ OnPreviewMouseButtonDown์˜ ์กด์žฌ๋ฅผ ๋ชฐ๋ž๋‹ค๋ฉด ๊ณ„์† ์‚ฝ์งˆํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์œ„์ ฏ ์•ˆ์— Image๋‚˜ TextBlock ๊ฐ™์€ ์ž์‹ ์œ„์ ฏ์ด ์žˆ์œผ๋ฉด ์ด๋“ค์ด ์ด๋ฒคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„์„œ ๋ฒ„ํŠผ ์ •๋ณด๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค๋Š” ๊ฒƒ๋„ ์ง์ ‘ ๊ฒช์ง€ ์•Š์•˜์œผ๋ฉด ์ƒ์ƒ๋„ ๋ชปํ–ˆ์„ ๋ฌธ์ œ๋‹ค.

๊ฒฐ๊ตญ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฐฐ์› ๋‹ค. ํ‘œ๋ฉด์ ์ธ ์‚ฌ์šฉ๋ฒ•๋งŒ ์•„๋Š” ๊ฒƒ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋ฅผ ์ฒด๊ฐํ–ˆ๋‹ค.

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