Interaction SDK - 2024-Adoor/practice GitHub Wiki

Comprehensive Rig - ISDK๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฒ„์ „์˜ Rig?

๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, OVRCameraRigInteraction๋Š” ์นด๋ฉ”๋ผ ๋ฆฌ๊ทธ์™€ OVRInteractionComprehensive๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฉฐ ๊ถŒ์žฅ๋˜๋Š” ์˜ต์…˜์ด๊ณ , ๋‚˜๋จธ์ง€ OVRInteractionComprehensive๋Š” ์ด๋ฏธ ์นด๋ฉ”๋ผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

Controllers as Hands

๐Ÿ”— ์ด ๋ถ€๋ถ„์€ Set up Controllers as Hands๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์†(controllers as hands๋ผ๊ณ ๋„ ํ•จ) ์—ญํ• ์„ ํ•˜๋„๋ก ์›ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด ์„น์…˜์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์† ์—ญํ• ์„ ํ•˜๋ฉด ์•ฑ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์†์œผ๋กœ โ€‹โ€‹ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์˜ ๋ชฐ์ž…๋„ ํ–ฅ์ƒ๊ณผ ์ง„๋™ ๋ฐ ๋ฌผ๋ฆฌ์  ํ”ผ๋“œ๋ฐฑ๊ณผ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ด์ ์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋กœ์ ํŠธ์—์„œ OVRControllerHands๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”.
  2. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ OVRControllerHands ํ”„๋ฆฌํŒน์„ ๊ณ„์ธต ๊ตฌ์กฐ์˜ OVRInteraction์œผ๋กœ ๋“œ๋ž˜๊ทธํ•ฉ๋‹ˆ๋‹ค.

(OVRInteraction์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ๋ชปํ•จ.) OVRCameraRigInteraction > OVRCameraRig > OVRInteractionComprehensive๋ฅผ ์ง€์นญํ•˜๋Š” ๋“ฏํ•จ

QuickActions๋กœ ์ธํ„ฐ๋ž™์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

Add an Interaction with QuickActions

QuickActions๋Š” ์”ฌ์— ์ผ๋ถ€ ์ธํ„ฐ๋ž™์…˜์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” v62 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์กด ์”ฌ ์˜ค๋ธŒ์ ํŠธ์™€ ์นด๋ฉ”๋ผ ๋ฆฌ๊ทธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ ๋งˆ๋ฒ•์‚ฌ ์„ธํŠธ์˜ ํ˜•ํƒœ๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. QuickActions๋Š” ํ”„๋กœ์ ํŠธ์— ์ธํ„ฐ๋ž™์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ QuickActions๋Š” ์žก๊ธฐgrab, ๋ฉ€๋ฆฌ ์žก๊ธฐdistance grab, ๊ด‘์„ ray, ๋ˆ„๋ฅด๊ธฐpoke ์ธํ„ฐ๋ž™์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธํ„ฐ๋ž™์…˜์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์‚ฌ์ด๋“œ๋ฐ”์˜ ํŠœํ† ๋ฆฌ์–ผ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•ด๋‹น ์ธํ„ฐ๋ž™์…˜์— ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์นด๋ฉ”๋ผ ๋ฆฌ๊ทธ์™€ GameObject์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ GameObject๋“ค.

์•„ํ‚คํ…์ณ

https://developer.oculus.com/documentation/unity/unity-isdk-architectural-overview/

์ด ์ฃผ์ œ์—์„œ๋Š” Interaction SDK๊ฐ€ ํŠธ๋ž˜ํ‚น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ตฌ์กฐํ™”ํ•˜๊ณ , ์ˆ˜์ •ํ•˜์—ฌ ์ธํ„ฐ๋ž™์…˜์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Interaction SDK์—์„œ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์€ ํ—ค๋“œ์…‹์˜ ์นด๋ฉ”๋ผ์™€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋Š” ํ—ค๋“œ์…‹์˜ ์†๊ณผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์œ„์น˜ ๋ฐ ํšŒ์ „์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

