[유니티/C#] 메모리 정적 & 동적 할당과 유니티 내 싱글톤(Singleton) 패턴의 활용

728x90

메모리의 정적/동적 할당

유니티 컴파일러가 실행되는 동작 순서는 정적 메모리 영역 -> 동적 메모리 영역이다. 세부적으로 나눠서 살펴보면 먼저 정적 메모리 공간의 함수들이 실행되고, 정적 영역의 static 변수들이 실행된다. 그 다음 동적 메모리 공간에 저장된 변수들이 실행되게 된다. 

 

유니티 싱글톤(Singleton) 패턴 활용

이러한 메모리 할당 개념을 바탕으로, 싱글톤 객체를 설명해보고자 한다. 일단 유니티에서 생성되는 모든 객체는 최초로 동적 메모리 공간인 heap에 올라간다. 하지만 heap 영역에 위치한 객체들은 사용 범위에 한계를 가지고 있을 수 있다. 그렇기 때문에 객체 클래스 자체를 static 영역에 올리고 instance를 생성해 각각 클래스 별로 뿌려줄 수 있다. 이 것이 바로 관리자 개념의 싱글톤의 역할이다.

public static PlayerHealth Instance = null;

 

싱글톤은 static 메모리 영역에 할당되긴 했지만 instance를 생성했기 때문에 동적으로 사용할 수 있는 장점을 가지고 있다.

public static PlayerHealth Instance = null;
private void Awake()
{
    if(Instance == null)
    {
        Instance = this;
    }
}
PlayerHealth.Instance.HP--;

다음은 플레이어 체력을 표시하는 싱글톤 객체이다. PlayerHealth 스크립트를 해당 객체에 붙이고, 만약 체력을 깎아야 되는 상황이라면 Instance 객체를 생성하고 특정 스크립트 또는 함수(예 : Bullet.cs - OnCollsionEnter)에 붙여주면 된다.

 

private static TestMyClass Instance;
public int hp;

public static TestMClass GetIntance()
{
	if(Instance == null)
        {
    	     Instance = new TestMyClass();
        }
        return Instance;
}

다음은 기본적으로 static 객체를 생성하고 최초의 Instance를 생성하는 싱글톤 패턴의 기본 형식이다. Instance가 null이기 때문에 new 생성자를 이용해 첫 TestMyClass Instance를 생성해주고 이를 사용해주면 된다. 

게임 제작 과정에서는 gameObject를 이미 생성해두기 때문에 Instance = this; 형식으로 찾아서 사용해주면 된다.

728x90