반응형

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;

 

 

참고자료

https://github.com/Habrador/Unity-Programming-Patterns

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기