๐Ÿš‡ ๋‚˜๋Š” ์‹ค์ˆ˜๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ „์ฒด 3D Endless Runner ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ๋‹ค (์ฐธ๊ณ ๋กœ KB ๋‹จ์œ„)

๋ฐœํ–‰: (2026๋…„ 1์›” 15์ผ ์˜คํ›„ 10:21 GMT+9)
8 min read
์›๋ฌธ: Dev.to

Source: Dev.to โ€“ I Accidentally Built a Full 3D Endless Runner Game in the Browser (Itโ€™s inโ€ฏKBs btw)

๋ธŒ๋ผ์šฐ์ €์—์„œ ์šฐ์—ฐํžˆ ๋งŒ๋“  ์ „์ฒด 3D ๋ฌดํ•œ ๋‹ฌ๋ฆฌ๊ธฐ ๊ฒŒ์ž„ (KB ๋‹จ์œ„๋ผ์„œ ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค) ํ‘œ์ง€ ์ด๋ฏธ์ง€

์Šคํฌ๋ฆฐ์ƒทโ€ฏ1
์Šคํฌ๋ฆฐ์ƒทโ€ฏ2
์Šคํฌ๋ฆฐ์ƒทโ€ฏ3

์†Œ๊ฐœ

์•ˆ๋…• ๊ฐœ๋ฐœ์ž๋“ค, ์ด์ƒจํŠธ์ž…๋‹ˆ๋‹ค ๐Ÿ‘‹

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ:

  • ์™œ ๋ชจ๋“  ์›น ๊ฒŒ์ž„์ด ~200โ€ฏMB ์ •๋„๊ฐ€ ๋˜์–ด์•ผ ํ• ๊นŒ์š”?
  • ๊ฒŒ์ž„์„ ์—ด์ž๋งˆ์ž ๋‚ด ํฐ์ด ์ œํŠธ ์—”์ง„ ์†Œ๋ฆฌ์ฒ˜๋Ÿผ ํฌ๊ฒŒ ๋‚˜๋Š” ์ด์œ ๋Š”?

๊ทธ๋ž˜์„œ ๋˜ ๋‹ค์‹œ ๋ฌด์ฑ…์ž„ํ•œ ์ผ์„ ํ–ˆ์–ด์š”โ€ฆ!

์•ฝโ€ฏ6โ€ฏ์‹œ๊ฐ„ ๋™์•ˆ, ์ปคํ”ผ์™€ ๋ถ€์‹คํ•œ ํŒ๋‹จ์— ํž˜์ž…์–ด Metro Runner๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค โ€” ์ „์ฒด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ’€โ€‘3D ๋ฌดํ•œ ๋Ÿฌ๋„ˆ์ž…๋‹ˆ๋‹ค.

  • Unity ์—†์Œ.
  • Unreal ์—†์Œ.
  • Godot ์—†์Œ.
  • ๋‹จ์ง€ Three.js, React, and Audacity๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ’€

๐Ÿ“ฆ Size Flex (Chrome Users Donโ€™t Know This)

