NetworkRigibody - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

๊ฐœ์š”

Physics Addon์—๋Š” ํด๋ผ์ด์–ธํŠธ ์˜ˆ์ธก ๋ฐ Rigidbody ๋ฐ Rigidbody2D ์ปดํฌ๋„ŒํŠธ์˜ ๋™๊ธฐํ™”์— ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ํฌํ•จ

  • NetworkRigidbody3D State Authority์—์„œ ๋‹ค๋ฅธ ํ”ผ์–ด(peer)๋กœ Rigidbody ์ƒํƒœ ๋™๊ธฐํ™”
  • NetworkRigidbody2D State Authority์—์„œ ๋‹ค๋ฅธ ํ”ผ์–ด๋กœ Rigidbody2D ์ƒํƒœ ๋™๊ธฐํ™”
  • RunnerPhysicsSimulate3D ์„ ํƒ์  ์ปดํฌ๋„ŒํŠธ๋กœ NetworkRunner GameObject์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Fusion ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฒ˜๋ฆฌ ์ง€์›
  • RunnerPhysicsSimulate2D ์„ ํƒ์  ์ปดํฌ๋„ŒํŠธ๋กœ NetworkRunner GameObject์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Fusion Physics2D ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฒ˜๋ฆฌ ์ง€์›

์‚ฌ์šฉ๋ฒ•

  1. Rigidbody ํ”„๋ฆฌํŒน(prefab) ๋˜๋Š” ์”ฌ ๊ฐ์ฒด์— NetworkRigidbody3D(๋˜๋Š” 2D์šฉ NetworkRigidbody2D)์™€ NetworkObject ์ถ”๊ฐ€
  • ์ด ์ปดํฌ๋„ŒํŠธ๋Š” State Authority์—์„œ ๋‹ค๋ฅธ ํ”ผ์–ด๋กœ Rigidbody ์ƒํƒœ ๋ณต์ œ
  • ํด๋ผ์ด์–ธํŠธ ์˜ˆ์ธก ์žฌ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด Rigidbody ๋ฆฌ์…‹/์กฐ์ •
  1. RunnerSimulatePhysics3D(๋˜๋Š” ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ 2D)๋ฅผ NetworkRunner ํ”„๋ฆฌํŒน์— ์ถ”๊ฐ€
  • ์ปดํฌ๋„ŒํŠธ๋Š” Unity์˜ Physics.Simulate() ํ˜ธ์ถœ ์ฒ˜๋ฆฌ
  1. ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜/์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋Š” FixedUpdateNetwork() ๋‚ด์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ž‘์„ฑ

ํ™•์žฅ / ์ˆ˜์ •

  • NetworkRigidbody์™€ RunnerSimulatePhysics ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๋„๋ก ์„ค๊ณ„
  • ํ”„๋กœ์ ํŠธ์˜ ํŠน์ • ์š”๊ตฌ์— ๋งž๊ฒŒ ์ˆ˜์ • ๊ฐ€๋Šฅ (ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๋ฉค๋ฒ„๋Š” ๊ฐ€์ƒ(vritual)์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ)
    • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ž์ฒด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ˆ˜์ •
    • Fusion์˜ ํ•ต์‹ฌ ๋‚ด๋ถ€๋Š” ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(์ผ๋ถ€ ์ƒ˜ํ”Œ ๋ฐ ๋ฐ๋ชจ๋Š” ์ œ์™ธ), ํ•„์š”์— ๋”ฐ๋ผ ์ˆ˜์ • ๊ฐ€๋Šฅ

NetworkRigidbody2D / NetworkRigidbody3D

NetworkRigidbody3D์™€ NetworkRigidbody2D๋Š” NetworkTRSP ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ๋ชจ๋“  AOI(๊ด€์‹ฌ ์˜์—ญ) ์ฒ˜๋ฆฌ ํฌํ•จ

1. ๋™๊ธฐํ™” ์Šค์ผ€์ผ(Sync Scale)

ํ™œ์„ฑํ™”ํ•˜๋ฉด transform.localScale ๋™๊ธฐํ™”

2. ๋™๊ธฐํ™” ๋ถ€๋ชจ(Sync Parent)

ํ™œ์„ฑํ™”ํ•˜๋ฉด transform.parent ๋™๊ธฐํ™”

  • ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” Rigidbody๋Š” ์šด๋™ํ•™์ (kinematic)์œผ๋กœ ์„ค์ •
  • ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” Rigidbody๋Š” ์ž๋™์œผ๋กœ ๊ฐ์ฒด์˜ AreaOfInterest Override๋ฅผ ๋ถ€๋ชจ Network Object๋กœ ์„ค์ •

