์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฎ Unity ๊ฒŒ์ž„ ์—”์ง„๊ณผ C# ์Šคํฌ๋ฆฝํŒ… ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ์„ธ๊ณ„

๐ŸŽฎ Unity ๊ฒŒ์ž„ ์—”์ง„๊ณผ C# ์Šคํฌ๋ฆฝํŒ… ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ์„ธ๊ณ„

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ๊ฟˆ์„ ํ˜„์‹ค๋กœ! Unity์™€ C#์œผ๋กœ ๋‚˜๋งŒ์˜ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ ๐Ÿš€

UNITY Game Engine C# Scripting Language

์•ˆ๋…•! ๐Ÿ‘‹ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ ์žˆ๋Š” ์นœ๊ตฌ๋“ค ๋ชจ์—ฌ๋ผ! ์˜ค๋Š˜์€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ์–‘๋Œ€ ์‚ฐ๋งฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” Unity ๊ฒŒ์ž„ ์—”์ง„๊ณผ C# ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•ด ์™„์ „ ์ •๋ณตํ•ด๋ณผ ๊ฑฐ์•ผ. ํ˜น์‹œ "๋‚˜๋„ ๊ฒŒ์ž„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์€๋ฐ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด..."๋ผ๊ณ  ์ƒ๊ฐํ•œ ์  ์žˆ์ง€? ๊ทธ๋ ‡๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ฐพ์•„์™”์–ด! ๐Ÿ˜Ž

Unity๋Š” ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒŒ์ž„ ์—”์ง„ ์ค‘ ํ•˜๋‚˜์•ผ. ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„๋ถ€ํ„ฐ PC, ์ฝ˜์†”, ์‹ฌ์ง€์–ด VR/AR ๊ฒŒ์ž„๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋งŒ๋Šฅ ๋„๊ตฌ์ง€. ๊ทธ๋ฆฌ๊ณ  C#์€ Unity์—์„œ ๊ฒŒ์ž„ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์•ผ. ์ด ๋‘˜์˜ ์กฐํ•ฉ์€ ์ •๋ง ํ™˜์ƒ์ ์ด๋ผ์„œ, ์ดˆ๋ณด์ž๋„ ๋น„๊ต์  ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์˜ ๊ฒŒ์ž„๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ๐ŸŽฏ

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€๋ฐ ํ˜ผ์ž ํ•˜๊ธฐ ๋ง‰๋ง‰ํ•˜๋‹ค๋ฉด? ์žฌ๋Šฅ๋„ท์—์„œ Unity์™€ C# ์ „๋ฌธ๊ฐ€๋“ค์˜ 1:1 ์ฝ”์นญ์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹น์‹ ์˜ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ์—ฌ์ •์„ ํ•จ๊ป˜ํ•ด์ค„ ๊ฑฐ์•ผ.

๐ŸŽฏ Unity ๊ฒŒ์ž„ ์—”์ง„์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Unity๋Š” 2005๋…„์— ์ฒ˜์Œ ์ถœ์‹œ๋œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฒŒ์ž„ ์—”์ง„์ด์•ผ. "๊ฒŒ์ž„ ์—”์ง„"์ด๋ผ๋Š” ๋ง์ด ์ข€ ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ข…ํ•ฉ ์„ ๋ฌผ ์„ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ. ๐ŸŽ

Unity์˜ ํ•ต์‹ฌ ํŠน์ง•

1. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์› ๐ŸŒ
ํ•œ ๋ฒˆ ๊ฐœ๋ฐœํ•˜๋ฉด Windows, Mac, Linux, iOS, Android, PlayStation, Xbox, Nintendo Switch ๋“ฑ 25๊ฐœ ์ด์ƒ์˜ ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋Œ€๋‹จํ•œ ๊ฑฐ๋ƒ๋ฉด, ์˜ˆ์ „์—๋Š” ํ”Œ๋žซํผ๋งˆ๋‹ค ๋”ฐ๋กœ ๊ฐœ๋ฐœํ•ด์•ผ ํ–ˆ๊ฑฐ๋“ . Unity ๋•๋ถ„์— ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€.

2. ์ง๊ด€์ ์ธ ์—๋””ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค ๐Ÿ–ฅ๏ธ
Unity ์—๋””ํ„ฐ๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์„œ ์ฝ”๋”ฉ์„ ๋ชฐ๋ผ๋„ ๊ธฐ๋ณธ์ ์ธ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ๋ฐฐ์น˜์™€ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ด. Scene ๋ทฐ์—์„œ ๊ฒŒ์ž„ ์„ธ๊ณ„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , Game ๋ทฐ์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง๊ด€์ ์ด์•ผ!

3. ๊ฐ•๋ ฅํ•œ ์—์…‹ ์Šคํ† ์–ด ๐Ÿช
Unity Asset Store์—๋Š” ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ฌด๋ฃŒ/์œ ๋ฃŒ ์—์…‹์ด ์žˆ์–ด. 3D ๋ชจ๋ธ, ํ…์Šค์ฒ˜, ์‚ฌ์šด๋“œ, ์• ๋‹ˆ๋ฉ”์ด์…˜, ์‹ฌ์ง€์–ด ์™„์„ฑ๋œ ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ๊นŒ์ง€! ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฑธ ๋งŒ๋“ค ํ•„์š” ์—†์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ตฌ๋งคํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

4. ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๐Ÿ‘ฅ
์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ Unity๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด. ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด Unity ํฌ๋Ÿผ, Stack Overflow, YouTube ํŠœํ† ๋ฆฌ์–ผ ๋“ฑ์—์„œ ๊ฑฐ์˜ ๋ชจ๋“  ํ•ด๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ์ •๋ง ํฐ ์žฅ์ ์ด์•ผ!

๐ŸŽฎ Unity๋กœ ๋งŒ๋“ค์–ด์ง„ ์œ ๋ช… ๊ฒŒ์ž„๋“ค - ํฌ์ผ“๋ชฌ ๊ณ  (Pokรฉmon GO): ์ „ ์„ธ๊ณ„๋ฅผ ์—ด๊ด‘์‹œํ‚จ AR ๊ฒŒ์ž„
- ์ฟ ํ‚ค๋Ÿฐ ์‹œ๋ฆฌ์ฆˆ: ํ•œ๊ตญ์„ ๋Œ€ํ‘œํ•˜๋Š” ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„
- ํ• ๋กœ์šฐ ๋‚˜์ดํŠธ (Hollow Knight): ์ธ๋”” ๊ฒŒ์ž„์˜ ๋ช…์ž‘
- ์ปตํ—ค๋“œ (Cuphead): ๋…ํŠนํ•œ ์•„ํŠธ ์Šคํƒ€์ผ์˜ ์•ก์…˜ ๊ฒŒ์ž„
- ์–ด๋ชฝ์–ด์Šค (Among Us): ์ „ ์„ธ๊ณ„์  ์‹ ๋“œ๋กฌ์„ ์ผ์œผํ‚จ ๊ฒŒ์ž„

์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ์žฅ๋ฅด์™€ ๊ทœ๋ชจ์˜ ๊ฒŒ์ž„์ด Unity๋กœ ๋งŒ๋“ค์–ด์กŒ์–ด! ๐Ÿ˜ฒ

๐Ÿ’ป C# ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์†Œ๊ฐœ

C#(์”จ์ƒต)์€ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ 2000๋…„์— ๊ฐœ๋ฐœํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์•ผ. "C Sharp"๋ผ๊ณ  ์ฝ๋Š”๋ฐ, ์Œ์•… ๊ธฐํ˜ธ #(์ƒต)์—์„œ ๋”ฐ์˜จ ์ด๋ฆ„์ด์ง€. C++๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ์–ด. ๐ŸŽต

Unity์—์„œ C#์„ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋ช…ํ™•ํ•ด. ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•˜๊ณ , ์•ˆ์ •์ ์ด๋ฉด์„œ๋„ ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. C++์ฒ˜๋Ÿผ ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ฑฐ๋“ .

C#์˜ ์ฃผ์š” ํŠน์ง•

1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP) ๐Ÿงฉ
C#์€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์•ผ. ์ด๊ฒŒ ๋ญ๋ƒ๋ฉด, ํ”„๋กœ๊ทธ๋žจ์„ "๊ฐ์ฒด"๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์ž„์—์„œ ํ”Œ๋ ˆ์ด์–ด, ์ , ์•„์ดํ…œ ๋“ฑ์„ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ณ , ์ด๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฑฐ์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ์œ ์ง€๋ณด์ˆ˜๋„ ํŽธํ•ด์ ธ.

2. ํƒ€์ž… ์•ˆ์ •์„ฑ ๐Ÿ›ก๏ธ
C#์€ "๊ฐ•ํƒ€์ž…" ์–ธ์–ด์•ผ. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ํƒ€์ž…(์ •์ˆ˜, ๋ฌธ์ž์—ด, ๋ถˆ๋ฆฐ ๋“ฑ)์„ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•ด์•ผ ํ•ด. ์ฒ˜์Œ์—” ๊ท€์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๋•๋ถ„์— ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ์–ด. ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฑฐ์ง€!

3. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๐Ÿ—‘๏ธ
C#์€ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ์žˆ์–ด. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ™์€ ๊ณจ์น˜ ์•„ํ”ˆ ๋ฌธ์ œ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€. C++์—์„œ๋Š” ์ด๊ฑธ ์ˆ˜๋™์œผ๋กœ ํ•ด์•ผ ํ•ด์„œ ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด๋ฐ, C#์€ ์ด ๋ถ€๋ถ„์ด ์ž๋™ํ™”๋˜์–ด ์žˆ์–ด.

4. ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๐Ÿ“š
.NET Framework(๋˜๋Š” .NET Core)์˜ ๋ฐฉ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋„คํŠธ์›Œํ‚น, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์„œ ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์ง€.

5. ํ˜„๋Œ€์ ์ธ ์–ธ์–ด ๊ธฐ๋Šฅ โœจ
LINQ(Language Integrated Query), async/await, ๋žŒ๋‹ค ํ‘œํ˜„์‹, ํ”„๋กœํผํ‹ฐ ๋“ฑ ํ˜„๋Œ€์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ง€์›ํ•ด. ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค ๋•๋ถ„์— ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿš€ Unity ์„ค์น˜์™€ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Unity๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ์„ค์น˜๋ถ€ํ„ฐ ์ฒซ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์ž! ๐ŸŽฌ

Unity Hub ์„ค์น˜ํ•˜๊ธฐ

