본문 바로가기

전체 글85

게임 디자인 패턴 11. 이벤트 큐 (Event Queue) 패턴 이벤트 vs 메시지이벤트 ‘큐’를 쓰는 이유가?디자인 요소 이벤트 큐 패턴이다. 왜 이벤트에 큐를 사용하지? 라는 의문이 들 수 있다.그것을 지금부터 설명해보고자 한다. 이벤트 vs 메시지 일단 모든 것을 설명하기 앞서 가장 먼저 짚고 넘어가야 할 것 중 하나다.생각보다 이벤트와 메시지를 구분하지 못하는 경우가 많다. 정리하자면 이렇다.이벤트는 이미 일어난 사건이다. 몬스터가 죽었거나, 투사체에 맞았거나 하는 등의 사건이 이벤트가 되겠다. 즉, 이 이벤트를 복수의 리스너가 들을 수 있도록 구현할수도 있는 것이다. 메시지는 받는 사람이 했으면 하는 행동을 표현한 것이다. 경험치를 얻는다던지, 사운드를 재생한다던지 등의 표현이 메시지가 되는 것이다. 보통은 리스너가 하나다. 여러 리스너가 하도록 구현할 수도.. 2023. 11. 6.
게임 디자인 패턴 10. 컴포넌트 패턴 (Component Pattern) 디자인 요소 1. 객체는 컴포넌트를 어떻게 얻는가?디자인 요소 2. 컴포넌트들끼리 어떻게 통신할 것인가?방법 1) 컨테이너 객체의 상태를 변경하는 변경하는 방식방법 2) 컴포넌트가 서로 참조하는 방식방법 3) 메시지를 전달하는 방식 컴포넌트 패턴이다. 사실 유니티를 조금이라도 다뤄봤다면 모를 수가 없다.유니티의 핵심 프레임워크인 GameObject가 전적으로 컴포넌트 방식에 맞춰 설계되었기 때문이다. 그래서 이번 시간에는 컴포넌트끼리 어떻게 구성해야하는지를 위주로 다뤄보겠다. 디자인 요소 1. 객체는 컴포넌트를 어떻게 얻는가? 객체가 컴포넌트를 어떻게 얻는지를 두 가지로 결정할 수 있겠다. 객체가 필요한 컴포넌트를 알아서 생성할 지 vs 외부 코드로부터 받을지 유지보수 측면에서는 외부로부터 받는 것이 더.. 2023. 11. 3.
게임 디자인 패턴 9. 타입 객체 패턴 (Type Object Pattern) 일반적인 상속 구조..?타입 객체 패턴의 기본적인 형태주의사항팩토리 메서드 패턴과 섞어보기타입 객체의 상속 구현하기어떻게 사용할 것인가?다른 패턴과의 차이점 저번 시간 하위 클래스 샌드박스의 정리를 위해 해당 내용을 책에서 읽던 도중, ”요즘은 여러 프로그래머 집단에서 ‘상속’을 나쁘게 생각한다.”는 내용이 있었다. 왜 상속을 안좋게 생각하는 거지?상속으로 코드의 재사용성을 늘릴 수 있는 것 아닌가? 라고 생각했었다. 그러나 우리가 반사적으로 생각하는 상속 구조의 클래스들 역시 유지보수 면에서 문제가 발생하기 때문에 어느정도 특성을 공유하는 클래스들을 구현할 때 개발자들은 상속을 통해 만드는 것이 아니라 지금 소개하는 타입 객체 패턴을 통해 만들게 된다. 지금부터 일반적인 상속 구조와 타입 객체 패턴 간.. 2023. 11. 2.
게임 디자인 패턴 8. 하위 클래스 샌드박스 (Subclass Sandbox Pattern) 하위 클래스 샌드박스 패턴언제 써야 하는가?깨지기 쉬운 상위 클래스 (Fragile Base Class) 하위 클래스 샌드박스는 서로 상속 관계에 있는 두 클래스 사이에서 부모와 자식 어느 곳에 주요 기능을 넣을 건지에 대한 것을 이야기 한다. 책에서는 다음과 같이 이야기하고 있다. 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의한다. 하위 클래스 샌드박스 패턴 캐릭터마다 다른 효과를 가진 공격 기능을 구현한다고 해보자. 부모 클래스가 되는 공격 클래스를 구현하고 그것을 상속받아 각 캐릭터 공격 클래스를 구현한다고 해보자. 각 캐릭터 공격마다 아주 열심히 상세하게 클래스를 작성하면 다음과 같은 문제들이 발생한다. 중복 코드가 많아진다.거의 모든 게임 코드가 내가 작성하는 클래스와 커플.. 2023. 11. 1.
게임 디자인 패턴 7. 이중 버퍼 패턴 (Double Buffer Pattern) 테어링 현상 (Tearing)이중 버퍼 (Double Buffer)언제 써야 좋은가?써야하는 상황유의점 이번 글은 이중 버퍼 (Double Buffer) 패턴이다. 개인적으로는 번역이 좀 잘못되지 않았나 싶다.문자 그대로 더블 버퍼 패턴이라고 표현하는 것이 더 맞는 패턴 같다. 테어링 현상 (Tearing) 모니터 화면을 새로고침할 때는 말그대로 버퍼에 들어가 있는 화면 정보를 모니터의 첫번째 픽셀부터 끝 픽셀까지 차곡차곡 찍어주게 된다.이 때 찍어주는 순서가 가로이다. 즉, 첫번째 줄을 왼쪽에서 오른쪽으로 순서대로 찍어주고, 그 다음 줄을 찍는 방식이다. 테어링 현상은 바로 거기서 나타난다. 버퍼에서 정보를 읽어와 화면에 표시를 하던 도중, 버퍼에 있던 정보가 변할 경우 발생하는 문제이다. 이는 같은 .. 2023. 10. 31.
게임 디자인 패턴 6. 상태 패턴 (State Pattern) 유한 상태 기계 (FSM, Finite State Machine)상태 패턴의 구현우리는 이미 상태 패턴을 알고 있다상태 패턴의 형태언제 사용하는가? 상태 패턴이다.오히려 고전적인 구현에 더 많이 쓰이는 듯하다.회로라던지 통신의 로우 레이어라던지. 상태 패턴도 요즘은 좀 남발되는 경우가 많은 것 같다.AI가 대두되고, 이것이 게임에 적용되기 시작하면서 더더욱 그런 것 같다. 유한 상태 기계 (FSM, Finite State Machine) 유한 상태 기계는 상태와 상태 간의 전환을 기반으로 동작하는 동작 기반 시스템이다. 이렇게만 이야기 하면 감이 잘 오지 않는데, 이런 상황을 구해야 한다고 해보자. 청기백기 게임인데, 아래-중간-위가 있다고 해보면 다음 그림의 느낌이 될 것이다. 이 때, 상태 패턴 없이.. 2023. 10. 30.
게임 디자인 패턴 5. 싱글턴 패턴 (Singleton Pattern) 싱글턴 패턴의 주요 특징1. 전역 접근점을 제공2. 오직 한 개의 클래스 인스턴스만 갖도록 보장싱글턴 패턴의 장점장점 1) 한 번도 사용하지 않을 경우 인스턴스를 아예 생성하지 않는다.장점 2) 런타임에 초기화된다.장점 3) 싱글턴을 상속할 수 있다.싱글턴 패턴의 한계전역 변수로부터 생기는 문제사용 목적에 비해 과도한 변형이 들어가는 문제게으른 초기화로부터 발생하는 문제싱글턴 패턴을 안쓰는 방법한 개의 인스턴스만 갖도록 보장하기인스턴스에 쉽게 접근하도록 만들기싱글턴 대신 다른 디자인 패턴 사용하기하위 클래스 샌드박스 패턴서비스 중개자 패턴 아마도 게임에서는 가장 유명하고 많이 다뤄지는 패턴이 오늘 다루는 바로 이 싱글턴 패턴이 아닐까 싶다. 그래서 놀랍게도 책에서는 싱글턴 패턴을 어떻게 해야 안 쓸 수 .. 2023. 10. 27.
게임 디자인 패턴 4. 프로토타입 (Prototype) 들어가며프로토타입을 이용한 오브젝트 생성 구현프로토타입을 이용한 데이터 모델링 들어가며 프로토타입이라는 디자인 패턴은 원형이 되는 인스턴스와 그것의 견본(프로토타입)을 만드는 방식의 패턴이다. 말이 좀 어려운데, 쉽게 설명하자면 객체를 생성하려 할 때 비슷한 객체가 있으면 그것을 복사하여 생성하는 패턴이다. 왜 굳이 복사를 하나요?라고 물어볼 수 있는데, ”생성에 드는 비용 > 복사에 드는 비용”일 경우 복사를 하는 것이 이득 아니겠는가? 프로토타입을 이용한 오브젝트 생성 구현 구현은 다음과 같이 한다. using UnityEngine; public class Monster : MonoBehaviour { public virtual Monster Clone() { return new Monster(); .. 2023. 10. 26.
게임 디자인 패턴 3. 관찰자 패턴 (Observer Pattern) 기본적인 형태의 관찰자 패턴관찰자 패턴의 구현구현 1) event를 이용한 구현구현 2) 인터페이스를 이용한 구현관찰자 패턴의 주의점?사라진 리스너 문제 (Lapsed Listener Problem) 이번엔 관찰자 패턴이다. 사실 C#을 공부한 입장에서, 관찰자 패턴의 내용을 가만히 듣다보면 어딘가 모르게 익숙할 것이다. 상당히 자주 나오는 패턴이고 그 효과 역시 강력하기에 관찰자 패턴의 경우에는 라이브러리나 키워드를 통해 기본적으로 지원하는 경우가 많다. C#에서는 event 키워드가 바로 그것이다. event에 대해 처음 들었다면 아래 글에 간단하게 event에 대해 적혀 있으니 가볍게 읽어보자.[내일배움단] 사전캠프 C# TIL 8. 알아두면 좋을 것들Generic참고) object 타입Generi.. 2023. 10. 25.
게임 디자인 패턴 2. 경량 패턴 (Flyweight Pattern) 들어가며경량 패턴의 구현?방법 1) 스크립터블 오브젝트 (Scriptable Object)방법 2) 정적 배칭 (Static Batching)경량 패턴을 언제 사용할지 모르겠어요 들어가며 경량 패턴.무엇이 가볍길래? 설명에 따르면 사용하는 메모리가 가볍다는 의미이다. 객체의 수가 너무 많아서 메모리의 양에 차지하는 공간이 많을 때, 객체를 가볍게 만들어서 최적화하는 패턴을 경량 패턴이라고 한다. 그래서 가볍게는 어떻게 만드나요?모든 개체가 똑같은 값을 가지고 있는 데이터를 모아서 개체마다 저장하는 것이 아닌 한 곳에다 저장한 후 모든 개체가 그 데이터를 참조하는 방법으로 만든다! 이러한 공통 데이터를 GoF에서는 고유 상태 (intrinsic state) 라고 부르고 그렇지 않는 개별 데이터는 외부 상태.. 2023. 10. 24.