์๋ ํ์ธ์, ์ค๋ ์ฃผ์ ๋ ๋ฐ๋ก '๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ๋๋ค!
๊ฒ์ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ํด๊ฒฐํ๋ ์ํฉ์ด ์ต๋๋ค. ๊ทธ๋๋ง๋ค ํด๊ฒฐํ๋ ๊ฑด ๋นํจ์จ์ ์ด๊ณ , ์ฝ๋๊ฐ ๋ณต์กํด์ง์๋ก ์ ์ง๋ณด์๋ ์ด๋ ค์์ง๋๋ค. ์ด๋ฐ ๊ณ ๋ฏผ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด(Game Programming Patterns) ์ ๋๋ค. ์ค๋์ ๋ก๋ฒํธ ๋์ด์คํธ๋กฌ(Robert Nystrom)์ ์ ์ "Game Programming Patterns"์ ๋ฐํ์ผ๋ก ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ด๋ ๋ฌด์์ธ์ง, ๋์์ธ ํจํด๊ณผ์ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ค์ ๊ฒ์์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ด๋?
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ๊ฒ์ ๊ฐ๋ฐ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ค๊ณ ๊ธฐ๋ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ํํธ์จ์ด ๋์์ธ ํจํด๊ณผ ๋น์ทํ์ง๋ง, ๊ฒ์ ๊ฐ๋ฐ์ ํน์ํ ์๊ตฌ ์ฌํญ(์ค์๊ฐ ๋ ๋๋ง, ์ฑ๋ฅ ์ต์ ํ, ์ํ ๊ด๋ฆฌ ๋ฑ)์ ๋ง์ถฐ ์ ์ฉ๋ฉ๋๋ค. ๋ ๋ค์ํ ํจํด์ ์๊ฐํ๋ฉฐ, ๊ฐ ํจํด์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ทธ๋ฆฌ๊ณ ์ ํ์ํ์ง๋ฅผ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ํต์ฌ ๋ชฉํ
- ์ฑ๋ฅ ์ต์ ํ: ๊ฐ์ฒด ํ๋ง(Object Pooling), ํ๋ผ์ด์จ์ดํธ(Flyweight) ๋ฑ์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํฉ๋๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด์ฑ: ๊ฒ์์ด ๋ณต์กํด์ง์๋ก ์ฝ๋๊ฐ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๋๋ฐ, ํจํด์ ํ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ชจ๋ํํ๊ณ ํ์ฅ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
- ๊ฒ์ ๋ก์ง์ ๊ตฌ์กฐํ: ์ด๋ฒคํธ ํ(Event Queue), ์ํ ํจํด(State Pattern) ๋ฑ์ ํ์ฉํ์ฌ ๊ฒ์์ ํ๋ฆ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ: ํ ๋ฒ ์ ์ํ ํจํด์ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ํ์ฉํ ์ ์์ด ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด๊ณผ ๋์์ธ ํจํด์ ๊ด๊ณ
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ํํ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด(Design Patterns) ๊ณผ ๋ฐ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ๋์์ธ ํจํด์ GoF(Gang of Four) ๋์์ธ ํจํด์ผ๋ก ๋๋ฆฌ ์๋ ค์ ธ ์์ผ๋ฉฐ, ๊ฒ์ ๊ฐ๋ฐ์์๋ ์ ์ฉํ๊ฒ ํ์ฉ๋ฉ๋๋ค.
ํ์ง๋ง, ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ผ๋ฐ์ ์ธ ๋์์ธ ํจํด๋ณด๋ค ์ฑ๋ฅ ์ต์ ํ, ๊ฒ์ ๋ฃจํ, AI, ์ํ ๊ด๋ฆฌ, ์์ ๊ด๋ฆฌ ๋ฑ์ ๊ฒ์ ๊ฐ๋ฐ ํนํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ธํค(Singleton) ํจํด์ ์ผ๋ฐ ์ํํธ์จ์ด ๊ฐ๋ฐ์์๋ ๋จ์ฉ์ ํผํด์ผ ํ์ง๋ง, ๊ฒ์ ๊ฐ๋ฐ์์๋ ๊ธ๋ก๋ฒ ๋งค๋์ ํด๋์ค(์: ์ค๋์ค ๋งค๋์ , ์ ๋ ฅ ๋งค๋์ )๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด ์ข ๋ฅ
๊ฒ์ ๊ฐ๋ฐ์์ ๋ง์ด ์ฐ์ด๋ ํจํด๋ค์ ๋ช ๊ฐ์ง ์๊ฐํด๋ณผ๊ฒ์.
1๏ธโฃ ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ์ฑ๊ธํค(Singleton): ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ์กด์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ์ค๋์ค ๋งค๋์ , ์ ๋ ฅ ๋งค๋์ ).
- ๊ฐ์ฒด ํ๋ง(Object Pooling): ๋น๋ฒํ๊ฒ ์์ฑ ๋ฐ ์ญ์ ๋๋ ๊ฐ์ฒด(์: ์ด์, ์ดํํธ)๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ฑ๋ฅ์ ์ต์ ํ.
2๏ธโฃ ๊ฒ์ ๋ฃจํ ๋ฐ ์คํ ํ๋ฆ
- ๊ฒ์ ๋ฃจํ(Game Loop): ํ๋ ์ ๋จ์๋ก ๊ฒ์์ ์ ๋ฐ์ดํธํ๋ ํต์ฌ ํจํด.
- ์ด๋ฒคํธ ํ(Event Queue): ๊ฒ์ ๋ด ์ด๋ฒคํธ(์: UI ํด๋ฆญ, ๋ชฌ์คํฐ ์ฌ๋ง)๋ฅผ ํ์ ์ ์ฅํ๊ณ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ.
- ์ํ ํจํด(State Pattern): ์บ๋ฆญํฐ์ ํ๋(๊ฑท๊ธฐ, ๋ฐ๊ธฐ, ๊ณต๊ฒฉ ๋ฑ)์ ์ํ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ.
3๏ธโฃ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- ํ๋ผ์ด์จ์ดํธ(Flyweight): ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ๊ฐ(์: UI ์์, ํํฐํด ์์คํ ).
- ์๋น์ค ๋ก์ผ์ดํฐ(Service Locator): ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ค์ด๋ฉด์๋ ํจ์จ์ ์ผ๋ก ํ์ํ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ.
- ์ปดํฌ๋ํธ ํจํด(Component Pattern): ์ ๋ํฐ(Unity)์์ ์ฌ์ฉ๋๋ ํจํด์ผ๋ก, ์ค๋ธ์ ํธ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ฐํ๊ฒ ๊ด๋ฆฌ.
๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด ์์ฉ ์ฌ๋ก
๊ทธ๋ผ ์ด๋ฌํ ํจํด๋ค์ด ์ค์ ๊ฒ์์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ์๋ฅผ ๋ค์ด๋ณผ๊ฒ์.
๐ฎ ๊ฐ์ฒด ํ๋ง(Object Pooling) - ํํ ์์คํ
์ํ ๊ฒ์์์๋ ํ๋ ์ด์ด๊ฐ ์๋ง์ ํํ์ ๋ฐ์ฌํฉ๋๋ค. ๋งค๋ฒ ์๋กญ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ผ๋ฏ๋ก, ๊ฐ์ฒด ํ๋ง ํจํด์ ํ์ฉํ์ฌ ๋ฏธ๋ฆฌ ์์ฑํ ํํ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
public class BulletPool : MonoBehaviour {
public GameObject bulletPrefab;
private Queue<GameObject> bulletPool = new Queue<GameObject>();
public GameObject GetBullet() {
if (bulletPool.Count > 0) {
GameObject bullet = bulletPool.Dequeue();
bullet.SetActive(true);
return bullet;
} else {
return Instantiate(bulletPrefab);
}
}
public void ReturnBullet(GameObject bullet) {
bullet.SetActive(false);
bulletPool.Enqueue(bullet);
}
}
์ด์์ ๋ฐ์ฌํ ๋ ๋นํ์ฑํ๋ ์ด์์ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ด์.
๐ฎ ์ด๋ฒคํธ ํ(Event Queue) - UI ์ด๋ฒคํธ ๊ด๋ฆฌ
public class EventQueue {
private Queue<Action> events = new Queue<Action>();
public void EnqueueEvent(Action newEvent) {
events.Enqueue(newEvent);
}
public void ProcessEvents() {
while (events.Count > 0) {
events.Dequeue().Invoke();
}
}
}
UI ์ด๋ฒคํธ(์: ๋ฒํผ ํด๋ฆญ, ํ์คํธ ์๋ฃ)๋ฅผ ํ ๊ณณ์์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๐ฎ ํ๋ผ์ด์จ์ดํธ(Flyweight) - ๋ฐ๋ณต๋๋ ๋ฆฌ์์ค ์ต์ ํ
public class FlyweightSprite {
private static Dictionary<string, Sprite> spriteCache = new Dictionary<string, Sprite>();
public static Sprite GetSprite(string path) {
if (!spriteCache.ContainsKey(path)) {
spriteCache[path] = Resources.Load<Sprite>(path);
}
return spriteCache[path];
}
}
๊ฐ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ ๋๋ค.
๐ฎ ์ํ ํจํด(State Pattern) - ์บ๋ฆญํฐ ํ๋ ๊ด๋ฆฌ
ํ๋ ์ด์ด ์บ๋ฆญํฐ๊ฐ ๊ฑท๊ณ , ๋ฐ๊ณ , ๊ณต๊ฒฉํ๋ ํ๋์ ์ํ ํจํด์ผ๋ก ๊ตฌํํ๋ฉด ์ฝ๋ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๊ณ ํ์ฅ์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
public abstract class CharacterState {
public abstract void HandleInput(Character character, string input);
}
public class WalkingState : CharacterState {
public override void HandleInput(Character character, string input) {
if (input == "Jump") {
character.SetState(new JumpingState());
}
}
}
public class JumpingState : CharacterState {
public override void HandleInput(Character character, string input) {
if (input == "Land") {
character.SetState(new WalkingState());
}
}
}
์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด ์บ๋ฆญํฐ์ ํ๋์ด ๋ ๋ฆฝ์ ์ธ ํด๋์ค๋ก ๋ถ๋ฆฌ๋์ด ์ฝ๋๊ฐ ๊น๋ํด์ง๋๋ค.
๐ฎ ์ปดํฌ๋ํธ ํจํด(Component Pattern) - ์ ์ฐํ ์ค๋ธ์ ํธ ์ค๊ณ
public class Character : MonoBehaviour {
private IMovement movement;
private IAttack attack;
public void SetMovement(IMovement newMovement) {
movement = newMovement;
}
public void SetAttack(IAttack newAttack) {
attack = newAttack;
}
}
public interface IMovement {
void Move();
}
public class WalkMovement : IMovement {
public void Move() { Debug.Log("Walking"); }
}
public class RunMovement : IMovement {
public void Move() { Debug.Log("Running"); }
}
๊ฑท๊ธฐ, ๋ฐ๊ธฐ ๋ฑ์ ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๋ก ๊ด๋ฆฌํ์ฌ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ์ ์งํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
๊ฒ์ ๊ฐ๋ฐ์ ๋ณต์กํ ์์คํ ์ ๋ค๋ฃจ๋ ์์ ์ด๊ณ , ์ ์ ํ ํจํด์ ํ์ฉํ๋ฉด ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ด ํจ์ฌ ์ฌ์์ง๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ด ๋ฌด์์ธ์ง, ๋์์ธ ํจํด๊ณผ์ ์ฐจ์ด์ , ์ฃผ์ ํจํด ๋ฐ ์ค์ ๊ฒ์์์์ ํ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ดค์ด์.
์์ผ๋ก ๊ฒ์์ ๊ฐ๋ฐํ๋ฉด์ ์ด๋ค ํจํด์ ์ ์ฉํ ์ ์์์ง ๊ณ ๋ฏผํด๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ์ฝ๋์ ํ์ง์ ๋์ด๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฑฐ์์. ์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๐ฎ
'Life is Game๐ฎ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ํฐ ์ด๋ฒคํธ ์์คํ ์ ์ฐ๋ ์ด์ (0) | 2025.04.03 |
---|---|
์ ๋ํฐ ์์ง Flythrough ๋ชจ๋๊ฐ ๊ฐ์๊ธฐ ์คํ๋์ง ์์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2025.01.18 |
๊ฒ์ ์์ง ์ํคํ ์ฒ ๊ฐ์ (0) | 2025.01.12 |
<์ธ๋ฆฌ์ผ ์์ง 5.5 ์ถ์ ์จ๋น๋: ํ๋ก๊ทธ๋๋ฐ ํธโ > (3) | 2024.11.26 |
(๋ฉํฐ๋ฅผ ์ํ) ๊ฒ์ ๊ธฐํ ๊ธธ๋ผ์ก์ด (0) | 2024.11.06 |