Design Pattern 6

상태 (State)

게임 프로그래밍 패턴 7장 상태 상태 패턴은 객체의 상태에 따라 행동이 달라지는 상황에서, 상태를 객체화하여 스스로 행동할 수 있도록 하는 패턴이다. 유한상태기계(FSM : Finite State Machine)로 구현한다. 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴으로, 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보입니다. (GoF의 디자인 패턴 395쪽) 플랫포머 게임에서 플레이어를 구현한다고 해보자. B 버튼을 누르면 플레이어는 점프한다. # Player.cs public class Player : MonoBehaviour { public void HandleInput() { if (Input.GetKeyDown(KeyCode.B)) { yVelocity = ..

Design Pattern 2020.11.25

싱글턴 (Singleton)

게임 프로그래밍 패턴 6장 싱글턴 싱글턴 패턴은 클래스의 인스턴스가 하나만 유지되고, 인스턴스에 대한 전역 접근을 제공하는 패턴이다. 책에서는 싱글턴 패턴의 남용에 대해 주의할 것을 당부한다. 프로그래밍 업계가 C에서 객체지향 프로그래밍으로 넘어가던 시절에 닥친 문제 하나는 '어떻게 하면 원하는 인스턴스에 접근할 수 있는가'였다. 호출하고 싶은 메서드는 있는데, 그 메서드를 제공하는 객체 인스턴스에 쉽게 접근할 방법이 없었다. 이럴 때 싱글턴, 다시 말해 전역 변수는 쉬운 해결책이었다. - 게임프로그래밍 패턴 싱글턴의 성격 1. 한 개의 클래스 인스턴스 싱글턴은 하나의 클래스에 하나의 인스턴스만 존재한다. 예를 들어, 파일 시스템을 만든다고 할 때, 한 파일에 대한 작업이 다른 곳에서 간섭받지 않도록 해..

Design Pattern 2020.09.19

프로토타입 (Prototype)

게임 프로그래밍 패턴 5장 프로토타입 프로토타입 패턴은 새로운 객체를 생성할 때 원형 객체를 복사하여 만드는 패턴이다. 복사할 원형 객체가 있고, 새로운 객체를 생성할 때 발생하는 비용이 매우 클 때 유용하다. Unity에서 Prefab을 사용한 객체 생성 형식이 대표적인 프로토타입 패턴이다. 패턴은 clone() 메서드를 선언하는 추상 베이스 클래스와 이를 상속받아 다형적으로 clone()을 구현하는 하위 클래스로 이루어진다. 예를 들어 던전을 만드는데 층을 올라갈수록 등장 몬스터가 조금씩 바뀌는 상황이라고 해보자. 기본적인 데이터는 DB에서 가져온다. 이때 바뀌는 몬스터 목록을 얻기 위해 매번 DB에 접속하는 것은 앞서 얘기한 비용 낭비가 심한 방법이다. 처음 가져온 데이터를 원형으로 새로운 객체를 ..

Design Pattern 2020.07.19

관찰자 (Observer)

게임 프로그래밍 패턴 4장 관찰자 관찰자 패턴은 객체와 객체의 상태 변화를 관찰하는 관찰자를 일 대 다의 관계로 정의해두고, 해당 객체의 상태가 변할 때 등록된 다수의 관찰자에게 객체의 변화를 알리는 디자인 패턴이다. 예를 들어, 플레이어의 행동에 따라 다양한 업적을 달성하는 시스템이 있다고 하자. 이때 특정 행동을 하는 코드 부분 부분에 각 업적 달성 코드를 구현하게 되면 상당히 지저분해질 것이다. 스파게티처럼 이곳 저곳에 퍼진 코드는 작은 수정에도 매우 민감해진다. 관찰자 패턴을 적용한다면 플레이어가 특정 행동을 했을 때 관찰자 목록에 알림을 던져주기만 하면 된다. 업적 관찰자는 알림에 맞는 업적 달성 코드를 실행하면 된다. 관찰자(Observer) 관찰자는 객체를 관찰하다 객체의 상태 변화 메서드가..

Design Pattern 2020.07.05

경량 (Flyweight)

게임 프로그래밍 패턴 3장 경량 경량 패턴은 어떤 객체의 수가 너무 많을 때 가볍게 만들기 위해 사용한다. 공통적으로 쓰이는 데이터(고유 상태)는 공유하고, 개별적인 데이터(외부 상태)만 별도로 주어진다. 땅, 숲, 강이 섞인 넓은 지형 구현한다고 했을 때 각 지형 타입에 들어가는 Texture는 고유 상태이고, 각 지형의 서로 다른 position, rotation 값 등이 외부 상태다. # TerrainType.cs public class TerrainType { private Sprite _sprite; private int _movementCost; public Sprite Sprite => _sprite; public int MovementCost => _movementCost; public T..

Design Pattern 2020.06.24

명령 (Command)

게임 프로그래밍 패턴 2장 명령 명령 패턴은 메서드 호출을 실체화(객체화)한 것이다. 객체의 형태로 캡슐화함으로써 해당 메서드는 매개변수로 활용할 수 있게 된다. 게임에서 입력키를 변경하는 예제를 봐보자 # InputController.cs MonoBehaviour에서 Update로 Input을 받는 기본적인 방법이다. using UnityEngine; public class InputController : MonoBehaviour { private void Update() { if (Input.GetKeyDown(KeyCode.X)) Jump(); else if (Input.GetKeyDown(KeyCode.A)) Dash(); else if (Input.GetKeyDown(KeyCode.B)) Fir..

Design Pattern 2020.06.18