Unity 강의 정리 5-7장: C# 프로그래밍 [중급] (1/2) : 싱글톤🎮

나무에물주기·2023년 9월 4일
1

Unity

목록 보기
16/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

싱글톤 패턴: Unity 게임 개발에서의 활용 🌐


1. 원시적인 싱글톤 구현 방법 🛠️

첫 번째 예제에서는 Ninja 클래스의 기본 구조를 확인한다.

public class Ninja : MonoBehaviour
{
    public string ninjaName;
    public bool isKing;

    void Update()
    {
        Debug.Log("My Name: " + ninjaName);
    }
}
  • ninjaName은 닌자의 이름을 저장한다.
  • isKing은 해당 닌자가 '왕'인지 아닌지를 판별한다.
  • Update 메서드는 매 프레임마다 닌자의 이름을 콘솔에 출력한다.

싱글톤 추가

public class Ninja : MonoBehaviour
{
    public static Ninja ninjaKing;
    public string ninjaName;
    public bool isKing;

    void Start()
    {
        if(isKing)
        {
            ninjaKing = this;
        }
    }

    void Update()
    {
        Debug.Log("My Name: " + ninjaName + ", Ninja King is " + ninjaKing);
    }
}
  • public static Ninja ninjaKing: 이 부분은 싱글톤 패턴의 핵심이다. static 키워드를 통해 클래스 레벨에서 단 하나의 Ninja 객체를 저장한다.
  • Start() 메서드에서 isKingtrue일 경우, 해당 Ninja 인스턴스를 ninjaKing에 저장한다. 이로써 단 하나의 '왕' 닌자만이 ninjaKing에 할당되게 된다.
  • Update() 메서드에서는 현재 닌자의 이름과 '왕' 닌자를 출력한다. 여기서 '왕' 닌자는 ninjaKing 변수에 저장된 닌자이다.

2. 유니티에서 싱글톤 사용 🎮

기본 점수 관리자

public class ScoreManager : MonoBehaviour
{
    private int score = 0;

    public int GetScore()
    {
        return score;
    }

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

이 코드는 점수를 관리하는 기본 클래스를 보여준다. 여기에는 점수를 가져오고 추가하는 메서드가 있다.

점수 추가 및 감소

public class ScoreAdder : MonoBehaviour
{
    public ScoreManager scoreManager;

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            scoreManager.AddScore(5);
            Debug.Log(scoreManager.GetScore());
        }
    }
}
public class ScoreSubtractor : MonoBehaviour
{
    public ScoreManager scoreManager;

    void Update()
    {
        if(Input.GetMouseButtonDown(1))
        {
            scoreManager.AddScore(-2);
            Debug.Log(scoreManager.GetScore());
        }
    }
}

이 코드에서는 마우스 버튼을 사용하여 점수를 추가하거나 감소시킨다. 각 객체는 ScoreManager 인스턴스를 참조해야 한다.

싱글톤 점수 관리자

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager instance;
    private int score = 0;

    void Awake()
    {
        instance = this;
    }

    public int GetScore()
    {
        return score;
    }

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

이 코드는 싱글톤 패턴을 적용한 점수 관리자를 보여준다. static 변수 instance를 사용하여 전역에서 접근할 수 있는 단일 인스턴스를 제공한다.

점수 추가 및 감소 (싱글톤 활용)

public class ScoreAdder : MonoBehaviour
{
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            ScoreManager.instance.AddScore(5);
            Debug.Log(ScoreManager.instance.GetScore());
        }
    }
}

이 코드에서는 ScoreManager.instance를 통해 직접 점수를 추가하고 출력한다. 이로 인해 ScoreManager 인스턴스를 매번 참조할 필요가 없다.


3. static 함수 활용 싱글톤 🌟

GetInstance 메서드의 도입

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager GetInstance()
    {
        if (instance == null)
        {
            instance = FindObjectOfType<ScoreManager>();
        }
        return instance;
    }

    private static ScoreManager instance;
    private int score = 0;

    void Awake()
    {
        instance = this;
    }

    public int GetScore()
    {
        return score;
    }

    public void AddScore(int newScore)
    {
        score = score + newScore;
    }
}
  • public static ScoreManager GetInstance(): 이 메서드는 싱글톤 객체를 반환한다. 이 메서드를 통해 외부에서 싱글톤 객체에 접근할 수 있다.
  • if (instance == null): instance 변수가 null인지 확인한다. null이라면 FindObjectOfType<ScoreManager>()를 사용하여 ScoreManager 객체를 찾는다.
  • private static ScoreManager instance;: 싱글톤 객체를 저장할 static 변수이다.

싱글톤 객체 사용

public class ScoreAdder : MonoBehaviour
{
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            ScoreManager.GetInstance().AddScore(5);
            Debug.Log(ScoreManager.GetInstance().GetScore());
        }
    }
}
  • ScoreManager.GetInstance().AddScore(5);: GetInstance 메서드를 사용하여 싱글톤 객체에 접근하고, 점수를 추가한다.
  • Debug.Log(ScoreManager.GetInstance().GetScore());: 마찬가지로 GetInstance 메서드를 사용하여 싱글톤 객체의 현재 점수를 출력한다.

4. 지연 생성 (Lazy Initialization) 🕒

지연 생성의 개념

지연 생성은 객체가 실제로 필요한 시점까지 그 생성을 지연시키는 프로그래밍 패턴이다. 이 패턴은 초기 시스템 부하를 줄이고, 필요하지 않은 객체가 메모리를 차지하는 것을 방지하여, 성능을 향상시킬 수 있다.

지연 생성의 장점

  • 메모리 최적화: 실제로 필요할 때만 객체를 생성하므로, 메모리 사용량을 줄일 수 있다.
  • 성능 향상: 앱의 초기 로딩 시간을 줄일 수 있다.
  • 유지 관리: 사용하지 않는 코드나 리소스를 쉽게 식별하고 관리할 수 있다.

지연 생성 구현

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager GetInstance()
    {
        if (instance == null)
        {
            instance = FindObjectOfType<ScoreManager>();

            if(instance == null)
            {
                GameObject container = new GameObject("Score Manager");
                instance = container.AddComponent<ScoreManager>();
            }
        }
        return instance;
    }

    private static ScoreManager instance;
    private int score = 0;

    void Awake()
    {
        instance = this;
    }

    public int GetScore()
    {
        return score;
    }

    public void AddScore(int newScore)
    {
        score = score + newScore;
    }
}
  • if(instance == null): FindObjectOfType를 통해 싱글톤 객체를 찾지 못했다면, 새로운 게임 오브젝트를 생성하고 ScoreManager 컴포넌트를 추가한다.
  • GameObject container = new GameObject("Score Manager");: 새로운 게임 오브젝트를 생성한다.
  • instance = container.AddComponent<ScoreManager>();: 새로 생성한 게임 오브젝트에 ScoreManager 컴포넌트를 추가하고, instance 변수에 할당한다.
profile
개인 공부를 정리함니다

0개의 댓글