본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[디자인 패턴] 싱글턴, 상태패턴, 이벤트버스

by 빛하_ 2024. 1. 8.
Team Project #4
2D - Top Down + 멀티 협동 탈출 게임 

 

코루틴을 활용해 맵의 랜덤한 위치 (spawnPositions)에 아이템상자 드랍하기
// CreateSupplies.cs

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class CreateSupplies : MonoBehaviour
{
    // 보급상자
    public List<GameObject> supplies = new List<GameObject>();
    // 생성 위치
    public List<Transform> spawnPositions = new List<Transform>();

    void Start()
    {
        StartCoroutine(SuppliesSpawn());
    }

    IEnumerator SuppliesSpawn()
    {
        CreateBox();
        yield return new WaitForSecondsRealtime(5.0f);
    }
    void CreateBox()
    {
        int idx = Random.Range(0, supplies.Count);
        int posIdx = Random.Range(0, spawnPositions.Count);

        GameObject obj = supplies[idx];
        Instantiate(obj, spawnPositions[posIdx].position, Quaternion.identity);
    }
}

 

 


 

Unity에서 자주 쓰는 디자인 패턴 3가지

1. 싱글턴 패턴

유니티로 게임을 만들면 주로 싱글턴 패턴으로 게임 매니저를 구현하게 된다.

 

싱글턴 패턴의 조건 : 유일성 보장

메모리에 오직 하나의 인스턴스만이 존재함 => 게임 어디에서든 불러올 수 있는 전역변수의 특징을 갖게 된다.

싱글턴 인스턴스는 같은 유형의 인스턴스를 발견하면 하나를 파괴시키고 하나만 남게 한다.

 

장점)

전역적 접근이 가능하다.

단점)

유닛 테스트가 어렵다.

잘못된 프로그래밍 습관을 유발한다. 

매니저에 핵심 함수가 몰려 있어서 디버깅하기 어렵다.

 

싱글턴 패턴 TIP)

매니저마다 싱글턴을 새로 만드는 것이 아니라, 싱글턴 패턴을 하나 만들어서 매니저마다 상속시키는 것이 좋다.

 

2. 상태 패턴

플레이어/캐릭터 처럼

사용자 입력에 따라 상태가 끊임없이 변화하는 오브젝트가 존재한다면 상태 패턴을 사용하는 것이 좋다. 

 

switch 문을 사용하기 보다 상태패턴으로 구현하는 것이 클린코드의 길이다.

상태 인터페이스를 상속받은 다양한 형태의 행위들을 필요할 때마다 호출해서 플레이어를 움직이는 방식이다.

 

장점)

캡슐화가 잘 되어있음

switch문을 대체할 수 있음 (긴 조건문이나 방대한 클래스를 구현하는 것을 방지)

 

3. 이벤트 버스 패턴

전역 이벤트를 관리하는 중앙 허브 개념으로

게임에서 월드 이벤트가 발생한다면 전달받을 모든 캐릭터에게 이벤트를 발송하는 방식이다.

 

장점)

오브젝트를 직접 참조하지 않고 이벤트 통신 가능. 

구독 시스템을 쉽게 구현.

쉽고 빠르기 때문에 프로토타입을 만들 때 유용하다.

 

단점)

이벤트 버스가 static 전역 변수라서 전역변수의 단점을 모두 갖게 된다.

약간의 성능 비용이 발생한다. (성능 저하를 감수하고 사용해야 함)

 

 

 

 

 

 

댓글