๋ฐ์ํ
๐ญ Unity ๋์์ธ ํจํด - ํฉํ ๋ฆฌ(Factory) ํจํด
1. ํฉํ ๋ฆฌ ํจํด์ด๋?
ํฉํ ๋ฆฌ(Factory) ํจํด์ ๊ฐ์ฒด์ ์์ฑ ๊ณผ์ ์ ๊ฐ์ถ๊ณ , ์์ฑ ์ฑ ์์ ๋ณ๋์ ํฉํ ๋ฆฌ ํด๋์ค์ ์์ํ๋ ๋์์ธ ํจํด์ ๋๋ค. Unity์์๋ ๋ค์ํ ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฑํ๊ฑฐ๋, ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊ตฌ์กฐ๋ก ํ์ฅํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
"์ง์ new๋ฅผ ํ์ง ์๊ณ , ๋์ '๊ณต์ฅ'์๊ฒ ์ฃผ๋ฌธํด์ ๋ฐ์์ค๋ ๋ฐฉ์"์ด๋ผ๊ณ ์ดํดํ๋ฉด ์ฝ์ต๋๋ค.
2. ์ธ์ ์ฌ์ฉํ๋์?
- ๋ค์ํ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ํฉ์ ๋ฐ๋ผ ์์ฑํด์ผ ํ ๋
- ์์ฑ ๋ก์ง์ด ์์ฃผ ๋ฐ๋๊ฑฐ๋, ๋ณต์กํ ์ด๊ธฐํ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ํ์ฅ์ฑ์ ๋์ด๊ณ ์ถ์ ๋
3. Unity ์์ : ์ (Enemy) ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ
๐ฏ ๋ชฉํ
- Enemy ํ์ ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ํ๋ฆฌํน์ ์์ฑ
- ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์ ์ข ๋ฅ๋ฅผ ํ์ฅ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์กฐ ์ค๊ณ
4. ์์ ์ฝ๋
๐งฑ Step 1: Enemy ํ์ ์ ์
public enum EnemyType
{
Melee,
Ranged,
Boss
}
๐ฎ Step 2: Enemy ๋ฒ ์ด์ค ํด๋์ค
using UnityEngine;
public abstract class Enemy : MonoBehaviour
{
public abstract void Initialize();
}
๐ง Step 3: ์ค์ ์ ํด๋์ค๋ค
public class MeleeEnemy : Enemy
{
public override void Initialize() => Debug.Log("๊ทผ์ ์ ์์ฑ ์๋ฃ");
}
public class RangedEnemy : Enemy
{
public override void Initialize() => Debug.Log("์๊ฑฐ๋ฆฌ ์ ์์ฑ ์๋ฃ");
}
public class BossEnemy : Enemy
{
public override void Initialize() => Debug.Log("๋ณด์ค ์์ฑ ์๋ฃ");
}
๐ญ Step 4: EnemyFactory
using UnityEngine;
public class EnemyFactory : MonoBehaviour
{
[Header("Enemy Prefabs")]
public GameObject meleePrefab;
public GameObject rangedPrefab;
public GameObject bossPrefab;
public Enemy CreateEnemy(EnemyType type, Vector3 spawnPosition)
{
GameObject prefab = type switch
{
EnemyType.Melee => meleePrefab,
EnemyType.Ranged => rangedPrefab,
EnemyType.Boss => bossPrefab,
_ => null
};
if (prefab == null)
{
Debug.LogWarning("ํด๋น EnemyType์ ๋ํ ํ๋ฆฌํน์ด ์์ต๋๋ค.");
return null;
}
GameObject enemyObj = Instantiate(prefab, spawnPosition, Quaternion.identity);
Enemy enemy = enemyObj.GetComponent<Enemy>();
enemy?.Initialize();
return enemy;
}
}
๐งช Step 5: ์ฌ์ฉ ์์
public class GameManager : MonoBehaviour
{
public EnemyFactory enemyFactory;
private void Start()
{
enemyFactory.CreateEnemy(EnemyType.Melee, new Vector3(0, 0, 0));
enemyFactory.CreateEnemy(EnemyType.Ranged, new Vector3(2, 0, 0));
enemyFactory.CreateEnemy(EnemyType.Boss, new Vector3(4, 0, 0));
}
}
5. ์ ๋ฆฌ ๋ฐ ์ฅ๋จ์
โ ์ฅ์
- ๊ฐ์ฒด ์์ฑ ๋ก์ง ๋ถ๋ฆฌ๋ก ์ฑ ์์ด ๋ช ํํด์ง
- ์๋ก์ด Enemy ํ์ ์ถ๊ฐ ์, Factory๋ง ์์ ํ๋ฉด ๋จ
- ์์กด์ฑ ์ต์ํ, ํ ์คํธ์ ์ ์ง๋ณด์ ์ฌ์
โ ๋จ์
- ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ ๋ณต์กํด์ง ์ ์์
- Factory์ ๋๋ฌด ๋ง์ ์ฑ ์์ด ์ง์ค๋๋ฉด God Object๊ฐ ๋ ์ ์์
โ ๋ง๋ฌด๋ฆฌ ํ ์ค ์์ฝ
ํฉํ ๋ฆฌ ํจํด์ **"์ง์ ๋ง๋ค์ง ๋ง๊ณ , ๊ณต์ฅ์ ๋งก๊ฒจ๋ผ"**๋ ์์น์ผ๋ก, ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ๊ฐ์ฒด ์์ฑ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ํ
'C# > DesignPattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DesignPattern - ์ํ ํจํด(State Pattern) vs FSM (2) | 2025.08.06 |
---|---|
DesignPattern - ์ด๋ฒคํธ ๋ฒ์ค(Event Bus) ํจํด (0) | 2025.08.06 |
DesignPattern - ์ต์ ๋ฒ(Observer) ํจํด (0) | 2025.08.06 |
DesignPattern - Unity์์์ Generic Singleton ํจํด (0) | 2025.07.22 |
DesignPattern - Singleton Pattern (์ฑ๊ธํค ํจํด) in Unity (0) | 2025.07.22 |