본문 바로가기

Unity 공부시작

유니티 :: 프로퍼티와 싱글턴 오브젝트

* 프로퍼티 : 어떤 값에 접근하는 징검다리


프로퍼티는


public 자료형 프로퍼티명

{

get {}

set {}

}


과 같이 선언된다.


get은 값을 리턴해주는 함수이고 set은 값을 변경해주는 함수이다.


괄호가 없어 인자를 받아올 수 없어 보이지만, 'value'를 이용하여 인자처럼 받아올 수 있다.


만약 set을 써주지 않고 get만 써준다면 읽기 전용 프로퍼티를 만들 수 있다.


이 프로퍼티의 용도는 private으로 선언된 변수에 다른 클래스에서 접근할 때 private로 선언된 변수를 변경하지 못하고 읽기만


할 수 있도록 해줄 수 있다.



GameManager를 읽기 전용 프로퍼티로 선언한 코드

private static GameManager instance;
    public static GameManager Instance
    {
        get
        {
            return instance;
        }
    }

    void Awake()
    {
        if(instance)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
    }



* GameManager, AudioManager 등과 같은 매니저는 씬에서 한 개만 존재해도 되는 것들이다.



https://onecoke.tistory.com/entry/Unity2D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84-%EB%82%A0%EC%95%84%EC%98%A4%EB%8A%94-%ED%99%94%EC%82%B4-%EB%A7%89%EC%95%84%EB%82%B4%EA%B8%B0?category=796454


위의 링크는 Unity 기능을 구현했던 것이다.


위의 기능을 구현할 때 싱글턴을 사용하지 않아서 프리팹에 GameManager를 넣는데에 조금 헤맸었다.


싱글턴을 이용하지 않았을 때에는 아래의 링크처럼 해결했다.

https://onecoke.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-prefab%EC%97%90-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-%ED%95%A0%EB%8B%B9



그러나 싱글턴을 이용하면 위 링크의 코드 모두 필요 없이, GameManager.Instance.ScoreUp();으로 사용하면 된다.




* 싱글턴 오브젝트 : 게임에서 사용되는 게임매니저, 오디오 매니저 등 게임 내에 유일한 독립체로 존재하는 오브젝트 


특징)


1. 클래스의 인스턴스가 하나만 생성됨을 보장한다.


2. 어디서든지 그 인스턴스에 접근이 가능하다 ( static )


3. 많은 싱글턴 오브젝트는 여러씬에 걸쳐 유지된다. ( 모든 싱글턴 오브젝트의 특징은 아니다 )


private static GameManager instance;
    public static GameManager Instance
    {
        get
        {
            return instance;
        }
    }

    void Awake()
    {
        if(instance)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
    }


위의 코드처럼 Awake() 함수에서 오브젝트 하나임을 보장해 주는 코드를  통해 싱글턴 오브젝트를 생성할 수 있다.


하지만 위와 같은 코드는 다른 스크립트의 Awake()에서 instance를 가져다 쓸 때, 어떤 스크립트의 Awake()가 먼저


실행될 지 보장되지 않기 때문에 오류가 날 수 있다. 이러한 오류를 방지하기 위해 Edit - Project Settings - Script Execution Order를 통해


스크립트의 실행 순서를 조정해주어도 되고, 혹은 코드를 아래와 같이 instance를 가져다 쓸 때 instance가 null이라면


생성해주는 형태로 해도 된다. 이러한 방법은 아래의 코드처럼 사용할 수 있다.


private static GameManager instance; public static GameManager Instance { get { if (instance == null) { GameObject tempGM = new GameObject("GameManager"); instance = tempGM.AddComponent<GameManager>(); } return instance; } }

GameManager 스크립트는 있지만 GameObject가 없는 경우 위와 같이 오브젝트를 생성해준 뒤 사용할 수 있다.


위의 코드처럼 사용하면, Awake() 함수를 지워도 된다.


단, 위의 코드를 이용하는 클래스에서 따로 다른 오브젝트와 연결하는 부분들이 있다면 연결해주어야 한다.