Step 1: Unity Hub ๋‹ค์šด๋กœ๋“œ
Unity ๊ณต์‹ ์›น์‚ฌ์ดํŠธ(unity.com)์— ์ ‘์†ํ•ด์„œ Unity Hub๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด. Unity Hub๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ Unity๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์—ด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Ÿฐ์ฒ˜์•ผ. ๋ฌด๋ฃŒ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด!

Step 2: ๊ณ„์ • ์ƒ์„ฑ
Unity๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Unity ID๊ฐ€ ํ•„์š”ํ•ด. ์ด๋ฉ”์ผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐœ์ธ ์‚ฌ์šฉ์ž๋ผ๋ฉด Unity Personal ๋ผ์ด์„ ์Šค๋ฅผ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์—ฐ ๋งค์ถœ $100,000 ์ดํ•˜๋ผ๋ฉด ์™„์ „ ๋ฌด๋ฃŒ์•ผ! ๐ŸŽ‰

Step 3: Unity ์—๋””ํ„ฐ ์„ค์น˜
Unity Hub๋ฅผ ์‹คํ–‰ํ•˜๊ณ  "Installs" ํƒญ์—์„œ ์›ํ•˜๋Š” Unity ๋ฒ„์ „์„ ์„ค์น˜ํ•ด. ์ดˆ๋ณด์ž๋ผ๋ฉด LTS(Long Term Support) ๋ฒ„์ „์„ ์ถ”์ฒœํ•ด. ์ด๊ฑด ์žฅ๊ธฐ ์ง€์› ๋ฒ„์ „์ด๋ผ ์•ˆ์ •์ ์ด๊ฑฐ๋“ . ์„ค์น˜ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—” ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

Step 4: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •
Unity๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Visual Studio Community๋ฅผ ์ฝ”๋“œ ์—๋””ํ„ฐ๋กœ ์‚ฌ์šฉํ•ด. ์„ค์น˜ ๊ณผ์ •์—์„œ ํ•จ๊ป˜ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด. Visual Studio๋Š” C# ๊ฐœ๋ฐœ์— ์ตœ์ ํ™”๋œ IDE(ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ)์•ผ. ์ฝ”๋“œ ์ž๋™ ์™„์„ฑ, ๋””๋ฒ„๊น…, ๋ฆฌํŒฉํ† ๋ง ๋“ฑ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€.

๐Ÿ’พ ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ ์ตœ์†Œ ์‚ฌ์–‘:
- OS: Windows 7 SP1+, macOS 10.13+, Ubuntu 16.04+
- CPU: SSE2 ๋ช…๋ น์–ด ์„ธํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœ์„ธ์„œ
- GPU: DX10, DX11, DX12 ์ง€์› ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ
- RAM: ์ตœ์†Œ 4GB (8GB ์ด์ƒ ๊ถŒ์žฅ)
- ์ €์žฅ ๊ณต๊ฐ„: 10GB ์ด์ƒ

๊ถŒ์žฅ ์‚ฌ์–‘:
- CPU: ์ฟผ๋“œ์ฝ”์–ด ์ด์ƒ
- RAM: 16GB ์ด์ƒ
- GPU: ์ „์šฉ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ (NVIDIA/AMD)
- SSD ์ €์žฅ ์žฅ์น˜ (๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ)

๐ŸŽจ Unity ์—๋””ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค ์™„๋ฒฝ ๊ฐ€์ด๋“œ

Unity ์—๋””ํ„ฐ๋ฅผ ์ฒ˜์Œ ์—ด๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฐฝ(Window)์ด ๋ณด์ผ ๊ฑฐ์•ผ. ์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ๊ฐ ์ฐฝ์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๋ฉด ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์ ธ. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž! ๐Ÿ‘€

Hierarchy Scene Objects Main Camera Directional Light Player Scene View Game Objects Inspector Properties Transform Mesh Renderer Collider Script Component

์ฃผ์š” ์ฐฝ(Window) ์„ค๋ช…

1. Hierarchy ์ฐฝ (๊ณ„์ธต ๊ตฌ์กฐ) ๐Ÿ“‹
ํ˜„์žฌ Scene์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ผ. ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์–ด์„œ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด, "Player" ์˜ค๋ธŒ์ ํŠธ ์•„๋ž˜์— "Weapon", "Health Bar" ๊ฐ™์€ ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ์–ด. ์ƒˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  "Create Empty" ๋˜๋Š” "3D Object" ๋“ฑ์„ ์„ ํƒํ•˜๋ฉด ๋ผ.

2. Scene ๋ทฐ (์”ฌ ๋ทฐ) ๐ŸŽฌ
๊ฒŒ์ž„ ์„ธ๊ณ„๋ฅผ 3D ๊ณต๊ฐ„์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ํŽธ์ง‘ํ•˜๋Š” ๊ณณ์ด์•ผ. ๋งˆ์šฐ์Šค๋กœ ์นด๋ฉ”๋ผ๋ฅผ ํšŒ์ „ํ•˜๊ณ , ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•ด์„œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์–ด. ์™ผ์ชฝ ์ƒ๋‹จ์—๋Š” ์ด๋™(W), ํšŒ์ „(E), ํฌ๊ธฐ ์กฐ์ ˆ(R) ๋“ฑ์˜ ๋„๊ตฌ๊ฐ€ ์žˆ์–ด. Scene ๋ทฐ๋Š” ๊ฐœ๋ฐœ์ž ์‹œ์ ์ด๋ผ์„œ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ค‘์—๋Š” ๋ณด์ด์ง€ ์•Š์•„.

3. Game ๋ทฐ (๊ฒŒ์ž„ ๋ทฐ) ๐ŸŽฎ
์‹ค์ œ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ณด๊ฒŒ ๋  ํ™”๋ฉด์ด์•ผ. Play ๋ฒ„ํŠผ(โ–ถ๏ธ)์„ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์ž„์ด ์‹คํ–‰๋˜๊ณ , ์ด ๋ทฐ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด. Scene ๋ทฐ์™€ ํƒญ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธ์ง‘๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ์ง€.

4. Inspector ์ฐฝ (์ธ์ŠคํŽ™ํ„ฐ) ๐Ÿ”
์„ ํƒํ•œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ชจ๋“  ์†์„ฑ๊ณผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋ผ. Transform(์œ„์น˜, ํšŒ์ „, ํฌ๊ธฐ), Renderer(๋ Œ๋”๋ง ์„ค์ •), Collider(์ถฉ๋Œ ๊ฐ์ง€), Script(์Šคํฌ๋ฆฝํŠธ) ๋“ฑ ๋ชจ๋“  ๊ฑธ ์—ฌ๊ธฐ์„œ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด. Unity์˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ์ด ๋ฐ”๋กœ ์ด ์ฐฝ์ด์•ผ!

5. Project ์ฐฝ (ํ”„๋กœ์ ํŠธ) ๐Ÿ“
ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์—์…‹(์Šคํฌ๋ฆฝํŠธ, ํ…์Šค์ฒ˜, ๋ชจ๋ธ, ์‚ฌ์šด๋“œ ๋“ฑ)์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ด์•ผ. ํด๋” ๊ตฌ์กฐ๋กœ ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์—์…‹์„ Scene์œผ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

