본문 바로가기

디자인 패턴18

게임 디자인 패턴 17. MVC 패턴 (MVC Pattern) MVC 패턴으로 인벤토리 만들기MVC 패턴의 규칙 프로젝트를 하다보면 데이터 (Model) 가 따로 있고, 그 데이터를 조작하는 부분 (Controller) 이 따로 있고, 그것을 보여주는 부분 (View) 이 따로 있게 되는 경우가 많을 것이다. 이 세가지 사이의 관계를 정의하기가 힘들텐데, 이 때 주로 사용하는 마법 같은 방법 중 하나가 바로 이 MVC 패턴 (MVC, Model-View-Controller Pattern) 이 아닌가 싶다. 디자인 패턴 중에서는 가장 직관적인 패턴 중 하나라고 생각한다. 백문이 불여일견, 직접 MVC 패턴으로 된 예제를 보자. MVC 패턴으로 인벤토리 만들기 먼저, Model이 되는 데이터를 만들어 보는 것이다.using System.Collections.Generi.. 2023. 11. 20.
게임 디자인 패턴 16. 이벤트 버스 패턴 (Event Bus Pattern) 이벤트 버스 구현해보기이벤트 버스를 언제 사용해야하는가? 이벤트 버스 패턴은 이벤트의 게시와 구독을 연결하는 방법을 제시하는 디자인 패턴이다. 우리는 이러한 이벤트 버스 패턴을 추상화하여 이벤트 게시자와 구독자가 서로를 전혀 알지 못하도록 구현해볼 것이다. 이벤트 버스 구현해보기 레이싱 게임 프로젝트에서 이벤트 버스를 구현한다고 해보자. public enum RaceEventType { COUNTDOWN, START, RESTART, PAUSE, STOP, FINISH, QUIT } 다음과 같이 enum을 선언 후 이벤트 버스 클래스를 작성한다. using System.Collections.Generic; using UnityEngine.Events; public class RaceEventBus { p.. 2023. 11. 14.
게임 디자인 패턴 15. 공간 분할 패턴 (Spatial Partition Pattern) 공간 분할 패턴주의점공간 분할을 위해 사용할 수 있는 자료구조 다음의 게시글의 코드를 함께 참고하였습니다.Game programming patterns in Unity with C# - Spatial Partition Pattern | HabradorThis is a tutorial on game programming patterns in Unity with C# code. Another name for the same thing is software design patterns. You will learn the following programming patterns: command pattern, and much more. This section is all about the spatial parti.. 2023. 11. 12.
게임 디자인 패턴 14. 객체 풀 패턴 (Object Pool Pattern) 객체 풀 사용 시 주의점객체 풀의 크기가 너무 작다면객체 풀의 크기가 너무 크다면그 외 주의사항디자인 요소참고 객체 풀 (오브젝트 풀) 역시 상당히 자주 나와 익숙한 패턴일 것이다. 필자도 객체 풀을 한 번 정리한 적이 있었다.Unity 오브젝트 풀오브젝트 풀을 쓰는 이유오브젝트 풀 생성풀링용 함수 작성 오브젝트 풀을 쓰는 이유 유니티에서는 프리팹을 만들어 개체를 생성할 때 생성함수 Instantiate()와 삭제함수 Destroy()를 제공해준다. 하지만 이 두가지의 함수를 너무 자주 사용하게 되면 물리적인 메모리 상에서 파편화된 메모리 (찌꺼기 메모리)가 계속해서 발생하게 되면서 성능에 악영향을 줄 수 있다. 이러한 문제를 해결하기 위해 오브젝트 풀링 (Object Pooling)이라는 것을 사용한다.. 2023. 11. 9.
게임 디자인 패턴 13. 더티 플래그 패턴 (Dirty Flag Pattern) 더티 플래그가 필요한 상황주의사항 이름이 참으로도 눈길이 가는 패턴이다.여기서 말하는 플래그는 비트를 의미한다. (참 또는 거짓) 더티 플래그라는 말의 어원은 확실하지 않다고 한다.의미 상으로는 ‘더이상 맞지 않음’을 나타내는 플래그라고 한다. 더티 플래그가 필요한 상황 유니티에서 다음과 같은 오브젝트의 트랜스폼을 계산한다고 해보자. 각 오브젝트들의 Transform은 상위 오브젝트 Transform으로부터 상대적인 위치값을 가진다.하지만 이걸 화면에 렌더링 해주려면 절대적인 위치값, 즉 월드 좌표값이 필요하다. 그러면 Object4의 월드 좌표값을 얻기 위해서는 Object3 기준의 위치 변환을 해주고, Object2 기준의 위치 변환을 해주고, Object1 기준의 위치 변환을 해줘야 한다! 벌써부터.. 2023. 11. 8.
게임 디자인 패턴 12. 서비스 중개자 패턴 (Service Mediator Pattern) 서비스 중개자의 형태서비스 중개자 패턴 개선하기디자인 요소 “어디서든” 접근을 할 수 있게 만드려면 보통은 정적 클래스나, 싱글톤 패턴을 생각하게 될 것이다. 하지만 이는 강한 커플링을 발생시킨다.개인정보가 모두에게 노출되는 느낌이랄까? 따라서 전역 접근이 가능한 서비스를 한 단계 숨겨서 구체적인 내용은 숨긴 채 서비스를 이용만 할 수 있도록 구현한 패턴이 오늘 정리할 이 서비스 중개자 패턴이다. 읽다보면 느끼는 것이, 분명 싱글톤 패턴과 비슷하다고 느낄 것이다. 게임 디자인 패턴 5. 싱글턴 패턴 (Singleton Pattern)싱글턴 패턴의 주요 특징1. 전역 접근점을 제공2. 오직 한 개의 클래스 인스턴스만 갖도록 보장싱글턴 패턴의 장점장점 1) 한 번도 사용하지 않을 경우 인스턴스를 아예 생성하.. 2023. 11. 7.
게임 디자인 패턴 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.