๋ถ€๋ชจ ๊ด€๋ จ ์ฃผ์˜์‚ฌํ•ญ

  • ๋ถ€๋ชจ ๋ณ€ํ™˜์€ NetworkBehaviour ์ปดํฌ๋„ŒํŠธ ๋ณด์œ (NetworkBehaviourId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ๋ฅผ ์‹๋ณ„)
  • NetworkRigidbody๋Š” Network Object์˜ ๋ฃจํŠธ์—(์ผ๋ฐ˜์ )
  • ๋ถ€๋ชจ ๋ณ€ํ™˜์€ Network Object์˜ ์ž์‹ ๋ณ€ํ™˜์ผ ์ˆ˜ ์žˆ์Œ

3. ๋ณด๊ฐ„ ๋Œ€์ƒ(Interpolation Target)

Interpolation Target Render() ๋™์•ˆ interpolation์„ ์œ„ํ•ด ์ด๋™ํ•  transform (์ผ๋ฐ˜์ ์œผ๋กœ Collider๊ฐ€ ์—†๋Š” Rigidbody์˜ ์ž์‹ transform)

  • ๊ถŒ์žฅ null์ธ ๊ฒฝ์šฐ,

    • Network Rigidbody์˜ ๋ฃจํŠธ๊ฐ€ interpolation์„ ์œ„ํ•ด ์ด๋™
    • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„์˜ ์‹œ์ž‘ ์‹œ Tick ์ •ํ™• ์œ„์น˜๋กœ ๋ณต๊ท€
    • ๋ณด๊ฐ„ ๋Œ€์ƒ์„ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๋ณด๊ฐ„ ๋Œ€์ƒ(not null)์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

    • ์šด๋™ํ•™์  Rigidbody๋ฅผ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด MovePosition()์„ ์‚ฌ์šฉํ•  ๋•Œ
      • ๋ณด๊ฐ„ ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด transform.position ๋ฐ ํšŒ์ „์„ ์„ค์ •ํ•˜์—ฌ ๋ณด๊ฐ„ ์ž‘๋™
      • ์ง์ ‘์ ์ธ ๋ณ€ํ™˜ ๋ณ€๊ฒฝ์€ Rigidbody์— ๋Œ€ํ•œ MovePosition() ํ˜ธ์ถœ ๋ฌด์‹œ
    • ๋ณด๊ฐ„์ด ๋ฌผ๋ฆฌํ•™์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•  ๊ฒฝ์šฐ
      • ์ง์ ‘์ ์œผ๋กœ ๋ณ€ํ™˜์„ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋ฌผ๋ฆฌํ•™์˜ static friction๊ณผ sleep ํŒŒ๊ดด ๊ฐ€๋Šฅ
      • Render Sleep Thresholds๊ฐ€ ์ด๋ฅผ ์™„ํ™”ํ•˜์ง€๋งŒ, ๊ฐ„์„ญ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

์Šค์ผ€์ผ๊ณผ ๋ถ€๋ชจ ์„ค์ •์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ, ๋ณด๊ฐ„ ๋Œ€์ƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GameObject์˜ ์Šค์ผ€์ผ์€ ๋ถ€๋ชจ์˜ ์Šค์ผ€์ผ์— ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฑฐ์˜ ๋ณต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •ํ™•ํ•œ ์Šค์ผ€์ผ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋ณด๊ฐ„ ๋Œ€์ƒ์„ null๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์นด๋ฉ”๋ผ๊ฐ€ ๋ณด๊ฐ„ ๋Œ€์ƒ์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ๊ฐ€ ๋ณด๊ฐ„ ๋Œ€์ƒ์„ ๋”ฐ๋ผ๊ฐ€์•ผ ์นด๋ฉ”๋ผ๋„ ๋ณด๊ฐ„๋ฉ๋‹ˆ๋‹ค.

4. ์Šฌ๋ฆฝ ์ž„๊ณ„๊ฐ’(Sleep Thresholds)

  • ํ™œ์„ฑํ™”๋˜๋ฉด ๋ฃจํŠธ ๋ณ€ํ™˜์˜ ๋ณด๊ฐ„์ด ํ˜„์žฌ ๋ณ€ํ™˜ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ชจ๋“  ํ‘œ์‹œ๋œ ์ž„๊ณ„๊ฐ’ ๊ฐ’๋ณด๋‹ค ๋‚ฎ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
    • ๋ฃจํŠธ ๋ณ€ํ™˜์„ ์ด๋™์‹œํ‚ค๋Š” ํšจ๊ณผ ์™„ํ™” / ์ˆ˜๋ฉด ๋ฐฉ์ง€
    • ์„œ๋ฒ„ ๊ถŒํ•œ ์ธ์Šคํ„ด์Šค์—์„œ ์ˆ˜๋ฉด์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๋Š” ๋ฐ ์ค‘์š”

