Prototype Pattern 이란?
프로토타입 패턴Prototype Pattern은 생성하는 방법에 대한 패턴입니다. 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며 인스턴스는 새 객체를 만들기 위해 자기 자신을 복제하는 방식입니다. 유니티에서는 Object.Instantiate로 이미 구현되어 있기는 합니다. 하지만 이 경우 복제하려는 객체가 UnityEngine.Object를 상속해야 한다는 조건이 있습니다. 물론 유니티 객체의 대부분이 UnityEngine.Object를 상속받기는 하지만 직접 구현해야 할 상황이 있을 수도 있습니다.
Prototype Pattern을 직접 구현할 때는 깊은 복사를 할지 얕은 복사를 할지 고려해야 합니다. 또 상황에 따라서는 Prototype Pattern보다 Flyweight Pattern이 더 좋은 선택지가 될 수도 있습니다. Factory Pattern의 Factory 내부에 Prototype을 넣는 경우가 있을수 있습니다. 만약 많은 게임 오브젝트를 인스턴스화하거나 Destroy 할 때는 Object pool을 활용할 수도 있습니다.
유니티에서 Prototype Pattern 예시와 활용법
앞서 말했듯이 유니티에서 Prototype Pattern을 제공하기 때문에 게임 오브젝트를 Prototype Pattern으로 복제하려고 할 때 Object.Instantiate를 사용하면 됩니다. 여기에서는 유니티 빌트인 메서드 Object.Instantiate를 사용하지 않고 구현해보겠습니다.
아래와 같이 몬스터에게 복제 기능을 Prototype Pattern으로 구현해보겠습니다.
public abstract class Monster
{
protected int health;
// Prototype Pattern을 구현할 매서드입니다.
public abstract Monster Clone();
}
public class Slime : Monster
{
public Slime(int health) { this.health = health; }
public override Monster Clone() { return new Demon(health); }
}
public class Goblin : Monster
{
public Goblin(int health) { this.health = health; }
public override Monster Clone() { return new Demon(health); }
}
public class MonsterSpawner
{
Monster monster;
public MonsterSpawner(Monster monster) { this.monster = monster; }
public Monster SpawnMonster() { return monster.Clone(); }
}
MonsterSpawner 클래스를 사용하면 아래와 같은 것입니다. 이 경우는 Object.Instantiate를 사용해도 무관해보입니다.
MonsterSpawner slimeSpawner = new Spawner(new Slime(100));
Slime duplicatedSlime = slimeSpawner.SpawnMonster() as Slime;
// 만약 Object.Instantiate를 사용한다면 아래와 같은 것입니다.
Slime duplicatedSlime = Object.Instantiate(new Slime(100)) as Slime;
참고자료
'Unity Programming Pattern' 카테고리의 다른 글
유니티 프로그래밍 패턴 (6) State (0) | 2023.06.21 |
---|---|
유니티 프로그래밍 패턴 (5) Singleton (0) | 2022.10.27 |
유니티 프로그래밍 패턴 (3) Observer, Publish/Subscribe (0) | 2022.10.21 |
유니티 프로그래밍 패턴 (2) Flyweight (0) | 2022.10.18 |
유니티 프로그래밍 패턴 (1) Command (1) | 2022.10.13 |
최근댓글