프로그래밍 농장

싱글톤 패턴 / 지연생성 [ Unity ] 본문

Unity

싱글톤 패턴 / 지연생성 [ Unity ]

Tennessee201 2022. 7. 7.
728x90

싱글톤 패턴은 '디자인 패턴' 중 하나이다. 디자인 패턴이란, 프로그래밍을 할 때 코드를 작성하는 약속된 방법이다. 싱글톤은 기본적으로 게임이나 메모리 상에 단하나만 존재하며, 언제 어디서든 접근가능한 오브젝트를 만들 때 사용되는 패턴이다.

ex) 게임 상의 ScoreManger는 하나만 존재하여야하며, 모든 플레이어들이 언제나 접근가능하도록 설정하여야 할 것이다. 

위와 같이 한 게임상에서는 다양한 Score 관련 스크립트, 함수들이 존재할것이다. 또한 Score를 관리하는 ScoreManager는 게임상에 하나뿐이다. 

바로 이때  위와 같이 Score에 영향을 미치는 함수들의 Script를 때마다 ScoreManager에 참조시켜서 사용하는것이 아니라, 싱글톤 패턴을 사용하면 된다. 

-> 자기자신(Score)을 유일한 Static 변수공간에 저장함으로서, 어디서든 본인에게 접근해서 사용할수있도록 하는것이다.

- 기존코드

public class ScoreManager : MonoBehaviour
{
    private int score = 0;
    public int GetScore()
    {
        return score;
    }
    public void AddScore(int newScore)
    {
        score = score + newScore;
    }
}

- 기존 ScoreAdder.cs의 score 참조코드 

 

 


- 싱글톤 적용시 코드

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

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager instance;

    private int score = 0;
    public int GetScore()
    {
        return score;
    }

    private void Awake()
    {
        instance = this;
    }

    public void AddScore(int newScore)
    {
        score = score + newScore;
    }
}

 

- 수정된 싱글톤패턴의 Score 참조코드

 

 


+

그러나 위와 같은 싱글톤패턴 구현방식은 매우 원시적인 방식이다.  싱글톤은 위 instance (ScoreManger)가 Scene 상에 무조건 하나 존재한다는 확정이 있어야 한다. 

ex) 추가적으로 만약 Scene상에 오브젝트가 두개이상 존재할 경우, 한가지를 파괴해주는 SafeyCheck를 적용할수도있다. 

 

기존 싱글톤패턴으로 선언한 instance가 참조시에 비어있을수도 있기에, 아래와 같이 GetInstance()로 한번 Wrapping 해주었다. 

기본적으로 디자인패턴이란, 각 상황에 맞게 여러가지 방향으로 작성할수있다. 위의 경우, 싱글톤을 찾아갈때 아직 Instance에 할당된것이 없다면 Scene상의 모든 GameObject를 뒤져서 ScoreManager를 찾은후,이를 instance에 할당하는 방식이다. 

만약 ScoreManager가 없을시, 위와 같이 조건문을 하나 더 달아서 ScoreManager를 생선해주도록하여 싱글톤 Score에 접근하려할때 그 즉시 ScoreManager를 만들어서 Instance에 할당하고, 이를 참조하도록 하는 방식이다. 

 

-> 이러한 방식을 싱글톤패턴의 특징 중 하나인 "지연생성" 이라고 한다. 

728x90

'Unity' 카테고리의 다른 글

Override [ Unity ]  (0) 2022.07.11
코루틴 [ Unity ]  (0) 2022.07.08
리스트 [ Unity ]  (0) 2022.07.07
인스턴스 [ Unity ]  (0) 2022.07.07
백터 연산 기초 /물체의 이동(좌표,평행)+ 쿼터니언 [ Unity ]  (0) 2022.07.07