FromOVR...DataSource ์ปดํฌ๋„ŒํŠธ์—์„œ raw ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (...์—๋Š” Body, Controller, Controller Hand, Hand, HMD๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ)

raw ๋ฐ์ดํ„ฐ๋Š” ๊ฐ ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” FromOVR...Source ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ•จ. ์ธํ„ฐํŽ˜์ด์Šค๋Š” IController, IHand, IHmd, IBody๊ฐ€ ์žˆ์Œ

  • Interactor: ์†์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ถ€์ฐฉ๋˜์–ด ํŠน์ • ์ธํ„ฐ๋ž™์…˜(์žก๊ธฐ, ์ฐŒ๋ฅด๊ธฐ ๋“ฑ)์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ
  • Interatable: ์ธํ„ฐ๋ž™์…˜์„ ๋ฐ›๋Š” ์˜ค๋ธŒ์ ํŠธ(์˜ˆ: ์žก์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ์ฒด)

Interactor๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›”๋“œ ๊ณต๊ฐ„์—์„œ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ทผ์ฒ˜์˜, ๊ฐ™์€ ์ธํ„ฐ๋ž™์…˜์„ ๋‹ด๋‹น(์˜ˆ: Ray Interactor๋ฉด Ray Interactable)ํ•˜๋Š” Interactable์„ ComputeCandidate() ๋ฉ”์„œ๋“œ๋กœ ์ฐพ์•„์„œ ์„ ํƒํ•จ. IInteractor์˜ Drive() ๋ฉ”์„œ๋“œ๊ฐ€ ComputeCandidate()๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์‹œ์ , ์„ ํƒ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์‹œ์ , ์„ ํƒ ์ค‘์— ํ•ด์•ผ ํ•  ์ž‘์—… ๋“ฑ๋“ฑ์„ ๊ฒฐ์ •ํ•จ

Interactor์™€ Interactable์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
Disabled <-> Normal <-> Hover <-> Select

FromOVR...Source ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด Interactor์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ํ•˜์ง€๋งŒ ์† ๋ฐ์ดํ„ฐ๋Š” Interactor๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ์ „์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์† ๋ฐ์ดํ„ฐ์— ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ:

  • ํ”๋“ค๋ฆผ์„ ์ค„์ด๊ฑฐ๋‚˜ ์ตœ์†Œํ™”.
  • ๊ฐ€์ƒ ๋ฌผ์ฒด๋ฅผ ์ง‘์„ ๋•Œ ์†๊ฐ€๋ฝ์˜ ์œ„์น˜๋ฅผ ์‹ค์ œ ์†๊ฐ€๋ฝ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ
    (์‹ค์ œ ์†์€ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์žก๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  VR์—์„œ ๋ฌผ์ฒด๋ฅผ ๋šซ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ)
  • ์‹ค์ œ ์†์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ๋Œ€์‹  ๊ฐ€์ƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ray interactor์˜ ์›์ ์„ ์˜คํ”„์…‹

์† ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

HandFilter๊ฐ™์€ IHand ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„˜๊ธฐ๊ณ  ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ FromOVR...Source ๋Œ€์‹  Interactor์—๊ฒŒ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ

HandRef, ControllerRef

HandRef๋Š” IHand ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๊ฒฝ์œ  ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธํ„ฐ๋ž™ํ„ฐ ํ”„๋ฆฌํŒน์˜ ๋ฃจํŠธ GameObject๋Š” ๋ฃจํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก HandRef ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ์ž‘์—…์˜ ์ฃผ์š” ์ด์ ์€ ์ธํ„ฐ๋ž™์…˜ ํ”„๋ฆฌํŒน์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์”ฌ ๋ฐฐ์„ ์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. OVRInput ํ”„๋ฆฌํŒน์˜ ์†์„ ์ธํ„ฐ๋ž™์…˜ ํ”„๋ฆฌํŒน์—์„œ ํ•„์š”ํ•œ ๊ฐ ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  ํ”„๋ฆฌํŒน์˜ ์ตœ์ƒ์œ„ HandRef์— ๋‹จ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋งŒ ์„ค์ •ํ•˜๋ฉด ๋˜๋ฉฐ ํ”„๋ฆฌํŒน์˜ ๋ชจ๋“  ํ•˜์œ„ ๊ฐœ์ฒด๋Š” ํ•ด๋‹น HandRef๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