์ฃผ์˜: ์Šฌ๋ฆฝ ์ž„๊ณ„๊ฐ’์€ Interpolation Target์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

5. ๋ Œ๋” ์ž„๊ณ„๊ฐ’(Render Thresholds)

  • ์—๋„ˆ์ง€ ์‚ฌ์šฉ(Use Energy) Rigidbody์˜ ์†๋„์™€ ๊ฐ์†๋„์˜ ์—๋„ˆ์ง€ ์ˆ˜์ค€์ด ์Šฌ๋ฆฝ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ, ๊ทธ๋ ‡๋‹ค๋ฉด ๋ณด๊ฐ„ ๋ฐœ์ƒ
  • ์œ„์น˜(Position) ๋ณด๊ฐ„์ด ํ˜„์žฌ ๋ณ€ํ™˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์œ„์น˜ ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ฌ ๊ฒฝ์šฐ, ์ด ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋ณด๊ฐ„ ๋ฐœ์ƒ (0์ผ ๊ฒฝ์šฐ ์œ„์น˜๋Š” ํ…Œ์ŠคํŠธ ์ œ์™ธ)
  • ํšŒ์ „(Rotation) ๋ณด๊ฐ„์ด ํ˜„์žฌ ๋ณ€ํ™˜ ์ƒํƒœ์— ๋Œ€ํ•ด ํšŒ์ „ ๊ฐ๋„ ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ฌ ๊ฒฝ์šฐ, ์ด ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋ณด๊ฐ„ ๋ฐœ์ƒ (0์ผ ๊ฒฝ์šฐ ํšŒ์ „์€ ํ…Œ์ŠคํŠธ ์ œ์™ธ)
  • ์Šค์ผ€์ผ(Scale) ๋ณด๊ฐ„์ด ํ˜„์žฌ ๋ณ€ํ™˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์ง€์—ญ ์Šค์ผ€์ผ ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ฌ ๊ฒฝ์šฐ, ์ด ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋ณด๊ฐ„ ๋ฐœ์ƒ (0์ผ ๊ฒฝ์šฐ ์Šค์ผ€์ผ์€ ํ…Œ์ŠคํŠธ ์ œ์™ธ)

6. Teleport()

NetworkTransform.Teleport ์ฐธ์กฐ

7. MovingTeleport()

  • ์ด๋™ ํ…”๋ ˆํฌํŠธ ์‹œ์ž‘
  • FixedUpdateNetwork()์—์„œ RunnerSimulatePhysics3D์™€ RunnerSimulatePhysics2D๊ฐ€ ๋ฌผ๋ฆฌ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ
  • ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ›„์— ์ง€์—ฐ๋˜์–ด ์œ„์น˜ ๋ฐ ํšŒ์ „ ๊ฐ’ ์บก์ฒ˜ (ํ…”๋ ˆํฌํŠธ ์ „์˜ ๋ณด๊ฐ„์ด ์œ ํšจํ•œ ํ…”๋ ˆํฌํŠธ ๋Œ€์ƒ์ด ์žˆ๋„๋ก ๋ณด์žฅ)
  • Teleport()์˜ ๋Œ€์•ˆ์œผ๋กœ, ํ•˜๋‚˜์˜ Tick ๋™์•ˆ Interpolation ์ •์ง€

RunnerPhysicsSimulate2D / RunnerPhysicsSimulate3D

  • NetworkRunner ํ”„๋ฆฌํŒน์— ์ถ”๊ฐ€, ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ง€์ • ๊ฐ€๋Šฅ
  • ๋งค FixedUpdateNetwork()์—์„œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ Physics Simulate() ํ˜ธ์ถœ

