본문 바로가기
개발/게임 디자인 패턴

게임 디자인 패턴 4. 프로토타입 (Prototype)

by 석시 2023. 10. 26.



들어가며

프로토타입이라는 디자인 패턴은 원형이 되는 인스턴스와 그것의 견본(프로토타입)을 만드는 방식의 패턴이다.

말이 좀 어려운데, 쉽게 설명하자면 객체를 생성하려 할 때 비슷한 객체가 있으면 그것을 복사하여 생성하는 패턴이다.

왜 굳이 복사를 하나요?라고 물어볼 수 있는데, ”생성에 드는 비용 > 복사에 드는 비용”일 경우 복사를 하는 것이 이득 아니겠는가?


프로토타입을 이용한 오브젝트 생성 구현

구현은 다음과 같이 한다.

using UnityEngine;

public class Monster : MonoBehaviour
{
    public virtual Monster Clone()
    {
        return new Monster();
    }
}

이런 식으로 객체를 복사하는 메서드를 구현하게 되면, 다음과 같은 방식으로 Spawner를 구현해줄 수 있다.

public class Spawner<T> : MonoBehaviour where T : Monster
{
    private T _prototype;

    public Spawner(T prototype)
    {
        _prototype = prototype;
    }

    public Monster spawnMonster()
    {
        return _prototype.Clone();
    }
}

이제 Monster를 상속받은 작은 몬스터 클래스를 만들면 Spawner를 다 만들어줄 수 있게 되는 것이다.

Monster ghostPrototype = new Ghost(15, 3);
Spawner ghostSpawner = new Spawner(ghostPrototype);

Clone()을 만들 때 깊은 복사와 얕은 복사 중 어떤 것으로 복사를 해줄 지는 본인의 선택이다.

사실 위의 방식으로 스크립트를 짜는게 효율적인 방식인지는 의문이다.

코드 양도 줄어들지도 않고, 보통 게임에서 몬스터마다 클래스를 두는 일은 잘 없기 때문이다.

따라서 가장 유용한 부분은 다음의 데이터 설계 부분인 것 같다.


프로토타입을 이용한 데이터 모델링

JSON 형태로 데이터를 구상한다고 할 때 다음과 같이 짤 수 있을 것이다.

{
    "이름": "고블린 보병",
    "기본체력": 20,
    "최대체력": 30,
    "내성": ["추위", "독"],
    "약점": ["불", "빛"]
}

{
    "이름": "고블린 마법사",
    "기본체력": 20,
    "최대체력": 30,
    "내성": ["추위", "독"],
    "약점": ["불", "빛"],
    "마법": ["화염구", "번개 화살"]
}

{
    "이름": "고블린 마법사",
    "기본체력": 20,
    "최대체력": 30,
    "내성": ["추위", "독"],
    "약점": ["불", "빛"],
    "공격방법": ["단궁"]
}

다음과 같은 데이터는 중복되는 값이 너무나도 많기 때문에 공간면에서 비효율적이다.

기존 데이터를 재활용할 수 있으면 좋겠지만 JSON에서는 그런 기능은 존재하지 않는다.

따라서 프로토타입을 이용하여 다음과 같이 중복되는 데이터를 없앨 수 있다.

{
    "이름": "고블린 보병",
    "기본체력": 20,
    "최대체력": 30,
    "내성": ["추위", "독"],
    "약점": ["불", "빛"]
}

{
    "이름": "고블린 마법사",
    "프로토타입": "고블린 보병",
    "마법": ["화염구", "번개 화살"]
}

{
    "이름": "고블린 마법사",
    "프로토타입": "고블린 보병",
    "공격방법": ["단궁"]
}

다음과 같이 고블린 보병과 중복되는 데이터는 고블린 보병을 프로토타입으로 삼아 데이터를 저장할 수 있게 되는 것이다.

이러한 방식은 클래스의 상속과 비슷해보이지만 다른 부분들이 있다.

그래서 이걸 위임(Delegation)이라고 부른다.

여기서 몬스터를 더 추가한다고 해도 프로토타입을 받아 약간만 변형해주는 방식으로 데이터를 아주 쉽게 추가할 수가 있는 것이다.

프로토타입은 이처럼 데이터 모델링에서 더 많이 쓰이는 듯 하다.


Uploaded by N2T