Metro Runner๋Š” ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ ์›น ์•ฑ(PWA)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

  • Chrome์— ์ด๋ฏธ ๋ Œ๋”๋ง ์—”์ง„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Three.js๊ฐ€ ์‚ฌ์ดํŠธ ๊ฐ„์— ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์—์…‹์€ CSS์™€ ๊ฐ€๋ฒผ์šด ๋ฆฌ์†Œ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๋‹ค์šด๋กœ๋“œ ํฌ๊ธฐ: ๋ช‡ ๋ฐฑโ€ฏKB์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค(์˜ˆ, KB, MB๋‚˜โ€ฏGB๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์‚ฌ์ดํŠธ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  2. PWA๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ™ˆ ํ™”๋ฉด์—์„œ ๊ฒŒ์ž„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Chrome ์‚ฌ์šฉ์ž๋Š” Chrome๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ด๋ฏธ ์—”์ง„์˜ ์ ˆ๋ฐ˜์„ ๋‹ค์šด๋กœ๋“œํ•œ ์‚ฌ์‹ค์„ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. (์ €๋„ ๊ทธ ์ค‘ ํ•œ ๋ช…์ด์—์š”! ๐Ÿ˜‚)

๐ŸŽฎ Metro Runner๋ž€?

Metro Runner๋Š” 3D ๋ฌดํ•œโ€‘๋Ÿฌ๋„ˆ ๋ธŒ๋ผ์šฐ์ € ๊ฒŒ์ž„์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • 3๋ ˆ์ธ ์ด๋™
  • ์ ํ”„ / ์Šฌ๋ผ์ด๋“œ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • ์ง„ํ–‰์— ๋”ฐ๋ผ ์†๋„ ์ฆ๊ฐ€
  • ์ฝ”์ธ ๋ฐ ํŒŒ์›Œโ€‘์—… ์ˆ˜์ง‘
  • ์ธโ€‘๊ฒŒ์ž„ ์ƒ์ ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅ
  • ๋…ํŠนํ•œ ์‹œ๊ฐ์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๋ฐ”์ด์˜ด
  • ํŠน์ดํ•œ UFO ๋‚ฉ์น˜ ์ด๋ฒคํŠธ (์ถ”ํ›„ ์ž์„ธํžˆ ๐Ÿ’€)

Subway Surfers์™€ ๋น„์Šทํ•˜์ง€๋งŒ:

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์‹คํ–‰
  • ์™„์ „ 3D ๊ทธ๋ž˜ํ”ฝ
  • ํ›จ์”ฌ ๋” ๋ฏธ์นœ

๐Ÿ‘‰ ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: [Insert game link] (์‹ค์ œ URL๋กœ ๊ต์ฒด)

๐Ÿง  โ€œ๊ฒŒ์ž„ ์—”์ง„์„ ์‚ฌ์šฉํ–ˆ๋‚˜์š”?โ€

No ๐Ÿ˜

Itโ€™s built with React Three Fiber (Three.js) and:

  • Custom game loop
  • Manual collision logic
  • Fake speed via world movement (deltaโ€‘timeโ€‘based motion)

The player barely moves forward; the world rushes toward youโ€”a classic illusion that remains undefeated.

Source:

๐Ÿš‚ ํŠธ๋ ˆ์ธ, ๋žจํ”„, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋Šฅ์ด ๋œ ๋ฒ„๊ทธ ๐Ÿ’€

๊ณ ์†์ผ ๋•Œ, ๊ฐ€๋”:

  • ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํŠธ๋ ˆ์ธ ๋žจํ”„์— ๋ถ€๋”ชํž˜
  • ๋„˜์–ด์ ธ์„œ ํŠ•๊ฒจ ๋‚˜๊ฐ€๊ณ  ์‚ฌ๋ง ๐Ÿ’€

์ถฉ๋Œ ์Šค์œ„ํ”„, ์ •๋ ฌ ๋ฏธ์„ธ ์กฐ์ •, ๋ถˆ๋ฒ• ์†๋„ ๋””๋ฒ„๊น… ๋“ฑ์„ ์‹œ๋„ํ–ˆ์Œ.

ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‚˜์š”? ์•„๋‹ˆ์š”.

๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ •์ƒ์ ์ธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ๋Œ€๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค: ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†์œผ๋ฉด โ€” ๊ฒŒ์ž„ํ”Œ๋ ˆ์ด๋กœ ์Šน๊ฒฉ์‹œํ‚ค์ž.

๐Ÿง  ์Šคํ† ๋ฆฌ ์—…๋ฐ์ดํŠธ

์ผ๋ถ€ ํŠธ๋ ˆ์ธ ๋žจํ”„๋Š” ์ฝ”์น˜์™€ ์•ฝ๊ฐ„ ์–ด๊ธ‹๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์†์—์„œ๋Š” ๋ถ€์‹คํ•œ ์ ํ”„๊ฐ€ ์Šคํ‚ฌ ๊ธฐ๋ฐ˜ ํŽ˜๋„ํ‹ฐ(๋–จ์–ด์ ธ์„œ ๊ฒŒ์ž„ ์˜ค๋ฒ„)๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์ด์ œ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜๋„๋œ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

๐Ÿš‚ ๊ธฐ์ฐจ ์‹œ์Šคํ…œ (ํ†ต์นญ ๊ณ ํ†ต ๋ฐœ์ƒ๊ธฐ)

  • ์ผ๋ฐ˜ ๊ธฐ์ฐจ โ€“ ์ •์ง€ + ์ด๋™
  • ํŠธ๋ฆฌํ”Œโ€‘ํŠธ๋ ˆ์ธ ๋žจํ”„ ๊ตฌ๊ฐ„ (~10%) โ€“ ๋ชจ๋“  ์ฐจ์„  ์ฐจ๋‹จ, ์œ„์— ๋žจํ”„, ๋Œ€๋Ÿ‰ ์ฝ”์ธ ๋ณด์ƒ
  • ๊ธฐ์ฐจ ์ ํ”„ ๊ตฌ๊ฐ„ (~10%) โ€“ ์ฐจ์„ ์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ ๊ธฐ์ฐจ ์‚ฌ์ด๋ฅผ ์ ํ”„; ํ•œ ๋ฒˆ ๋†“์น˜๋ฉด ๋ฉ”๋‰ด๋กœ ๋ณต๊ท€ ๐Ÿ’€

๊ธฐ์ฐจ๋Š” ์‹ค์ œ ์ถฉ๋Œโ€”์œ ๋ น ํด๋ฆฌํ•‘ ์—†์Œ.

๐Ÿ‘ฝ ์™ธ๊ณ„์ธ ๋‚ฉ์น˜ ์ด๋ฒคํŠธ (์—ฌ๊ธฐ์„œ ์ œ์–ด๋ฅผ ์žƒ์Œ)

๋Ÿฐ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ๋žœ๋ค ์ด๋ฒคํŠธ:

  1. UFO ๋“ฑ์žฅ
  2. ์ดˆ๋ก๋น›๊ณผ ํŠธ๋ž™ํ„ฐ ๋น”
  3. ํ™”๋ฉด์ด ์–ด๋‘์›Œ์ง
  4. ์ƒˆ๋กœ์šด ๋ฐ”์ด์˜ด์œผ๋กœ ํ…”๋ ˆํฌํŠธ
  5. +25 ๋ฌด๋ฃŒ ์ฝ”์ธ ๋ฐ ์ผ์‹œ์ ์ธ ๋ฌด์ 

ํ˜„์‹ค์ ์ธ๊ฐ€์š”? ์•„๋‹ˆ์š”.
์žฌ๋ฏธ์žˆ๋‚˜์š”? ๋‹น์—ฐํžˆ. ๐Ÿ›ธ

โšก ํŒŒ์›Œโ€‘์—… (๋„ค, ๊ทธ ์ž…์ž๋“ค์€ ์‹ค์ œ์ž…๋‹ˆ๋‹ค)

Powerโ€‘UpEffect
๐Ÿงฒ Magnet๋™์ „ ๋Œ์–ด๋‹น๊น€
๐Ÿ‘Ÿ Super Boots์ ํ”„ ๋†’์ด 2๋ฐฐ
๐Ÿ›น Hoverboardํ•œ ๋ฒˆ์˜ ๋ฌด๋ฃŒ ์ถฉ๋Œ
๐Ÿš€ Headstart๋กœ์ผ“ ๋ถ€์Šคํ„ฐ
โœ–๏ธ Multiplier๋™์ „ ๋‘ ๋ฐฐ
๐Ÿš€ Jetpack์žฅ์• ๋ฌผ ์œ„๋ฅผ ๋‚ ๊ธฐ

๊ทธ ์ž…์ž๋“ค(๋ฐ”๋žŒ ์ž๊ตญ, ์Šคํ”ผ๋“œ ๋ผ์ธ)์€ ๋‹จ์ˆœํžˆ โ€œ์‹œ๊ฐ ํšจ๊ณผโ€๊ฐ€ ์•„๋‹ˆ๋ผ ์†๋„ ์ฐฉ๊ฐ์„ ํŒ๋งคํ•ฉ๋‹ˆ๋‹ค. ์ œํŠธํŒฉ ์ž…์ž๋Š” ์ œํŠธํŒฉ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋ฉฐ, ๋ถ„์œ„๊ธฐ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๐Ÿช Shop System (I Went Too Far)

  • ์ฝ”์ธ์œผ๋กœ ํŒŒ์›Œโ€‘์—…์„ ๊ตฌ๋งค
  • ์ž์„ ์ง€์† ์‹œ๊ฐ„ ์—…๊ทธ๋ ˆ์ด๋“œ (์ตœ๋Œ€ 6๋‹จ๊ณ„)
  • ์‹œ์ž‘ ํŒŒ์›Œโ€‘์—… ์„ ํƒ

์ธ๋ฒคํ† ๋ฆฌ๋Š” localStorage๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํƒญ์„ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์—ด๋ฉด, ๋‹น์‹ ์˜ ๊ทธ๋ผ์ธ๋“œ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ค

๐ŸŒ ์ƒ๋ฌผ๊ตฐ๊ณ„

  • ๐Ÿš‡ ์ง€ํ•˜์ฒ 
  • ๐Ÿ™๏ธ ๋„์‹œ
  • ๐ŸŒฒ ์ˆฒ

์ƒ๋ฌผ๊ตฐ๊ณ„ ์ „ํ™˜์€ ๊ฐ•์ œ์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ์‹คํ–‰์ด ๋ณต์‚ฌโ€‘๋ถ™์—ฌ๋„ฃ๊ธฐ์ฒ˜๋Ÿผ ๋А๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿฅš Easter Egg

๋ฉ”๋‰ด์—์„œ ๊ฒŒ์ž„ ์ œ๋ชฉ์„ ํด๋ฆญํ•˜์„ธ์š”.
๊ทธ๊ฒŒ ์ „๋ถ€์˜ˆ์š” ๐Ÿ˜

๐Ÿ”ง Tech Stack (a.k.a. Bad Decisions)

  • Reactโ€ฏ+โ€ฏTypeScript
  • Three.js (via React Three Fiber)
  • ๋งž์ถค ์ถฉ๋Œ ๋กœ์ง
  • ํŒŒํ‹ฐํด ์‹œ์Šคํ…œ
  • PWA (์„ค์น˜ ๊ฐ€๋Šฅ, ์˜คํ”„๋ผ์ธ ์นœํ™”์ )
  • localStorage๋ฅผ ํ†ตํ•œ ์ €์žฅ๋œ ์ƒํƒœ

์—”์ง„๋„, ๋ฌผ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์—†๊ณ โ€”๊ทธ๋ƒฅ ์ˆ˜ํ•™, ํƒ€์ด๋ฐ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ๋งŒ.

๐Ÿง  ์™œ ์ด๊ฑธ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€

I wanted to see: ์‹ค์ œ 3D ๊ฒŒ์ž„์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์„๊นŒโ€ฆ ๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ์ข‹์€ ๋А๋‚Œ์„ ์ค„ ์ˆ˜ ์žˆ์„๊นŒ?

Turns out โ€” yes. And it fits in KBs, which still feels illegal.

๐Ÿ™Œ ํ”ผ๋“œ๋ฐฑ

๋Œ“๊ธ€, ์ œ์•ˆ ๋“ฑ์„ ์ž์œ ๋กญ๊ฒŒ ๋‚จ๊ธฐ๊ฑฐ๋‚˜, ํ˜น์€ โ€œ์™€!โ€๋ผ๊ณ  ๋งํ•ด ์ฃผ์„ธ์š”.

์กฐ๋กฑ ํ™˜์˜

ํ”Œ๋ ˆ์ดํ•œ๋‹ค๋ฉด:

  • ๋‹น์‹ ์ด ์–ด๋””์„œ ์ฃฝ์—ˆ๋Š”์ง€ ์•Œ๋ ค ์ฃผ์„ธ์š”.
  • ์–ด๋–ค ๋žจํ”„๊ฐ€ ๋‹น์‹ ์„ ๋ฐฐ์‹ ํ–ˆ๋Š”์ง€ ์•Œ๋ ค ์ฃผ์„ธ์š”.
  • UFO ์ ํ”„๊ฐ€ ๋‹น์‹ ์„ ๊ฒ๋จน๊ฒŒ ํ–ˆ๋Š”์ง€ ์•Œ๋ ค ์ฃผ์„ธ์š”.

์ด์ œ ์ด๊ฒƒ์ด โ€œ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•œ ์‹คํ—˜โ€์ด์—ˆ๋‹ค๋Š” ์ฒ™ํ•˜๋ฉด์„œ ์–‘ํ•ด๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

โ€” Ishant ๐Ÿ–ค

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

์›น์„ 3D๋กœ ์—ด๋‹ค: Three.js ์ž…๋ฌธ

Three.js๊ฐ€ ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ WebGL์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ 3D ๊ทธ๋ž˜ํ”ฝ์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋ณธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋งค์šฐ ์ €์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. Three.js๋Š” ...

3D๋กœ ์›น์„ ์—ด๋‹ค: Three.js ์ž…๋ฌธ

Three.js๋Š” ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ WebGL์˜ ์›์‹œ์ ์ธ ํž˜๊ณผ ์ ‘๊ทผ์„ฑ ์‚ฌ์ด์˜ ๊ฐ„๊ทน์„ ๋ฉ”์›Œ์ค๋‹ˆ๋‹คโ€ฆ

Fluid Simulator ๊ฐ€์†ํ™”

์ดˆ๋ก ์„œ๋ก  ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์‹คํ–‰๋˜๋Š” ์•ˆ์ •์ ์ด๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ Navierโ€‘Stokes ์†”๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.