Unity Singleton 유용한 항목만 정리


Unity Singleton 유용한 항목만 정리 1
썸네일

Unity를 사용하면서 만난 첫 번째 싱글톤은 단순했습니다.

나는 gameManager에서 싱글톤을 구현하고 모든 종류의 스크립트에서 참조했습니다.

물론 규모가 커질수록 바로잡을 수 없어 파산했다.

오늘은 이 싱글톤을 정리하겠습니다.


#1 그냥 싱글톤

public class gameManager : MonoBehaviour
{
    //instance를 static으로 선언해서 다른 오브젝트에서도 접근 가능
    public static gameManager instance;
    
    public int enemyLeftAmt; //공유할 아무 변수
    
    void Awake()
    {
        if (instance !
= null) //이미 존재하면 { Destroy(gameObject); //두개 이상이니 삭제 return; } instance = this; //자신을 인스턴스로 DontDestroyOnLoad(gameObject); //씬 이동해도 사라지지않게 } }

몇 년 동안 사용 습관이 되다 나는 프로젝트의 크기에 관심이 없었고 작성하는 동안 맞았습니다.

위의 코드로 만든 게임매니저 하나의 오브젝트에 스크립트를 그대로 넣으면

다른 개체의 스크립트다음과 같이 액세스할 수 있습니다.

public class 다른스크립트 : MonoBehaviour
{
    private void Start()
    {
    	//요런식으로 모두가 gameManager에 접근 가능
        int nowLeftNum = 999999;
        gameManager.instance.enemyLeftAmt = nowLeftNum;
    }
}

gameManager.instance.variable 또는 함수

이런 식으로 전역적으로 사용할 수 있습니다.

DontDestroyOnLoad(게임 오브젝트)장면을 이동할 때 파괴되는 것을 방지하는 것입니다.


#2 정적 필드(정적 필드) 하나씩 일어나는 것

┌인스턴스 필드? 정적 필드?

더보기

인스턴스 필드: 클래스 내에서 선언된 일반 변수,

고유한 메모리를 확보하기 위해 new 키워드를 사용하여 메모리 주소를 생성합니다.

정적 필드: static 키워드로 정의된 변수,

인스턴스가 없더라도 생성 즉시 메모리에 할당됩니다.

public class Player : MonoBehaviour {
    public static Player InstanceField;
    public static Player GetInstanceField(){
        return InstanceField;
    }
    public static void SetInstanceField(Player instanceField)
    {
        Player.InstanceField = instanceField;
    }
    void Awake()
    {
        if (InstanceField !
= null) //이미 존재하면 { Destroy(gameObject); //두개 이상이니 삭제 return; } InstanceField = this; //자신을 인스턴스로 DontDestroyOnLoad(gameObject); //씬 이동해도 사라지지않게 } }

gameManager일 필요는 없었기 때문에 Player 클래스에 적용했습니다.

예상대로 이번 사건도 #1 그냥 싱글톤에서와 같이 스크립트의 개체가 사라지지 않아야 합니다.

잊지마 DontDestroyOnLoad(게임 오브젝트)넣어 보자


#3 속성 싱글톤

public class Player : MonoBehaviour {
    private static Player instance;
    public static Player Instance{
        get{
            return instance;
        }
        set{
            instance = value;
        }
    }
}

속성에 대해 잘 모르신다면 이 부분아주 자세하게 나옵니다.

참고로 C#은 속성을 자동으로 구현할 수 있으므로 다음과 같이 작성할 수 있습니다.

public class Player : MonoBehaviour {
    public static Player Instance{ get; set; }
}

위의 프로퍼티 싱글톤과 유사하며, 코드의 길이가 짧아져 깔끔해졌습니다.

그러나 이 기능은 다음과 같이 사용할 수 있습니다.

public class Player : MonoBehaviour {
    public static Player Instance{ get; private set; }
}

차이점은 private 키워드가 set 속성 접근자 앞에 배치된다는 것입니다.

이 경우 같은 클래스 내에서만 설정하도록 변경할 수 있습니다.

이렇게 하면 누구나 전역적으로 접근할 수 있지만 읽기 전용 느낌으로 사용할 수 있습니다.

마찬가지로 속성 싱글톤은 선언 후 Awake에서 한 번 설정해야 합니다.

void Awake()
{
    if (Instance !
= null) //이미 존재하면 { Destroy(gameObject); //두개 이상이니 삭제 return; } Instance = this; //자신을 인스턴스로 DontDestroyOnLoad(gameObject); //씬 이동해도 사라지지않게 }