ControllerRef๋„ ์œ„์™€ ๋น„์Šทํ•˜๋‹ค

Modifiers

๋ฐ์ดํ„ฐ๋Š” OVRPlugin์—์„œ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด Controller ๋ฐ Hand์™€ ๊ฐ™์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ, ์ด๋“ค ๋ชจ๋‘๋Š” ์ œ๋„ค๋ฆญ ๋ฒ ์ด์Šค ํด๋ž˜์Šค์ธ DataSource์„ ํ†ตํ•ด IDataSource ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

IDataSource.InputDataAvailable: ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•„๋“œ๋กœ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ํŠธ๋ž˜ํ‚น&์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ข…์†์„ฑ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

DataSource ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ์ง€์ •๋œ ํƒ€์ž…(์˜ˆ: HandDataAsset)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DataModifier(์ž์ฒด๋Š” DataSource์—์„œ ํŒŒ์ƒ๋จ)๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, HandDataAsset์—์„œ ํ›„์ฒ˜๋ฆฌ๊ธฐ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. DataModifier๋Š” DataSource์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•œ ๋‹ค์Œ IDataSource ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

LastKnownGoodHand

LastKnownGoodHand๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์•Œ๋ ค์ง„ ์–‘ํ˜ธํ•œ ํ•ธ๋“œ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •์ž ์ฒด์ธ ์•„๋ž˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ธ‰๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ๋“  ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ(์ถ”์  ์†์‹ค, ๋‚ฎ์€ ์ถ”์  ํ’ˆ์งˆ) ๋งˆ์ง€๋ง‰์œผ๋กœ ์œ ํšจํ•œ ํ•ธ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ•ธ๋“œ ํŠธ๋ž˜ํ‚นํ•˜๋Š” ์ƒ˜ํ”Œ์—์„œ ๋ดค์„ ๋•Œ๋Š” ์†์„ ํ€˜์ŠคํŠธ ์นด๋ฉ”๋ผ ๋ฐ–์œผ๋กœ ์›€์ง์ด๊ฑฐ๋‚˜ ์นด๋ฉ”๋ผ์— ๊ฐ€๊นŒ์ด ๋Œ€๋ฉด ์†์ด ๋ป—์€ ์ž์„ธ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋˜๋ฐ ๊ทธ๋Ÿฐ๊ฑฐ ๋ง‰์„ ๋•Œ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทผ๋ฐ ์ด๊ฒŒ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์ธ์ง€ ๋ญ”์ง€...

SyntheticHand

์†์˜ ๊ด€์ ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์กฐ์ ˆ

์†๊ฐ€๋ฝ์ด ๋ฌผ์ฒด๋ฅผ ์žก๋Š” ๋ฐฉ์‹์ด๋‚˜ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ๋ชจ๋ธ์„ ํŠ€์–ด๋‚˜๊ฐ€์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์ฐŒ๋ฅด๊ธฐ ์ œํ•œ(poke limiting)์— ์‚ฌ์šฉ

InteractorVisual์ด๋ž€ ๊ฒƒ์ด ์ด๊ฑธ ์‚ฌ์šฉํ•ด์„œ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ํ•œ๋ฒˆ์— ์กฐ์ ˆํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ InteractorGroup์ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ๋“ฏํ•จ

Interactor Interactable Lifecycle

๐Ÿ”— ์ด ๋ถ€๋ถ„์€ Interactor Interactable Lifecycle๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Interactor์™€ Interactable์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Active State๋“ค