6. Console ์ฐฝ (์ฝ˜์†”) ๐Ÿ’ฌ
๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€, ๊ฒฝ๊ณ , ์—๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ณณ์ด์•ผ. ์ฝ”๋“œ์—์„œ `Debug.Log()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๊ธฐ์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ผ. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ฐฝ์ด์ง€!

๐ŸŽฏ Pro Tip: Unity ์—๋””ํ„ฐ์˜ ๋ ˆ์ด์•„์›ƒ์€ ์™„์ „ํžˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์–ด! ์ฐฝ์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ์–ด. Window > Layouts ๋ฉ”๋‰ด์—์„œ ๋‹ค์–‘ํ•œ ํ”„๋ฆฌ์…‹๋„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€.

๐Ÿงฑ Unity์˜ ํ•ต์‹ฌ ๊ฐœ๋…: GameObject์™€ Component

Unity์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋… ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ. ๋ฐ”๋กœ GameObject์™€ Component์•ผ. ์ด ๋‘˜์„ ์ดํ•ดํ•˜๋ฉด Unity์˜ ์ ˆ๋ฐ˜์€ ์ดํ•ดํ•œ ๊ฑฐ๋ผ๊ณ  ๋ด๋„ ๋ผ! ๐ŸŽฏ

GameObject (๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ)

GameObject๋Š” Unity Scene์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์•ผ. ํ”Œ๋ ˆ์ด์–ด, ์ , ์นด๋ฉ”๋ผ, ์กฐ๋ช…, UI ๋ฒ„ํŠผ ๋“ฑ ๊ฒŒ์ž„์— ๋‚˜์˜ค๋Š” ๋ชจ๋“  ๊ฒƒ์ด GameObject์•ผ. ํ•˜์ง€๋งŒ GameObject ์ž์ฒด๋Š” ๋นˆ ์ปจํ…Œ์ด๋„ˆ์ผ ๋ฟ์ด์•ผ. ๋งˆ์น˜ ๋นˆ ์ƒ์ž ๊ฐ™์€ ๊ฑฐ์ง€. ๐Ÿ“ฆ

GameObject๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:

โ€ข Name (์ด๋ฆ„): ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„
โ€ข Tag (ํƒœ๊ทธ): ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ ˆ์ด๋ธ” (์˜ˆ: "Player", "Enemy")
โ€ข Layer (๋ ˆ์ด์–ด): ๋ Œ๋”๋ง์ด๋‚˜ ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„๋ฅ˜
โ€ข Transform: ์œ„์น˜, ํšŒ์ „, ํฌ๊ธฐ ์ •๋ณด (๋ชจ๋“  GameObject๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง)

Component (์ปดํฌ๋„ŒํŠธ)

Component๋Š” GameObject์— ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ชจ๋“ˆ์ด์•ผ. GameObject๋ผ๋Š” ๋นˆ ์ƒ์ž์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋‹ด๋Š” ๊ฑฐ์ง€. ์ด๊ฒŒ Unity์˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ์ด์•ผ! ๐Ÿ”ง

๋Œ€ํ‘œ์ ์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์‚ดํŽด๋ณด์ž:

Transform ์ปดํฌ๋„ŒํŠธ:
๋ชจ๋“  GameObject๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ€์ง€๋Š” ์ปดํฌ๋„ŒํŠธ์•ผ. 3D ๊ณต๊ฐ„์—์„œ์˜ ์œ„์น˜(Position), ํšŒ์ „(Rotation), ํฌ๊ธฐ(Scale)๋ฅผ ์ •์˜ํ•ด. ์ด๊ฒŒ ์—†์œผ๋ฉด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด!

Mesh Renderer ์ปดํฌ๋„ŒํŠธ:
3D ๋ชจ๋ธ์„ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์•ผ. Material(์žฌ์งˆ)์„ ์„ค์ •ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ์˜ ์™ธํ˜•์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด.

Collider ์ปดํฌ๋„ŒํŠธ:
๋ฌผ๋ฆฌ์  ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์•ผ. Box Collider, Sphere Collider, Mesh Collider ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์–ด. ์ด๊ฒŒ ์žˆ์–ด์•ผ ์˜ค๋ธŒ์ ํŠธ๋ผ๋ฆฌ ๋ถ€๋”ชํž ์ˆ˜ ์žˆ์ง€.

Rigidbody ์ปดํฌ๋„ŒํŠธ:
๋ฌผ๋ฆฌ ์—”์ง„์˜ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์•ผ. ์ค‘๋ ฅ, ์งˆ๋Ÿ‰, ๋งˆ์ฐฐ๋ ฅ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑธ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋–จ์–ด์ง€๊ณ , ํŠ•๊ธฐ๊ณ , ๊ตด๋Ÿฌ๊ฐ€๋Š” ๋“ฑ ํ˜„์‹ค์ ์ธ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์ ธ.

Script ์ปดํฌ๋„ŒํŠธ:
์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ๋ฐ”๋กœ ๊ฒŒ์ž„์˜ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์ด์•ผ! ๐ŸŽฎ

๐ŸŽจ ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ์˜ ๋งˆ๋ฒ• ์˜ˆ๋ฅผ ๋“ค์–ด "๊ณต"์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž:

1. GameObject ์ƒ์„ฑ (๋นˆ ์ƒ์ž)
2. Mesh Renderer + Sphere Mesh ์ถ”๊ฐ€ (๊ณต ๋ชจ์–‘์œผ๋กœ ๋ณด์ด๊ฒŒ)
3. Sphere Collider ์ถ”๊ฐ€ (์ถฉ๋Œ ๊ฐ์ง€)
4. Rigidbody ์ถ”๊ฐ€ (๋ฌผ๋ฆฌ ๋ฒ•์น™ ์ ์šฉ)
5. Custom Script ์ถ”๊ฐ€ (ํŠน๋ณ„ํ•œ ๋™์ž‘ ๊ตฌํ˜„)

์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜๋ฉด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด! ๋ ˆ๊ณ  ๋ธ”๋ก์ฒ˜๋Ÿผ ์กฐ๋ฆฝํ•˜๋Š” ๊ฑฐ์ง€. ๐Ÿงฉ

๐Ÿ“ C# ์Šคํฌ๋ฆฝํŒ… ๊ธฐ์ดˆ: ์ฒซ ๋ฒˆ์งธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? Unity์—์„œ C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์ž! ๊ฑฑ์ • ๋งˆ, ํ•˜๋‚˜์”ฉ ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ• ๊ฒŒ. ๐Ÿ˜Š

์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑํ•˜๊ธฐ

Step 1: Project ์ฐฝ์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ
Step 2: Create > C# Script ์„ ํƒ
Step 3: ์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: "PlayerController")
Step 4: ๋”๋ธ”ํด๋ฆญํ•ด์„œ Visual Studio์—์„œ ์—ด๊ธฐ

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค๋ฉด ์ด๋Ÿฐ ๊ธฐ๋ณธ ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ผ:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

์ด ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ๋ถ„์„ํ•ด๋ณด์ž! ๐Ÿ”

์ฝ”๋“œ ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

1. using ๋ฌธ
using UnityEngine;์€ Unity์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์„ ์–ธ์ด์•ผ. C#์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace)๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š”๋ฐ, Unity์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ UnityEngine ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์— ์žˆ์–ด. ์ด๊ฑธ ์„ ์–ธํ•ด์•ผ GameObject, Transform, Vector3 ๊ฐ™์€ Unity ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

2. ํด๋ž˜์Šค ์„ ์–ธ
public class PlayerController : MonoBehaviour๋Š” PlayerController๋ผ๋Š” ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. : MonoBehaviour๋Š” ์ด ํด๋ž˜์Šค๊ฐ€ MonoBehaviour๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค๋Š” ๋œป์ด์•ผ. MonoBehaviour๋Š” Unity์˜ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒ์†๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์•ผ. ์ด๊ฑธ ์ƒ์†๋ฐ›์•„์•ผ Unity์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜(Start, Update ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

3. Start() ํ•จ์ˆ˜
๊ฒŒ์ž„์ด ์‹œ์ž‘๋  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์•ผ. ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์ฒด๋ ฅ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„์˜ค๋Š” ์ž‘์—…์„ ํ•˜์ง€.

4. Update() ํ•จ์ˆ˜
๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์•ผ. ๊ฒŒ์ž„์ด 60FPS๋กœ ๋Œ์•„๊ฐ„๋‹ค๋ฉด 1์ดˆ์— 60๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฑฐ์ง€! ํ”Œ๋ ˆ์ด์–ด ์ž…๋ ฅ์„ ๋ฐ›๊ฑฐ๋‚˜, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์›€์ง์ด๋Š” ๋“ฑ ์ง€์†์ ์œผ๋กœ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์„ ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•ด.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ: ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ํด๋ž˜์Šค ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•ด! PlayerController.cs ํŒŒ์ผ์ด๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„๋„ PlayerController์—ฌ์•ผ ํ•ด. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด Unity๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด.

๐ŸŽฎ ์‹ค์ „ ์˜ˆ์ œ: ํ”Œ๋ ˆ์ด์–ด ์ด๋™ ์Šคํฌ๋ฆฝํŠธ

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž! ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์œผ๋กœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์›€์ง์ด๋Š” ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฑฐ์•ผ. ๐Ÿ•น๏ธ

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // ์ด๋™ ์†๋„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ณ€์ˆ˜
    public float moveSpeed = 5.0f;
    
    // ์ ํ”„ ํž˜์„ ์„ค์ •ํ•˜๋Š” ๋ณ€์ˆ˜
    public float jumpForce = 7.0f;
    
    // Rigidbody ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
    private Rigidbody rb;
    
    // ๋•…์— ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ณ€์ˆ˜
    private bool isGrounded;
    
    void Start()
    {
        // Rigidbody ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ €์žฅ
        rb = GetComponent<Rigidbody>();
    }
    
    void Update()
    {
        // ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        float horizontal = Input.GetAxis("Horizontal"); // A/D ๋˜๋Š” โ†/โ†’
        float vertical = Input.GetAxis("Vertical");     // W/S ๋˜๋Š” โ†‘/โ†“
        
        // ์ด๋™ ๋ฐฉํ–ฅ ๊ณ„์‚ฐ
        Vector3 movement = new Vector3(horizontal, 0, vertical);
        
        // ์‹ค์ œ๋กœ ์ด๋™์‹œํ‚ค๊ธฐ
        transform.Translate(movement * moveSpeed * Time.deltaTime);
        
        // ์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋•…์— ์žˆ์œผ๋ฉด ์ ํ”„
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isGrounded = false;
        }
    }
    
    // ์ถฉ๋Œ ๊ฐ์ง€ (๋•…์— ๋‹ฟ์•˜๋Š”์ง€ ์ฒดํฌ)
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }
}

์™€! ์ฝ”๋“œ๊ฐ€ ์ข€ ๊ธธ์–ด ๋ณด์ด์ง€? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ. ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด๋ฉด ์ „ํ˜€ ์–ด๋ ต์ง€ ์•Š์•„. ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿ“–

์ฝ”๋“œ ์ƒ์„ธ ์„ค๋ช…

๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€๋ถ„
public float moveSpeed = 5.0f;์—์„œ public์€ ์ด ๋ณ€์ˆ˜๊ฐ€ Unity Inspector์—์„œ ๋ณด์ด๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์•ผ. float์€ ์†Œ์ˆ˜์ ์ด ์žˆ๋Š” ์ˆซ์ž ํƒ€์ž…์ด๊ณ , 5.0f๋Š” ์ดˆ๊ธฐ๊ฐ’์ด์•ผ. ์ด๋ ‡๊ฒŒ public์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ Inspector์—์„œ ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์—„์ฒญ ํŽธํ•ด!

private Rigidbody rb;๋Š” Rigidbody ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์•ผ. private์ด๋ผ์„œ Inspector์—๋Š” ์•ˆ ๋ณด์ด๊ณ  ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•ด. ์ ํ”„ ๊ฐ™์€ ๋ฌผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Rigidbody๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋“ .

Start() ํ•จ์ˆ˜
rb = GetComponent();๋Š” ์ด GameObject์— ๋ถ™์–ด์žˆ๋Š” Rigidbody ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„์„œ rb ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๊ฑฐ์•ผ. GetComponent<>()๋Š” Unity์—์„œ ์—„์ฒญ ์ž์ฃผ ์“ฐ๋Š” ํ•จ์ˆ˜๋‹ˆ๊นŒ ๊ผญ ๊ธฐ์–ตํ•ด๋‘ฌ!

Update() ํ•จ์ˆ˜ - ์ž…๋ ฅ ์ฒ˜๋ฆฌ
Input.GetAxis("Horizontal")์€ ์ขŒ์šฐ ์ž…๋ ฅ์„ -1.0์—์„œ 1.0 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ๋ฐ›์•„์™€. A๋‚˜ โ† ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด -1, D๋‚˜ โ†’ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด 1, ์•ˆ ๋ˆ„๋ฅด๋ฉด 0์ด ๋ฐ˜ํ™˜๋ผ. ๋ถ€๋“œ๋Ÿฌ์šด ์ด๋™์„ ์œ„ํ•ด ์ค‘๊ฐ„๊ฐ’๋„ ๊ฐ€๋Šฅํ•ด!

์ด๋™ ์ฒ˜๋ฆฌ

Vector3 movement = new Vector3(horizontal, 0, vertical);
๋Š” 3D ๊ณต๊ฐ„์—์„œ์˜ ์ด๋™ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. y์ถ•์€ 0์œผ๋กœ ํ•ด์„œ ์ˆ˜ํ‰ ์ด๋™๋งŒ ํ•˜๋„๋ก ํ–ˆ์–ด.

transform.Translate(movement * moveSpeed * Time.deltaTime);
๊ฐ€ ์‹ค์ œ ์ด๋™์„ ๋‹ด๋‹นํ•ด. Time.deltaTime์€ ์ด์ „ ํ”„๋ ˆ์ž„๊ณผ ํ˜„์žฌ ํ”„๋ ˆ์ž„ ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด์•ผ. ์ด๊ฑธ ๊ณฑํ•ด์ค˜์•ผ ํ”„๋ ˆ์ž„๋ ˆ์ดํŠธ์— ๊ด€๊ณ„์—†์ด ์ผ์ •ํ•œ ์†๋„๋กœ ์›€์ง์—ฌ. 60FPS๋“  30FPS๋“  ๊ฐ™์€ ์†๋„๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ์ง€!

์ ํ”„ ์ฒ˜๋ฆฌ
Input.GetKeyDown(KeyCode.Space)๋Š” ์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆŒ๋ €๋Š”์ง€ ์ฒดํฌํ•ด. GetKeyDown์€ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ํ•œ ๋ฒˆ๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ด. GetKey๋ฅผ ์“ฐ๋ฉด ๋ˆ„๋ฅด๊ณ  ์žˆ๋Š” ๋™์•ˆ ๊ณ„์† true๊ฐ€ ๋˜๋‹ˆ๊นŒ ์ ํ”„์—๋Š” GetKeyDown์ด ์ ํ•ฉํ•ด.

rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
๋Š” ์œ„์ชฝ์œผ๋กœ ํž˜์„ ๊ฐ€ํ•ด์„œ ์ ํ”„ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. Vector3.up์€ (0, 1, 0)์„ ์˜๋ฏธํ•˜๊ณ , ForceMode.Impulse๋Š” ์ˆœ๊ฐ„์ ์ธ ํž˜์„ ๊ฐ€ํ•œ๋‹ค๋Š” ๋œป์ด์•ผ.

์ถฉ๋Œ ๊ฐ์ง€
OnCollisionEnter()๋Š” ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์™€ ์ถฉ๋Œํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์•ผ. "Ground" ํƒœ๊ทธ๊ฐ€ ๋ถ™์€ ์˜ค๋ธŒ์ ํŠธ์™€ ์ถฉ๋Œํ•˜๋ฉด isGrounded๋ฅผ true๋กœ ์„ค์ •ํ•ด์„œ ๋‹ค์‹œ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด.

๐ŸŽฏ ์‹ค์Šต ํŒ: ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด:
1. Cube๋‚˜ Capsule ๊ฐ™์€ 3D ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด
2. Rigidbody ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด
3. ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”๊ฐ€ํ•ด
4. ๋ฐ”๋‹ฅ์— Plane์„ ๋งŒ๋“ค๊ณ  "Ground" ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ
5. Play ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ํ…Œ์ŠคํŠธํ•ด๋ด!

๐Ÿ”ง Unity์˜ ์ฃผ์š” ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜๋“ค

Unity ์Šคํฌ๋ฆฝํŠธ์—๋Š” ํŠน์ • ์‹œ์ ์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์žˆ์–ด. ์ด๊ฑธ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜(Lifecycle Functions)๋ผ๊ณ  ํ•ด. ์ด๊ฑธ ์ดํ•ดํ•˜๋ฉด ๊ฒŒ์ž„์˜ ํ๋ฆ„์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด! โฐ

Unity Script Lifecycle Awake() OnEnable() Start() Update() Every Frame Loop FixedUpdate() Fixed Time Step OnDestroy() Initialization Game Loop Cleanup Called once at start Called every frame For physics updates When object destroyed

์ฃผ์š” ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์ƒ์„ธ ์„ค๋ช…

Awake() ๐ŸŒ…
์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋ผ. Start()๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด๋„ ํ˜ธ์ถœ๋ผ. ์ฃผ๋กœ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•ด. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ๋•Œ๋„ Awake()๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด.

OnEnable() ๐Ÿ”›
์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ผ. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ป๋‹ค ์ผค ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋‹ˆ๊นŒ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•˜๋ฉด ์ข‹์•„.

Start() ๐Ÿš€
์ฒซ ๋ฒˆ์งธ Update() ํ˜ธ์ถœ ์ง์ „์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ผ. Awake()์™€ ๋‹ฌ๋ฆฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ํ˜ธ์ถœ๋ผ. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•ด.

Update() ๐Ÿ”„
๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ˜ธ์ถœ๋ผ. ํ”„๋ ˆ์ž„๋ ˆ์ดํŠธ์— ๋”ฐ๋ผ ํ˜ธ์ถœ ๋นˆ๋„๊ฐ€ ๋‹ฌ๋ผ์ ธ. ์ž…๋ ฅ ์ฒ˜๋ฆฌ, ํƒ€์ด๋จธ, ๊ฐ„๋‹จํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์„ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌํ•ด. ํ•˜์ง€๋งŒ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์€ ํ”ผํ•˜๋Š” ๊ฒŒ ์ข‹์•„!

FixedUpdate() โš™๏ธ
๊ณ ์ •๋œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ํ˜ธ์ถœ๋ผ (๊ธฐ๋ณธ๊ฐ’: 0.02์ดˆ = 50FPS). ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ์€ ๋ฐ˜๋“œ์‹œ ์—ฌ๊ธฐ์„œ ํ•ด์•ผ ํ•ด! Rigidbody๋ฅผ ์›€์ง์ด๊ฑฐ๋‚˜ ํž˜์„ ๊ฐ€ํ•  ๋•Œ๋Š” Update()๊ฐ€ ์•„๋‹ˆ๋ผ FixedUpdate()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•ํ•œ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•ด.

LateUpdate() ๐Ÿ•
๋ชจ๋“  Update()๊ฐ€ ๋๋‚œ ํ›„์— ํ˜ธ์ถœ๋ผ. ์นด๋ฉ”๋ผ ์ถ”์  ๊ฐ™์€ ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•˜๋ฉด ์ข‹์•„. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋จผ์ € ์›€์ง์ด๊ณ , ๊ทธ ๋‹ค์Œ์— ์นด๋ฉ”๋ผ๊ฐ€ ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•˜๋ ค๋ฉด LateUpdate()๋ฅผ ์‚ฌ์šฉํ•ด.

OnDestroy() ๐Ÿ’ฅ
์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ ํ˜ธ์ถœ๋ผ. ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ ๋“ฑ ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ํ•ด.

โฑ๏ธ ์‹คํ–‰ ์ˆœ์„œ ์š”์•ฝ 1. Awake() - ์Šคํฌ๋ฆฝํŠธ ์ธ์Šคํ„ด์Šค ๋กœ๋“œ ์‹œ
2. OnEnable() - ์˜ค๋ธŒ์ ํŠธ ํ™œ์„ฑํ™” ์‹œ
3. Start() - ์ฒซ ํ”„๋ ˆ์ž„ ์ „
4. FixedUpdate() - ๊ณ ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ (๋ฌผ๋ฆฌ ์—…๋ฐ์ดํŠธ)
5. Update() - ๋งค ํ”„๋ ˆ์ž„
6. LateUpdate() - Update() ํ›„
7. OnDisable() - ์˜ค๋ธŒ์ ํŠธ ๋น„ํ™œ์„ฑํ™” ์‹œ
8. OnDestroy() - ์˜ค๋ธŒ์ ํŠธ ํŒŒ๊ดด ์‹œ

์ด ์ˆœ์„œ๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด! ๐ŸŽฏ

๐Ÿ’พ C# ๊ธฐ๋ณธ ๋ฌธ๋ฒ•: ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…

์ด์ œ C# ์–ธ์–ด ์ž์ฒด์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณด์ž. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋ถ€ํ„ฐ ์‹œ์ž‘ํ• ๊ฒŒ! ๐Ÿ“Š

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…

C#์—๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์žˆ์–ด. ๊ฐ๊ฐ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ข…๋ฅ˜์™€ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ:

์ •์ˆ˜ํ˜• (Integer Types)
โ€ข int: 32๋น„ํŠธ ์ •์ˆ˜ (-2,147,483,648 ~ 2,147,483,647)
โ€ข long: 64๋น„ํŠธ ์ •์ˆ˜ (๋” ํฐ ๋ฒ”์œ„)
โ€ข short: 16๋น„ํŠธ ์ •์ˆ˜ (์ž‘์€ ๋ฒ”์œ„)
โ€ข byte: 8๋น„ํŠธ ์ •์ˆ˜ (0 ~ 255)

์‹ค์ˆ˜ํ˜• (Floating Point Types)
โ€ข float: 32๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์  (7์ž๋ฆฌ ์ •๋ฐ€๋„)
โ€ข double: 64๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์  (15์ž๋ฆฌ ์ •๋ฐ€๋„)
โ€ข decimal: 128๋น„ํŠธ ๊ณ ์ •์†Œ์ˆ˜์  (๊ธˆ์œต ๊ณ„์‚ฐ์šฉ)

๊ธฐํƒ€ ํƒ€์ž…
โ€ข bool: true ๋˜๋Š” false
โ€ข char: ๋‹จ์ผ ๋ฌธ์ž ('A', '๊ฐ€' ๋“ฑ)
โ€ข string: ๋ฌธ์ž์—ด ("Hello World")

// ๋ณ€์ˆ˜ ์„ ์–ธ ์˜ˆ์ œ
int playerHealth = 100;           // ํ”Œ๋ ˆ์ด์–ด ์ฒด๋ ฅ
float moveSpeed = 5.5f;           // ์ด๋™ ์†๋„ (f๋ฅผ ๋ถ™์—ฌ์•ผ ํ•จ!)
double preciseValue = 3.14159265; // ์ •๋ฐ€ํ•œ ๊ฐ’
bool isAlive = true;              // ์ƒ์กด ์—ฌ๋ถ€
char grade = 'A';                 // ๋“ฑ๊ธ‰
string playerName = "Hero";       // ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„

// ์ƒ์ˆ˜ ์„ ์–ธ (๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ)
const int MAX_HEALTH = 100;
const float GRAVITY = -9.81f;
โš ๏ธ ์ฃผ์˜: Unity์—์„œ float ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋’ค์— f๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ด! 5.5f์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด double๋กœ ์ธ์‹๋˜์–ด์„œ ํ˜•๋ณ€ํ™˜ ๊ฒฝ๊ณ ๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ์–ด.

๐ŸŽฏ Unity ์ „์šฉ ๋ฐ์ดํ„ฐ ํƒ€์ž…

Unity์—๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์ด ์žˆ์–ด. ์ด๊ฒƒ๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ํšจ์œจ์ ์ด ๋ผ! ๐Ÿš€

Vector (๋ฒกํ„ฐ)

๋ฒกํ„ฐ๋Š” 3D ๊ณต๊ฐ„์—์„œ์˜ ์œ„์น˜, ๋ฐฉํ–ฅ, ์†๋„ ๋“ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. Unity์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์•ผ!

Vector3 - 3์ฐจ์› ๋ฒกํ„ฐ (x, y, z)
์œ„์น˜, ํšŒ์ „, ํฌ๊ธฐ ๋“ฑ 3D ๊ณต๊ฐ„์˜ ๋ชจ๋“  ๊ฒƒ์„ ํ‘œํ˜„ํ•ด. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์ด์•ผ.

Vector2 - 2์ฐจ์› ๋ฒกํ„ฐ (x, y)
2D ๊ฒŒ์ž„์ด๋‚˜ UI ์œ„์น˜, ํ…์Šค์ฒ˜ ์ขŒํ‘œ ๋“ฑ์— ์‚ฌ์šฉํ•ด.

// Vector3 ์‚ฌ์šฉ ์˜ˆ์ œ
Vector3 position = new Vector3(0, 0, 0);        // ์›์ 
Vector3 forward = Vector3.forward;              // (0, 0, 1) - ์•ž ๋ฐฉํ–ฅ
Vector3 up = Vector3.up;                        // (0, 1, 0) - ์œ„ ๋ฐฉํ–ฅ
Vector3 right = Vector3.right;                  // (1, 0, 0) - ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ

// ๋ฒกํ„ฐ ์—ฐ์‚ฐ
Vector3 pointA = new Vector3(1, 2, 3);
Vector3 pointB = new Vector3(4, 5, 6);
Vector3 sum = pointA + pointB;                  // ๋ฒกํ„ฐ ๋ง์…ˆ
Vector3 scaled = pointA * 2;                    // ์Šค์นผ๋ผ ๊ณฑ
float distance = Vector3.Distance(pointA, pointB); // ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

// ์‹ค์ „ ํ™œ์šฉ
transform.position = new Vector3(0, 5, 0);      // ์˜ค๋ธŒ์ ํŠธ๋ฅผ (0, 5, 0)์œผ๋กœ ์ด๋™
transform.Translate(Vector3.forward * Time.deltaTime); // ์•ž์œผ๋กœ ์ด๋™

Quaternion (์ฟผํ„ฐ๋‹ˆ์–ธ)

ํšŒ์ „์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์ด์•ผ. ์ˆ˜ํ•™์ ์œผ๋กœ ๋ณต์žกํ•˜์ง€๋งŒ, Unity๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋‹ˆ๊นŒ ์‚ฌ์šฉ๋ฒ•๋งŒ ์•Œ๋ฉด ๋ผ! ๐Ÿ”„

// Quaternion ์‚ฌ์šฉ ์˜ˆ์ œ
Quaternion rotation = Quaternion.identity;      // ํšŒ์ „ ์—†์Œ (0, 0, 0)

// Euler ๊ฐ๋„๋กœ ํšŒ์ „ ์ƒ์„ฑ (๋„ ๋‹จ์œ„)
Quaternion rot = Quaternion.Euler(0, 90, 0);   // Y์ถ•์œผ๋กœ 90๋„ ํšŒ์ „

// ๋‘ ๋ฐฉํ–ฅ ์‚ฌ์ด์˜ ํšŒ์ „ ๊ณ„์‚ฐ
Vector3 targetDirection = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(targetDirection);

// ๋ถ€๋“œ๋Ÿฌ์šด ํšŒ์ „ (๋ณด๊ฐ„)
transform.rotation = Quaternion.Slerp(
    transform.rotation, 
    targetRotation, 
    Time.deltaTime * rotationSpeed
);

Color (์ƒ‰์ƒ)

์ƒ‰์ƒ์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์ด์•ผ. RGBA(๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘, ํˆฌ๋ช…๋„) ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋ผ ์žˆ์–ด.

// Color ์‚ฌ์šฉ ์˜ˆ์ œ
Color red = Color.red;                          // ๋นจ๊ฐ•
Color custom = new Color(1.0f, 0.5f, 0.0f);    // ์ฃผํ™ฉ์ƒ‰ (RGB 0~1 ๋ฒ”์œ„)
Color transparent = new Color(1, 1, 1, 0.5f);  // ๋ฐ˜ํˆฌ๋ช… ํฐ์ƒ‰

// ์‹ค์ „ ํ™œ์šฉ
Renderer renderer = GetComponent<Renderer>();
renderer.material.color = Color.green;          // ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ดˆ๋ก์ƒ‰์œผ๋กœ

๐Ÿ”€ ์ œ์–ด๋ฌธ: ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ

ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ฑฐ๋‚˜, ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ ธ! ๐ŸŽฎ

์กฐ๊ฑด๋ฌธ (if, else, switch)

// if-else ๋ฌธ
int health = 50;

if (health > 75)
{
    Debug.Log("์ฒด๋ ฅ์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค!");
}
else if (health > 25)
{
    Debug.Log("์ฒด๋ ฅ์ด ์ ˆ๋ฐ˜ ์ดํ•˜์ž…๋‹ˆ๋‹ค.");
}
else
{
    Debug.Log("์œ„ํ—˜! ์ฒด๋ ฅ์ด ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค!");
}

// switch ๋ฌธ
string weaponType = "Sword";

switch (weaponType)
{
    case "Sword":
        damage = 10;
        break;
    case "Bow":
        damage = 8;
        break;
    case "Magic":
        damage = 15;
        break;
    default:
        damage = 5;
        break;
}

// ์‚ผํ•ญ ์—ฐ์‚ฐ์ž (๊ฐ„๋‹จํ•œ ์กฐ๊ฑด๋ฌธ)
string status = (health > 0) ? "Alive" : "Dead";
int finalDamage = isCritical ? damage * 2 : damage;

๋ฐ˜๋ณต๋ฌธ (for, while, foreach)

// for ๋ฌธ - ์ •ํ•ด์ง„ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
for (int i = 0; i < 10; i++)
{
    Debug.Log("๋ฐ˜๋ณต ํšŸ์ˆ˜: " + i);
}

// while ๋ฌธ - ์กฐ๊ฑด์ด ์ฐธ์ธ ๋™์•ˆ ๋ฐ˜๋ณต
int count = 0;
while (count < 5)
{
    Debug.Log("์นด์šดํŠธ: " + count);
    count++;
}

// foreach ๋ฌธ - ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ์š”์†Œ ์ˆœํšŒ
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
foreach (GameObject enemy in enemies)
{
    Destroy(enemy); // ๋ชจ๋“  ์  ์ œ๊ฑฐ
}

// ์‹ค์ „ ์˜ˆ์ œ: ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ์— ๊ฐ™์€ ์ž‘์—… ์ ์šฉ
Transform[] children = GetComponentsInChildren<Transform>();
foreach (Transform child in children)
{
    child.localScale = Vector3.one * 2; // ๋ชจ๋“  ์ž์‹ ์˜ค๋ธŒ์ ํŠธ ํฌ๊ธฐ 2๋ฐฐ
}
๐Ÿ’ก ์„ฑ๋Šฅ ํŒ: Update() ์•ˆ์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ด! ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์‹คํ–‰๋˜๋‹ˆ๊นŒ ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด. ๊ฐ€๋Šฅํ•˜๋ฉด Start()๋‚˜ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

๐Ÿ“ฆ ์ปฌ๋ ‰์…˜: ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ปฌ๋ ‰์…˜์ด์•ผ. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ์—„์ฒญ ์ž์ฃผ ์“ฐ์ด๋‹ˆ๊นŒ ๊ผญ ์ตํ˜€๋‘์ž! ๐Ÿ“š

๋ฐฐ์—ด (Array)

๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ด์•ผ. ํ•œ ๋ฒˆ ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์–ด.

// ๋ฐฐ์—ด ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”
int[] scores = new int[5];              // ํฌ๊ธฐ 5์ธ ์ •์ˆ˜ ๋ฐฐ์—ด
scores[0] = 100;                        // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์— ๊ฐ’ ํ• ๋‹น
scores[1] = 95;

// ์ดˆ๊ธฐ๊ฐ’๊ณผ ํ•จ๊ป˜ ์„ ์–ธ
string[] playerNames = { "Alice", "Bob", "Charlie" };
float[] distances = new float[] { 1.5f, 2.3f, 3.7f };

// ๋ฐฐ์—ด ์ˆœํšŒ
for (int i = 0; i < scores.Length; i++)
{
    Debug.Log("์ ์ˆ˜ " + i + ": " + scores[i]);
}

// 2์ฐจ์› ๋ฐฐ์—ด (๋งต, ๊ทธ๋ฆฌ๋“œ ๋“ฑ์— ์œ ์šฉ)
int[,] map = new int[10, 10];           // 10x10 ๋งต
map[0, 0] = 1;                          // (0, 0) ์œ„์น˜์— ๊ฐ’ ์„ค์ •

// Unity์—์„œ ๋ฐฐ์—ด ํ™œ์šฉ
public GameObject[] enemies;            // Inspector์—์„œ ํ• ๋‹น ๊ฐ€๋Šฅ
public Transform[] waypoints;           // ๊ฒฝ๋กœ ์ง€์ ๋“ค

๋ฆฌ์ŠคํŠธ (List)

๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ์ปฌ๋ ‰์…˜์ด์•ผ. ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฐฐ์—ด๋ณด๋‹ค ์œ ์—ฐํ•ด!

using System.Collections.Generic; // List ์‚ฌ์šฉ์„ ์œ„ํ•ด ํ•„์š”

// ๋ฆฌ์ŠคํŠธ ์„ ์–ธ
List<int> inventory = new List<int>();
List<GameObject> activeEnemies = new List<GameObject>();

// ์š”์†Œ ์ถ”๊ฐ€
inventory.Add(1);                       // ์•„์ดํ…œ ID 1 ์ถ”๊ฐ€
inventory.Add(5);
inventory.Add(3);

// ์š”์†Œ ์ œ๊ฑฐ
inventory.Remove(5);                    // ๊ฐ’ 5 ์ œ๊ฑฐ
inventory.RemoveAt(0);                  // ์ธ๋ฑ์Šค 0 ์ œ๊ฑฐ

// ์š”์†Œ ์ ‘๊ทผ
int firstItem = inventory[0];
int count = inventory.Count;            // ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ

// ๊ฒ€์ƒ‰
bool hasItem = inventory.Contains(3);   // 3์ด ์žˆ๋Š”์ง€ ํ™•์ธ
int index = inventory.IndexOf(3);       // 3์˜ ์ธ๋ฑ์Šค ์ฐพ๊ธฐ

// ์ •๋ ฌ
inventory.Sort();                       // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
inventory.Reverse();                    // ์—ญ์ˆœ์œผ๋กœ

// ๋ชจ๋‘ ์ œ๊ฑฐ
inventory.Clear();

// ์‹ค์ „ ์˜ˆ์ œ: ์  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ
public class EnemyManager : MonoBehaviour
{
    private List<GameObject> enemies = new List<GameObject>();
    
    public void SpawnEnemy(GameObject enemyPrefab)
    {
        GameObject newEnemy = Instantiate(enemyPrefab);
        enemies.Add(newEnemy);
    }
    
    public void RemoveEnemy(GameObject enemy)
    {
        enemies.Remove(enemy);
        Destroy(enemy);
    }
    
    public void RemoveAllEnemies()
    {
        foreach (GameObject enemy in enemies)
        {
            Destroy(enemy);
        }
        enemies.Clear();
    }
}
๐ŸŽฏ ๋ฐฐ์—ด vs ๋ฆฌ์ŠคํŠธ ์„ ํƒ ๊ฐ€์ด๋“œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ:
โ€ข ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์„ ๋•Œ
โ€ข ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•  ๋•Œ (์•ฝ๊ฐ„ ๋” ๋น ๋ฆ„)
โ€ข Inspector์—์„œ ์‰ฝ๊ฒŒ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์„ ๋•Œ

๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ:
โ€ข ํฌ๊ธฐ๊ฐ€ ๋™์ ์œผ๋กœ ๋ณ€ํ•  ๋•Œ
โ€ข ์š”์†Œ๋ฅผ ์ž์ฃผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•  ๋•Œ
โ€ข ์ •๋ ฌ, ๊ฒ€์ƒ‰ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—” ๋ฐฐ์—ด๋„ ์ถฉ๋ถ„ํ•ด!

๐ŸŽจ ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)์™€ ๋งค๊ฐœ๋ณ€์ˆ˜

ํ•จ์ˆ˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด์•ผ. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด์ง€! ๐Ÿ› ๏ธ

ํ•จ์ˆ˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

// ๊ธฐ๋ณธ ํ•จ์ˆ˜ (๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ)
void SayHello()
{
    Debug.Log("Hello, Unity!");
}

// ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜
void Greet(string name)
{
    Debug.Log("์•ˆ๋…•ํ•˜์„ธ์š”, " + name + "๋‹˜!");
}

// ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜
int Add(int a, int b)
{
    return a + b;
}

// ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’
float CalculateDamage(float baseDamage, float multiplier, bool isCritical)
{
    float damage = baseDamage * multiplier;
    if (isCritical)
    {
        damage *= 2;
    }
    return damage;
}

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
void Start()
{
    SayHello();                                 // ์ถœ๋ ฅ: Hello, Unity!
    Greet("ํ”Œ๋ ˆ์ด์–ด");                          // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”, ํ”Œ๋ ˆ์ด์–ด๋‹˜!
    
    int sum = Add(5, 3);                        // sum = 8
    float finalDamage = CalculateDamage(10, 1.5f, true); // 30
}

๊ณ ๊ธ‰ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ

// ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ (์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜)
void TakeDamage(int damage, bool showEffect = true)
{
    health -= damage;
    if (showEffect)
    {
        PlayHitEffect();
    }
}

// ํ˜ธ์ถœ ๋ฐฉ๋ฒ•
TakeDamage(10);              // showEffect๋Š” true (๊ธฐ๋ณธ๊ฐ’)
TakeDamage(10, false);       // showEffect๋ฅผ false๋กœ ์ง€์ •

// ref ํ‚ค์›Œ๋“œ (์ฐธ์กฐ๋กœ ์ „๋‹ฌ)
void ModifyValue(ref int value)
{
    value = value * 2;
}

int number = 5;
ModifyValue(ref number);     // number๋Š” ์ด์ œ 10

// out ํ‚ค์›Œ๋“œ (์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜)
bool TryGetComponent(out Rigidbody rb)
{
    rb = GetComponent<Rigidbody>();
    return rb != null;
}

// ์‚ฌ์šฉ ์˜ˆ
Rigidbody myRb;
if (TryGetComponent(out myRb))
{
    myRb.AddForce(Vector3.up * 10);
}

// ์˜ค๋ฒ„๋กœ๋”ฉ (๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜)
void Attack()
{
    // ๊ธฐ๋ณธ ๊ณต๊ฒฉ
}

void Attack(GameObject target)
{
    // ํŠน์ • ๋Œ€์ƒ ๊ณต๊ฒฉ
}

void Attack(GameObject target, int damage)
{
    // ํŠน์ • ๋Œ€์ƒ์—๊ฒŒ ํŠน์ • ๋ฐ๋ฏธ์ง€
}
๐Ÿ’ก ํ•จ์ˆ˜ ์ž‘์„ฑ ํŒ: 1. ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ด
2. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ (์˜ˆ: CalculateDamage, MovePlayer)
3. ๋„ˆ๋ฌด ๊ธด ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ 
4. ์ฃผ์„์„ ๋‹ฌ์•„์„œ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์„ ์„ค๋ช…ํ•ด
5. ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด!

๐Ÿ—๏ธ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์€ C#์˜ ํ•ต์‹ฌ์ด์•ผ. ๊ฒŒ์ž„์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด์ง€. ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์›Œ๋ณด์ž! ๐ŸŽ“

ํด๋ž˜์Šค ๊ธฐ๋ณธ ๊ฐœ๋…

ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ์„ค๊ณ„๋„์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, "์ " ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๊ทธ ์„ค๊ณ„๋„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ ์  ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

// ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค ์ •์˜
public class Enemy
{
    // ํ•„๋“œ (๋ฉค๋ฒ„ ๋ณ€์ˆ˜)
    public string enemyName;
    public int health;
    public int attackPower;
    
    // ์ƒ์„ฑ์ž (๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ํ˜ธ์ถœ)
    public Enemy(string name, int hp, int attack)
    {
        enemyName = name;
        health = hp;
        attackPower = attack;
    }
    
    // ๋ฉ”์„œ๋“œ (๋ฉค๋ฒ„ ํ•จ์ˆ˜)
    public void TakeDamage(int damage)
    {
        health -= damage;
        if (health <= 0)
        {
            Die();
        }
    }
    
    public void Attack(Player target)
    {
        target.TakeDamage(attackPower);
    }
    
    private void Die()
    {
        Debug.Log(enemyName + "์ด(๊ฐ€) ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค!");
    }
}

// ํด๋ž˜์Šค ์‚ฌ์šฉ
Enemy goblin = new Enemy("๊ณ ๋ธ”๋ฆฐ", 50, 10);
Enemy dragon = new Enemy("๋“œ๋ž˜๊ณค", 200, 50);

goblin.TakeDamage(30);  // ๊ณ ๋ธ”๋ฆฐ์ด 30 ๋ฐ๋ฏธ์ง€๋ฅผ ๋ฐ›์Œ
dragon.Attack(player);  // ๋“œ๋ž˜๊ณค์ด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ณต๊ฒฉ

ํ”„๋กœํผํ‹ฐ (Property)

ํ”„๋กœํผํ‹ฐ๋Š” ํ•„๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด์•ผ. ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์ถ”๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด.

public class Player
{
    // private ํ•„๋“œ
    private int health;
    private int maxHealth = 100;
    
    // ํ”„๋กœํผํ‹ฐ (get, set)
    public int Health
    {
        get { return health; }
        set 
        { 
            health = Mathf.Clamp(value, 0, maxHealth); // 0~100 ๋ฒ”์œ„๋กœ ์ œํ•œ
            UpdateHealthUI(); // UI ์—…๋ฐ์ดํŠธ
        }
    }
    
    // ์ž๋™ ํ”„๋กœํผํ‹ฐ (๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ)
    public string PlayerName { get; set; }
    
    // ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ
    public int MaxHealth 
    { 
        get { return maxHealth; } 
    }
    
    // ๊ณ„์‚ฐ๋œ ํ”„๋กœํผํ‹ฐ
    public float HealthPercentage
    {
        get { return (float)health / maxHealth * 100; }
    }
    
    private void UpdateHealthUI()
    {
        // UI ์—…๋ฐ์ดํŠธ ๋กœ์ง
    }
}

// ์‚ฌ์šฉ ์˜ˆ
Player player = new Player();
player.Health = 50;              // set ํ˜ธ์ถœ
int currentHP = player.Health;   // get ํ˜ธ์ถœ
player.Health = 150;             // 100์œผ๋กœ ์ œํ•œ๋จ (Clamp)

์ƒ์† (Inheritance)

๊ธฐ์กด ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์˜ ํ•ต์‹ฌ์ด์ง€!

// ๊ธฐ๋ณธ ํด๋ž˜์Šค (๋ถ€๋ชจ ํด๋ž˜์Šค)
public class Character
{
    public string name;
    public int health;
    public int level;
    
    public virtual void Attack()
    {
        Debug.Log(name + "์ด(๊ฐ€) ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค!");
    }
    
    public void TakeDamage(int damage)
    {
        health -= damage;
    }
}

// ํŒŒ์ƒ ํด๋ž˜์Šค (์ž์‹ ํด๋ž˜์Šค)
public class Warrior : Character
{
    public int armor;
    
    // ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ (์žฌ์ •์˜)
    public override void Attack()
    {
        Debug.Log(name + "์ด(๊ฐ€) ๊ฒ€์œผ๋กœ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค!");
    }
    
    // ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    public void DefensiveStance()
    {
        armor += 10;
        Debug.Log("๋ฐฉ์–ด ํƒœ์„ธ!");
    }
}

public class Mage : Character
{
    public int mana;
    
    public override void Attack()
    {
        if (mana >= 10)
        {
            Debug.Log(name + "์ด(๊ฐ€) ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•ฉ๋‹ˆ๋‹ค!");
            mana -= 10;
        }
    }
    
    public void CastSpell(string spellName)
    {
        Debug.Log(name + "์ด(๊ฐ€) " + spellName + " ์ฃผ๋ฌธ์„ ์‹œ์ „!");
    }
}

// ์‚ฌ์šฉ ์˜ˆ
Warrior warrior = new Warrior();
warrior.name = "์ „์‚ฌ";
warrior.health = 150;
warrior.armor = 50;
warrior.Attack();           // "์ „์‚ฌ์ด(๊ฐ€) ๊ฒ€์œผ๋กœ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค!"
warrior.DefensiveStance();  // Warrior๋งŒ์˜ ๋ฉ”์„œ๋“œ

Mage mage = new Mage();
mage.name = "๋งˆ๋ฒ•์‚ฌ";
mage.health = 80;
mage.mana = 100;
mage.Attack();              // "๋งˆ๋ฒ•์‚ฌ์ด(๊ฐ€) ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•ฉ๋‹ˆ๋‹ค!"
mage.CastSpell("ํŒŒ์ด์–ด๋ณผ"); // Mage๋งŒ์˜ ๋ฉ”์„œ๋“œ
๐ŸŽฏ ๊ฐ์ฒด์ง€ํ–ฅ์˜ 4๋Œ€ ์›์น™ 1. ์บก์Аํ™” (Encapsulation)
๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ , ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ณดํ˜ธํ•ด. private, public ๊ฐ™์€ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ•ด.

2. ์ƒ์† (Inheritance)
๊ธฐ์กด ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ํ™•์žฅํ•ด. ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด.

3. ๋‹คํ˜•์„ฑ (Polymorphism)
๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋Œ€ํ‘œ์ ์ด์•ผ.

4. ์ถ”์ƒํ™” (Abstraction)
๋ณต์žกํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ธฐ๊ณ  ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๋…ธ์ถœํ•ด. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด.

๐ŸŽฎ Unity ์‹ค์ „ ์˜ˆ์ œ: ๊ฐ„๋‹จํ•œ ์ŠˆํŒ… ๊ฒŒ์ž„

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ์ŠˆํŒ… ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด๋ณด์ž! ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์›€์ง์ด๊ณ , ์ด์•Œ์„ ๋ฐœ์‚ฌํ•˜๊ณ , ์ ์„ ์ฒ˜์น˜ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฒŒ์ž„์ด์•ผ. ๐Ÿš€

1. ํ”Œ๋ ˆ์ด์–ด ์ปจํŠธ๋กค๋Ÿฌ

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header("์ด๋™ ์„ค์ •")]
    public float moveSpeed = 5f;
    public float rotationSpeed = 720f;
    
    [Header("๋ฐœ์‚ฌ ์„ค์ •")]
    public GameObject bulletPrefab;
    public Transform firePoint;
    public float fireRate = 0.5f;
    
    private float nextFireTime = 0f;
    private Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void Update()
    {
        HandleMovement();
        HandleRotation();
        HandleShooting();
    }
    
    void HandleMovement()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        Vector3 movement = new Vector3(horizontal, 0, vertical);
        movement = movement.normalized * moveSpeed * Time.deltaTime;
        
        transform.Translate(movement, Space.World);
    }
    
    void HandleRotation()
    {
        // ๋งˆ์šฐ์Šค ์œ„์น˜๋กœ ํšŒ์ „
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        
        if (Physics.Raycast(ray, out hit))
        {
            Vector3 targetDirection = hit.point - transform.position;
            targetDirection.y = 0;
            
            if (targetDirection != Vector3.zero)
            {
                Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
                transform.rotation = Quaternion.RotateTowards(
                    transform.rotation, 
                    targetRotation, 
                    rotationSpeed * Time.deltaTime
                );
            }
        }
    }
    
    void HandleShooting()
    {
        if (Input.GetButton("Fire1") && Time.time >= nextFireTime)
        {
            Shoot();
            nextFireTime = Time.time + fireRate;
        }
    }
    
    void Shoot()
    {
        if (bulletPrefab != null && firePoint != null)
        {
            Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        }
    }
}

2. ์ด์•Œ ์Šคํฌ๋ฆฝํŠธ

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 20f;
    public int damage = 10;
    public float lifetime = 3f;
    
    private Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.velocity = transform.forward * speed;
        
        // ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ž๋™ ํŒŒ๊ดด
        Destroy(gameObject, lifetime);
    }
    
    void OnCollisionEnter(Collision collision)
    {
        // ์ ๊ณผ ์ถฉ๋Œํ–ˆ๋Š”์ง€ ํ™•์ธ
        Enemy enemy = collision.gameObject.GetComponent<Enemy>();
        if (enemy != null)
        {
            enemy.TakeDamage(damage);
        }
        
        // ์ด์•Œ ํŒŒ๊ดด
        Destroy(gameObject);
    }
}

3. ์  AI ์Šคํฌ๋ฆฝํŠธ

using UnityEngine;

public class Enemy : MonoBehaviour
{
    [Header("์Šคํƒฏ")]
    public int maxHealth = 50;
    public int currentHealth;
    public float moveSpeed = 3f;
    public int damage = 10;
    
    [Header("AI ์„ค์ •")]
    public float detectionRange = 10f;
    public float attackRange = 2f;
    public float attackCooldown = 1f;
    
    private Transform player;
    private float nextAttackTime = 0f;
    
    void Start()
    {
        currentHealth = maxHealth;
        player = GameObject.FindGameObjectWithTag("Player")?.transform;
    }
    
    void Update()
    {
        if (player == null) return;
        
        float distanceToPlayer = Vector3.Distance(transform.position, player.position);
        
        if (distanceToPlayer <= detectionRange)
        {
            if (distanceToPlayer > attackRange)
            {
                // ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ–ฅํ•ด ์ด๋™
                MoveTowardsPlayer();
            }
            else
            {
                // ๊ณต๊ฒฉ ๋ฒ”์œ„ ์•ˆ์— ์žˆ์œผ๋ฉด ๊ณต๊ฒฉ
                if (Time.time >= nextAttackTime)
                {
                    AttackPlayer();
                    nextAttackTime = Time.time + attackCooldown;
                }
            }
        }
    }
    
    void MoveTowardsPlayer()
    {
        Vector3 direction = (player.position - transform.position).normalized;
        direction.y = 0; // ์ˆ˜ํ‰ ์ด๋™๋งŒ
        
        transform.position += direction * moveSpeed * Time.deltaTime;
        transform.LookAt(new Vector3(player.position.x, transform.position.y, player.position.z));
    }
    
    void AttackPlayer()
    {
        PlayerHealth playerHealth = player.GetComponent<PlayerHealth>();
        if (playerHealth != null)
        {
            playerHealth.TakeDamage(damage);
            Debug.Log("์ ์ด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ณต๊ฒฉ!");
        }
    }
    
    public void TakeDamage(int damageAmount)
    {
        currentHealth -= damageAmount;
        Debug.Log("์ ์ด " + damageAmount + " ๋ฐ๋ฏธ์ง€๋ฅผ ๋ฐ›์Œ! ๋‚จ์€ ์ฒด๋ ฅ: " + currentHealth);
        
        if (currentHealth <= 0)
        {
            Die();
        }
    }
    
    void Die()
    {
        Debug.Log("์ ์ด ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค!");
        // ์—ฌ๊ธฐ์— ์ฃฝ์Œ ์ดํŽ™ํŠธ, ์ ์ˆ˜ ์ถ”๊ฐ€ ๋“ฑ์„ ๊ตฌํ˜„
        Destroy(gameObject);
    }
    
    // ๋””๋ฒ„๊ทธ์šฉ - Scene ๋ทฐ์—์„œ ๋ฒ”์œ„ ํ‘œ์‹œ
    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, detectionRange);
        
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, attackRange);
    }
}

4. ํ”Œ๋ ˆ์ด์–ด ์ฒด๋ ฅ ๊ด€๋ฆฌ

using UnityEngine;
using UnityEngine.UI;

public class PlayerHealth : MonoBehaviour
{
    public int maxHealth = 100;
    public int currentHealth;
    
    public Slider healthBar; // UI ์ฒด๋ ฅ๋ฐ”
    
    void Start()
    {
        currentHealth = maxHealth;
        UpdateHealthBar();
    }
    
    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
        
        Debug.Log("ํ”Œ๋ ˆ์ด์–ด ์ฒด๋ ฅ: " + currentHealth + "/" + maxHealth);
        UpdateHealthBar();
        
        if (currentHealth <= 0)
        {
            Die();
        }
    }
    
    public void Heal(int amount)
    {
        currentHealth += amount;
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
        UpdateHealthBar();
    }
    
    void UpdateHealthBar()
    {
        if (healthBar != null)
        {
            healthBar.value = (float)currentHealth / maxHealth;
        }
    }
    
    void Die()
    {
        Debug.Log("ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค!");
        // ๊ฒŒ์ž„ ์˜ค๋ฒ„ ์ฒ˜๋ฆฌ
        Time.timeScale = 0; // ๊ฒŒ์ž„ ์ผ์‹œ์ •์ง€
    }
}
๐ŸŽฎ ๊ฒŒ์ž„ ์ œ์ž‘ ํŒ: 1. ํ”„๋ฆฌํŒน ํ™œ์šฉ: ์ด์•Œ๊ณผ ์ ์„ ํ”„๋ฆฌํŒน์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์žฌ์‚ฌ์šฉํ•ด
2. ๋ ˆ์ด์–ด ์„ค์ •: ์ด์•Œ์ด ํ”Œ๋ ˆ์ด์–ด์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ•ด
3. ํƒœ๊ทธ ์‚ฌ์šฉ: "Player", "Enemy", "Ground" ๋“ฑ ํƒœ๊ทธ๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•ด
4. UI ์ถ”๊ฐ€: Canvas๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฒด๋ ฅ๋ฐ”, ์ ์ˆ˜ ๋“ฑ์„ ํ‘œ์‹œํ•ด
5. ์ดํŽ™ํŠธ: ํŒŒํ‹ฐํด ์‹œ์Šคํ…œ์œผ๋กœ ์ด์•Œ ๋ฐœ์‚ฌ, ํญ๋ฐœ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ๋ฉ‹์ ธ!

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

๊ฒŒ์ž„์ด ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด! ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ์„ ์•Œ์•„๋ณด์ž. โšก

Update() ์ตœ์ ํ™”

Update()๋Š” ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์‹คํ–‰๋˜๋‹ˆ๊นŒ ์ตœ์ ํ™”๊ฐ€ ์ •๋ง ์ค‘์š”ํ•ด!

// โŒ ๋‚˜์œ ์˜ˆ - ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ ์ฐพ๊ธฐ
void Update()
{
    Rigidbody rb = GetComponent<Rigidbody>(); // ๋น„ํšจ์œจ์ !
    rb.AddForce(Vector3.up);
}

// โœ… ์ข‹์€ ์˜ˆ - ํ•œ ๋ฒˆ๋งŒ ์ฐพ์•„์„œ ์บ์‹ฑ
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>(); // ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰
}

void Update()
{
    rb.AddForce(Vector3.up); // ๋น ๋ฆ„!
}

// โŒ ๋‚˜์œ ์˜ˆ - ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ
void Update()
{
    GameObject player = GameObject.Find("Player"); // ๋งค์šฐ ๋А๋ฆผ!
    float distance = Vector3.Distance(transform.position, player.transform.position);
}

// โœ… ์ข‹์€ ์˜ˆ - ํ•„์š”ํ•  ๋•Œ๋งŒ ์—ฐ์‚ฐ
private Transform playerTransform;
private float checkInterval = 0.5f;
private float nextCheckTime = 0f;

void Start()
{
    playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
}

void Update()
{
    if (Time.time >= nextCheckTime)
    {
        float distance = Vector3.Distance(transform.position, playerTransform.position);
        // ๊ฑฐ๋ฆฌ ์ฒดํฌ ๋กœ์ง
        nextCheckTime = Time.time + checkInterval;
    }
}

์˜ค๋ธŒ์ ํŠธ ํ’€๋ง (Object Pooling)

์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ณ„์† ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๋Œ€์‹ , ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด์•ผ. ํŠนํžˆ ์ด์•Œ, ์ดํŽ™ํŠธ ๊ฐ™์€ ๊ฒƒ์— ์œ ์šฉํ•ด!

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int poolSize = 20;
    
    private Queue<GameObject> pool = new Queue<GameObject>();
    
    void Start()
    {
        // ๋ฏธ๋ฆฌ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab);
            obj.SetActive(false);
            pool.Enqueue(obj);
        }
    }
    
    public GameObject GetObject()
    {
        if (pool.Count > 0)
        {
            GameObject obj = pool.Dequeue();
            obj.SetActive(true);
            return obj;
        }
        else
        {
            // ํ’€์ด ๋น„์—ˆ์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ
            return Instantiate(prefab);
        }
    }
    
    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);
        pool.Enqueue(obj);
    }
}

// ์‚ฌ์šฉ ์˜ˆ
public class BulletSpawner : MonoBehaviour
{
    public ObjectPool bulletPool;
    
    void Shoot()
    {
        GameObject bullet = bulletPool.GetObject();
        bullet.transform.position = firePoint.position;
        bullet.transform.rotation = firePoint.rotation;
        
        // 3์ดˆ ํ›„ ํ’€๋กœ ๋ฐ˜ํ™˜
        StartCoroutine(ReturnAfterDelay(bullet, 3f));
    }
    
    IEnumerator ReturnAfterDelay(GameObject obj, float delay)
    {
        yield return new WaitForSeconds(delay);
        bulletPool.ReturnObject(obj);
    }
}
โšก ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ ์ตœ์ ํ™”:
โœ… GetComponent()๋Š” Start()์—์„œ ์บ์‹ฑ
โœ… Find ๊ณ„์—ด ํ•จ์ˆ˜๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ์‚ฌ์šฉ
โœ… Update()์—์„œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ ํ”ผํ•˜๊ธฐ
โœ… ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์€ StringBuilder ์‚ฌ์šฉ
โœ… ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์ž‘์—… ๋ถ„์‚ฐ

๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”:
โœ… ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง ์‚ฌ์šฉ
โœ… ๋ถˆํ•„์š”ํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ๊ดด
โœ… ํ…์Šค์ฒ˜ ์••์ถ• ์‚ฌ์šฉ
โœ… ์˜ค๋””์˜ค ํด๋ฆฝ ์••์ถ•

๋ Œ๋”๋ง ์ตœ์ ํ™”:
โœ… ๋ฐฐ์นญ(Batching) ํ™œ์šฉ
โœ… LOD(Level of Detail) ์‚ฌ์šฉ
โœ… ์˜คํด๋ฃจ์ „ ์ปฌ๋ง(Occlusion Culling)
โœ… ๋ผ์ดํŠธ๋งต ๋ฒ ์ดํ‚น

๐Ÿ“š ๋” ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด?

์—ฌ๊ธฐ๊นŒ์ง€ Unity์™€ C#์˜ ๊ธฐ์ดˆ๋ฅผ ๋ชจ๋‘ ๋ฐฐ์› ์–ด! ํ•˜์ง€๋งŒ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ์–ด. ๊ณ„์† ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์ถ”์ฒœํ•ด! ๐ŸŽ“

์ถ”์ฒœ ํ•™์Šต ๊ฒฝ๋กœ

1๋‹จ๊ณ„: ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ
โ€ข Unity ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ (learn.unity.com)
โ€ข C# ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์™„๋ฒฝํžˆ ์ตํžˆ๊ธฐ
โ€ข ๊ฐ„๋‹จํ•œ 2D/3D ๊ฒŒ์ž„ ๋”ฐ๋ผ ๋งŒ๋“ค๊ธฐ
โ€ข Unity ์—๋””ํ„ฐ ๊ธฐ๋Šฅ ์ˆ™๋‹ฌ

2๋‹จ๊ณ„: ์ค‘๊ธ‰ ๊ฐœ๋…
โ€ข ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์Šคํ…œ (Animator, Animation Clip)
โ€ข UI ์‹œ์Šคํ…œ (Canvas, UI ์ด๋ฒคํŠธ)
โ€ข ํŒŒํ‹ฐํด ์‹œ์Šคํ…œ (์ดํŽ™ํŠธ ์ œ์ž‘)
โ€ข ์‚ฌ์šด๋“œ ์‹œ์Šคํ…œ (Audio Source, Mixer)
โ€ข ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ์Šคํ…œ (NavMesh, AI ๊ฒฝ๋กœ ์ฐพ๊ธฐ)
โ€ข ๋ฌผ๋ฆฌ ์—”์ง„ ์‹ฌํ™” (Joint, Ragdoll)

3๋‹จ๊ณ„: ๊ณ ๊ธ‰ ์ฃผ์ œ
โ€ข ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Shader Graph, HLSL)
โ€ข ๋„คํŠธ์›Œํ‚น (๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„)
โ€ข ์ตœ์ ํ™” ๊ธฐ๋ฒ• (ํ”„๋กœํŒŒ์ผ๋ง, ๋ฐฐ์นญ)
โ€ข ๋””์ž์ธ ํŒจํ„ด (์‹ฑ๊ธ€ํ†ค, ์˜ต์ €๋ฒ„, ํŒฉํ† ๋ฆฌ ๋“ฑ)
โ€ข ์—๋””ํ„ฐ ํ™•์žฅ (์ปค์Šคํ…€ ํˆด ์ œ์ž‘)
โ€ข ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ (๊ฐ ํ”Œ๋žซํผ๋ณ„ ์ตœ์ ํ™”)

์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค

๊ณต์‹ ๋ฌธ์„œ:
โ€ข Unity Documentation (docs.unity3d.com)
โ€ข Unity Scripting API (docs.unity3d.com/ScriptReference)
โ€ข Microsoft C# Documentation

์ปค๋ฎค๋‹ˆํ‹ฐ:
โ€ข Unity Forum
โ€ข Unity Korea ํŽ˜์ด์Šค๋ถ ๊ทธ๋ฃน
โ€ข Stack Overflow
โ€ข Reddit r/Unity3D

์—์…‹ ์Šคํ† ์–ด:
โ€ข ๋ฌด๋ฃŒ ์—์…‹์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ
โ€ข ์Šคํƒ€ํ„ฐ ํŒฉ ํ™œ์šฉ
โ€ข ์„ธ์ผ ๊ธฐ๊ฐ„ ํ™œ์šฉ

๐ŸŽฏ ํ•™์Šต ํŒ: ํŠœํ† ๋ฆฌ์–ผ๋งŒ ๋”ฐ๋ผํ•˜์ง€ ๋ง๊ณ , ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‘์šฉํ•ด์„œ ์ž์‹ ๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ด! ์‹ค์ œ๋กœ ๋งŒ๋“ค๋ฉด์„œ ๋ถ€๋”ชํžˆ๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฑฐ์•ผ. ๊ทธ๋ฆฌ๊ณ  ์žฌ๋Šฅ๋„ท์—์„œ ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ฉ˜ํ† ๋ง์„ ๋ฐ›์œผ๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด!

๐ŸŽ‰ ๋งˆ์น˜๋ฉฐ

์™€! ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ง€? ๐Ÿ˜… Unity ๊ฒŒ์ž„ ์—”์ง„์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ C# ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์‹ค์ „ ์˜ˆ์ œ๊นŒ์ง€ ์ •๋ง ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜์–ด. ์ฒ˜์Œ์—” ์–ด๋ ต๊ณ  ๋ณต์žกํ•ด ๋ณด์˜€์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ! ๐ŸŽฎ

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์€ ์ฐฝ์˜์„ฑ๊ณผ ๊ธฐ์ˆ ์ด ๋งŒ๋‚˜๋Š” ๋ฉ‹์ง„ ๋ถ„์•ผ์•ผ. ๋‹น์‹ ์˜ ์ƒ์ƒ๋ ฅ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด. ์ฒ˜์Œ์—” ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ์ ์  ๋” ๋ณต์žกํ•˜๊ณ  ์žฌ๋ฏธ์žˆ๋Š” ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด ๋ผ. ๐Ÿš€

๊ธฐ์–ตํ•ด! ๋ชจ๋“  ์ „๋ฌธ๊ฐ€๋„ ์ฒ˜์Œ์—” ์ดˆ๋ณด์ž์˜€์–ด. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ณ  ์ขŒ์ ˆํ•˜์ง€ ๋ง๊ณ , ๊ทธ๊ฑธ ๋ฐฐ์›€์˜ ๊ธฐํšŒ๋กœ ์‚ผ์•„. ๊ตฌ๊ธ€๋งํ•˜๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์งˆ๋ฌธํ•˜๊ณ , ๊ณ„์† ์‹œ๋„ํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ฆฌ๊ณ  ํ˜ผ์ž ํ•˜๊ธฐ ํž˜๋“ค ๋•Œ๋Š” ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ๐Ÿ’ช

์ด์ œ Unity๋ฅผ ์—ด๊ณ , ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ด. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ํ•˜๋‚˜์”ฉ ์‹ค์Šตํ•ด๋ณด์ž. ์ž‘์€ ํ๋ธŒ๋ฅผ ์›€์ง์ด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ์ ํ”„ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์ด์•Œ์„ ๋ฐœ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ... ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ์Œ“์•„๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๋ฉ‹์ง„ ๊ฒŒ์ž„์ด ์™„์„ฑ๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ! ๐ŸŽจ

๋‹น์‹ ์˜ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ์—ฌ์ •์„ ์‘์›ํ• ๊ฒŒ! ํ™”์ดํŒ…! ๐ŸŽ‰โœจ

GAME OVER? NO! GAME START! Your Journey Begins Now
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.