1. ๋ฌผ๋ฆฌ ๊ถŒํ•œ(Physics Authority)

  • Fusion์ด Physics.Simulate()/Physics2D.Simulate() ํ˜ธ์ถœ์„ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ• ์ง€ ์•„๋‹ˆ๋ฉด Unity์˜ ๋ฌผ๋ฆฌ ์„ค์ •(์ž๋™ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“œ)์— ๋งก๊ธธ์ง€ ์ง€์ •
  • Auto Fusion์ด Simulate() ํ˜ธ์ถœ์„ ์ธ์ˆ˜ํ•  ๋•Œ ์ง€์ •
    • [Shared Mode ์™ธ] ๋ชจ๋“  ๊ฒŒ์ž„ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ๋•Œ
      • Shared Mode๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ FixedUpdateNetwork() ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ด๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •
      • ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๊ฐ€ FixedUpdateNetwork() ๋‚ด์—์„œ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  PhysicsAuthority๋ฅผ Fusion์œผ๋กœ ์„ค์ • ํ•„์š”
    • Multi-Peer ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ
      • Unity๋Š” ๋น„-์ฃผ์š” ๋ฌผ๋ฆฌ ์žฅ๋ฉด์„ ์ž๋™์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Multi-Peer ๋ชจ๋“œ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ Fusion์ด Simulate() ํ˜ธ์ถœ ์ œ์–ด

2. ๋ฌผ๋ฆฌ ํƒ€์ด๋ฐ(Physics Timing)

Fusion์ด ๋ฌผ๋ฆฌ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ํƒ€์ด๋ฐ ์„ธ๊ทธ๋จผํŠธ ์ง€์ •

3. ํด๋ผ์ด์–ธํŠธ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(Client Physics Simulation)

ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ œ์–ด

  • Disabled ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ณ€ํ™˜์ด PhysX ์—”์ง„ ๋™๊ธฐํ™”X
  • SyncTransforms ๋ชจ๋“  ํ‹ฑ์—์„œ UnityEngine.Physics.SyncTransform() ํ˜ธ์ถœ
  • SimulateForward ์žฌ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ‹ฑ์—์„œ UnityEngine.Physics.SyncTransform()์ด ํ˜ธ์ถœ๋˜๋ฉฐ, Forward ํ‹ฑ์—์„œ UnityEngine.Physics.Simulate() ํ˜ธ์ถœ
  • SimulateAlways ๋ชจ๋“  ํ‹ฑ์—์„œ UnityEngine.Physics.Simulate() ํ˜ธ์ถœ

โš ๏ธ ์„œ๋ฒ„๋Š” ํ•ญ์ƒ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹คํ–‰

[Shared Mode]

  • SimulateForward์™€ SimulateAlways๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™
  • ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด Forward ํ‹ฑ์—์„œ๋งŒ ์ง„ํ–‰

4. DeltaTime ๋ฐฐ์œจ(DeltaTime Multiplier)

  • Physic์˜ Simulate()์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์˜ ๋ฐฐ์œจ
    • 1๋ณด๋‹ค ํฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๊ฐ€์†ํ™”
    • 0๊ณผ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๊ฐ์†ํ™”

5. ๊ณ ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ(Set FixedTimestep)

ํ™œ์„ฑํ™”๋˜๋ฉด Unity์˜ Time FixedTimestep ๊ฐ’์„ Fusion์˜ DeltaTime๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •

  • FixedUpdate ๋‚ด์˜ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ Fusion์˜ ํ‹ฑ๊ณผ ๋Œ€๋ถ€๋ถ„ ์ผ์น˜ํ•˜๋„๋ก ์ง€์›

์ค‘์š”: FixedUpdate()์™€ FixedUpdateNetwork()๋Š” ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ํƒ€์ด๋ฐ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ํ˜ผํ•ฉ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ชจ๋“  ์‹œ๋„๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Fusion์—์„œ๋Š” ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฝ”๋“œ๋ฅผ FixedUpdateNetwork()์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, Shared Mode์—์„œ๋Š” Update() ๋‚ด์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ฐ”๋žŒ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์ฝœ๋ฐฑ(Callbacks)

A. OnBeforeSimulate / OnAfterSimulate ๋“ฑ๋ก๋˜๋ฉด, ์ด ๋ฉ”์„œ๋“œ๋Š” RunnerSimulatePhysics๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ

using Fusion;
using Fusion.Addons.Physics;
using UnityEngine;

public class FusionPhysicsAddonExample : NetworkBehaviour
{
  private RunnerSimulatePhysics3D _physicsSimulator;

  public override void Spawned()
  {
    // RunnerSimulatorPhysics ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค (์ด ์ปดํฌ๋„ŒํŠธ๋Š” Runner์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค)
    _physicsSimulator = Runner.GetComponent<RunnerSimulatePhysics3D>();

    // ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ‹ฑ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ๋“ฑ๋ก
    _physicsSimulator.OnBeforeSimulate += OnBeforeEverySimulate;
  }