Interactor Interactable
Disabled Interactor๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ, ํ˜ธ๋ฒ„๋‚˜ ์„ ํƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ Interactable์ด ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ, ํ˜ธ๋ฒ„๋‚˜ ์„ ํƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
Normal ๊ธฐ๋ณธ ์ƒํƒœ ๊ธฐ๋ณธ ์ƒํƒœ
Hover Interactor๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ (์„ ํƒ์  Interactable์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ) Interactable์— ํ•˜๋‚˜ ์ด์ƒ์˜ Interactor๊ฐ€ ํ˜ธ๋ฒ„๋งํ•˜๊ณ  ์žˆ์œผ๋‚˜ ์„ ํƒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
Select Interactor๊ฐ€ ์„ ํƒ ์ค‘์ธ ์ƒํƒœ (์„ ํƒ์  Interactable์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ) Interactable์„ ์„ ํƒํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ Interactor๊ฐ€ ์žˆ๋Š” ์ƒํƒœ

Interactor Groups

๐Ÿ”— ์ด ๋ถ€๋ถ„์€ InteractorGroups๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

BestHoverInteractorGroup

๊ธฐ๋ณธ InteractorGroup. ์„ ํƒ ์ž‘์šฉ์ด ์žˆ๊ธฐ ์ „๊นŒ์ง€, ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ Interactor๊ฐ€ ํ˜ธ๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ํ•œ, ํ˜„์žฌ ํ˜ธ๋ฒ„๋ง ์ค‘์ธ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ IInteractor๋ฅผ ํ™œ์„ฑ IInteractor๋กœ ์œ ์ง€

์„ ํƒ ์ž‘์šฉ์ด ์žˆ๋‹ค๋ฉด, ์„ ํƒํ•˜๋Š” IInteractor๋Š” ์„ ํƒ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

ICandidateComparer๋ฅผ IInteractor์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ์— ์“ธ ์ˆ˜ ์žˆ๋‹ค.

BestSelectInteractorGroup

Select ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ IInteractor๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ.

InteractorGroup*๊ณผ ๋‹ฌ๋ฆฌ ์„ ํƒ ์ž‘์šฉ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์—ฌ๋Ÿฌ IInteractor๊ฐ€ Hover ์ƒํƒœ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ ์ž‘์šฉ์ด ์žˆ๋‹ค๋ฉด, ์„ ํƒํ•˜๋Š” IInteractor๋Š” ์„ ํƒ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

*(InteractorGroup ์ด๊ฑฐ๋Š” ์ž˜๋ชป ์ž…๋ ฅ๋˜์—ˆ๊ฑฐ๋‚˜ ์•ž์ด ์งค๋ฆฐ๊ฑฐ ๊ฐ™์€ ๋ฐ ๋ญํ•˜๊ณ  ๋‹ค๋ฅด๋‹ค๋Š” ๊ฑธ๊นŒ์š”...)

FirstHoverInteractorGroup

๊ฐ€์žฅ ์ฒ˜์Œ ํ˜ธ๋ฒ„๋ง์„ ์‹œ์ž‘ํ•œ IInteractor๋งŒ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์—ฌ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ IInteractor๊ฐ€ Hover ์ƒํƒœ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋‘ ๊ฐœ์˜ IInteractor๊ฐ€ ๋™์‹œ์— ํ˜ธ๋ฒ„ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด? :๋ฆฌ์ŠคํŠธ ์ˆœ์„œ ๋˜๋Š” ICandidateComparer๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ

ICandidateComparer

๊ธฐ๋ณธ์ ์œผ๋กœ InteractorGroups๋Š” ๋ฆฌ์ŠคํŠธ ์ธ๋ฑ์Šค ์ˆœ์„œ(์ฒซ ๋ฒˆ์งธ = ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„)์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋œ๋‹ค.

ICandidateComparer๋ฅผ ์ง€์ •ํ•ด์„œ CandidateProperties์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ IInteractor์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฐ”๊พธ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, CandidateProperties๋ฅผ ICandidatePosition์œผ๋กœ ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” IInteractor์˜ ๊ฒฝ์šฐ CandidatePositionComparer๋ผ๋Š” ๊ฒƒ์€ ๊ณตํ†ต ์œ„์น˜๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋กœ ์ธก์ •๋œ ํ›„๋ณด ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ IInteractor์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฑฐ๋Š” ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์Šจ ์†Œ๋ฆฌ๋ฅผ ํ•˜๋Š” ์ง€ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