들어가며
프로토타입이라는 디자인 패턴은 원형이 되는 인스턴스와 그것의 견본(프로토타입)을 만드는 방식의 패턴이다.
말이 좀 어려운데, 쉽게 설명하자면 객체를 생성하려 할 때 비슷한 객체가 있으면 그것을 복사하여 생성하는 패턴이다.
왜 굳이 복사를 하나요?라고 물어볼 수 있는데, ”생성에 드는 비용 > 복사에 드는 비용”일 경우 복사를 하는 것이 이득 아니겠는가?
프로토타입을 이용한 오브젝트 생성 구현
구현은 다음과 같이 한다.
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
'개발 > 게임 디자인 패턴' 카테고리의 다른 글
게임 디자인 패턴 6. 상태 패턴 (State Pattern) (1) | 2023.10.30 |
---|---|
게임 디자인 패턴 5. 싱글턴 패턴 (Singleton Pattern) (1) | 2023.10.27 |
게임 디자인 패턴 3. 관찰자 패턴 (Observer Pattern) (0) | 2023.10.25 |
게임 디자인 패턴 2. 경량 패턴 (Flyweight Pattern) (0) | 2023.10.24 |
게임 디자인 패턴 1. 명령 패턴 (Command Pattern) (0) | 2023.10.23 |