  public override void Despawned(NetworkRunner runner, bool hasState)
  {
    // ์ฝœ๋ฐฑ ๋“ฑ๋ก ํ•ด์ œ (์ข‹์€ ์Šต๊ด€)
    _physicsSimulator.OnBeforeSimulate -= OnBeforeEverySimulate;
  }

  void OnBeforeEverySimulate() {
    // ๋ชจ๋“  Physics.Simulate ํ˜ธ์ถœ ์ „์— ์‹คํ–‰ํ•  ์ฝ”๋“œ ๊ตฌํ˜„
  }
}

B. QueueBeforeSimulationCallback / QueueAfterSimulationCallback ๋‹ค์Œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ ๋‹จ์ผ ์ฝœ๋ฐฑ์„ ํ์— ์ถ”๊ฐ€

using Fusion;
using Fusion.Addons.Physics;
using UnityEngine;

public class FusionPhysicsAddonExample : NetworkBehaviour
{
  private RunnerSimulatePhysics3D _physicsSimulator;

  public override void Spawned()
  {
    // RunnerSimulatorPhysics ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค (์ด ์ปดํฌ๋„ŒํŠธ๋Š” Runner์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค)
    _physicsSimulator = Runner.GetComponent<RunnerSimulatePhysics3D>();
  }

  public override void FixedUpdateNetwork()
  {
    if (_physicsSimulator.HasSimulatedThisTick)
    {
      Debug.LogWarning($"์ปดํฌ๋„ŒํŠธ๊ฐ€ FixedUpdateNetwork๋ฅผ Physics Simulation ์ดํ›„์— ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.");
      PostSimulateActivity();
    } else {
      // ์ผํšŒ์„ฑ ์ง€์—ฐ ์ฝœ๋ฐฑ ํ์— ์ถ”๊ฐ€
      _physicsSimulator.QueueAfterSimulationCallback(PostSimulateActivity);
    }
  }

  void PostSimulateActivity() {
    // ํŠน์ • Physics.Simulate ํ˜ธ์ถœ ์ดํ›„์— ์‹คํ–‰ํ•  ์ฝ”๋“œ ๊ตฌํ˜„
  }
}

์•Œ๋ ค์ง„ ๋ฌธ์ œ(Known Issues)

  • ์ž์‹ Rigidbody๋Š” ๋ฌผ๋ฆฌํ•™๊ณผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘์— ๋งˆ์น˜ Rigidbody๊ฐ€ ์ด์ „ ์œ„์น˜์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Œ
    • ์šด๋ฐ˜๋œ ๊ฐ์ฒด๊ฐ€ ์ถฉ๋Œ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ์ค‘์ฒฉ๋œ ๊ฒฝ์šฐ์—๋Š” Collider๋ฅผ ๋น„ํ™œ์„ฑํ™” ๊ถŒ์žฅ
  • ์Šค์ผ€์ผ๊ณผ ์ค‘์ฒฉ(๋ถ€๋ชจ ์„ค์ •)์€ ๋ชจ๋“  ๋ถ€๋ชจ๊ฐ€ ๋ณด๊ฐ„ ๋Œ€์ƒ ๋ฏธ๋ณด์œ  ์ฒ˜๋ฆฌ ํ•„์š”
    • ์Šค์ผ€์ผ๊ณผ ์ค‘์ฒฉ์„ ๊ฒฐํ•ฉํ•˜๊ณ  ๋ณด๊ฐ„ ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณด๊ฐ„ ๋Œ€์ƒ์„ root์™€ ๋ถ„๋ฆฌํ•˜๊ณ  parent์˜ Interpolation target์œผ๋กœ ๋‹ค์‹œ re-parentํ•˜๋Š” ์ปค์Šคํ…€ ์ฝ”๋“œ ์ž‘์„ฑ ํ•„์š”
    • Rigidbody Collider/Transform ๊ณ„์ธต์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ๊ด€๋ จ ๋ณด๊ฐ„ ๋Œ€์ƒ ํฌํ•จ
  • MovePosition() ๋ฐ MoveRotation()์€ ๋ณด๊ฐ„ ๋Œ€์ƒ ์‚ฌ์šฉ ํ•„์š”
    • transform.position ๋ฐ transform.rotation ๊ฐ’์„ ์ง์ ‘ ์„ค์ •ํ•˜์—ฌ ์šด๋™์—ญํ•™์ ์œผ๋กœ Rigidbody๋ฅผ ์ด๋™์‹œํ‚ค๋ฉด ์ด ์š”๊ตฌ ์‚ฌํ•ญ ๋ถˆํ•„์š”