/ UNITY

유니티 토막 지식_06

Retr0의 교재를 따르는 실습은 저작권상 앞으로는 짤막하게 한 줄씩만 적도록 하겠다.

오늘은 공간과 움직임 파트를 마쳤다. 내일부터 유니런 제작 실습을 할 예정이다.

오늘 알아볼 것은 디자인 패턴이다. 지금까지 제대로 유니티에 적용해본 패턴은 싱글톤 하나 뿐이지만, 다양한 디자인 패턴들을 익혀두면 게임 제작을 할 때 적용가능한 패턴이 자연스럽게 떠오를 것 같다.

싱글톤 패턴

유니티에서도 사용해봤고, 자바에서도 사용해봤다. 싱글톤의 핵심은 단일 인스턴스 반환이다. 객체의 인스턴스를 1개만 생성해두고 그 1개의 인스턴스에만 접근하는 것이다.

유니티에서 싱글톤 패턴은 주로 게임 시스템 전체를 통괄하는 스크립트이거나,(ex. gameManager) 전역변수처럼 사용해야할 때 사용한다. 또는 씬이 변경될 때 파괴되면 안되는 오브젝트에도 싱글톤을 반영한다.

싱글톤 패턴의 사용

유니티에서 싱글톤 패턴을 사용하는 방법은 2가지가 있다. 첫 번째는 게임오브젝트로써 씬에 존재하게 할 수 있고(MonoBehaviour을 상속받는다.), 두 번째는 게임 오브젝트로 존재하지 않게 하는 방법이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton : MonoBehaviour
{

    private static Singleton instance = null;

    // 처음 활성화 될 때 생성되고, DontDestroyOnLoad 메서드로 인해 씬이 변경된다 하더라도 파괴되지 않는다.
    // static 변수로 선언했기 때문에 다른 클래스에서도 직접적으로 호출이 가능해진다.
    void awake()
    {
        if (instance == null)
        {
            instance = this;

            DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            // 만약 씬이 바뀌었는데 바뀐 씬에 동일한 오브젝트가 이미 있는 경우 그 오브젝트를 파괴해준다.
            // 만약 이 작업을 하지 않아 2개의 인스턴스가 생성되면 단일 인스턴스가 아니게 된다.
            Destroy(this.gameObject);
        }
    }

    // 다른 클래스에서는 퍼블릭으로 선언되어있는 아래의 프로퍼티를 이용해 호출할 수 있다.
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                return null;
            }

            return instance;
        }
    }

}

간단한 사용방법이다. 위 방법은 MonoBehaviour에 상속을 받아 씬 내부에 존재할 수 있게 한다.

두 번째 방법은 자바에서와 같은 방식으로 생성한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton2
{
    private static Singleton2 instance;

    public static Singleton2 Instance
    {
        get
        {
            // 인스턴스가 존재하지 않는 경우 딱 한 번 생성하고, 그 후에는 생성한 인스턴스를 반환한다.
            if (null == instance)
            {
                instance = new Singleton2();
            }
            return instance;
        }
    }
}

위 두 가지 방법으로 싱글톤을 생성할 수 있다.

장단점
  1. 장점 : 고정된 영역의 인스턴스를 한 번만 생성하여 사용하기 때문에 메모리 절약이 된다. 또한 전역으로 사용할 수 있어 다른 클래스에서 접근이 용이하다.

  2. 단점 : 싱글톤 단일로만 사용할 경우 객체지향 원칙(SOLID)에 위배된다. OCP, Open-Closed Principle 원칙은 개방-폐쇄 원칙인데. 확장에는 개방되어야하고, 수정에는 폐쇄되어야하는 원칙이다. 싱글톤 패턴은 하나의 인스턴스와 다양한 클래스가 연결되기 때문에 결합도가 높아져 객체의 인터페이스가 제대로 분리되지 못하게 되어 객체지향적이지 않게 된다.