* 프로퍼티 : 어떤 값에 접근하는 징검다리
프로퍼티는
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 등과 같은 매니저는 씬에서 한 개만 존재해도 되는 것들이다.
위의 링크는 Unity 기능을 구현했던 것이다.
위의 기능을 구현할 때 싱글턴을 사용하지 않아서 프리팹에 GameManager를 넣는데에 조금 헤맸었다.
싱글턴을 이용하지 않았을 때에는 아래의 링크처럼 해결했다.
그러나 싱글턴을 이용하면 위 링크의 코드 모두 필요 없이, 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() 함수를 지워도 된다.
단, 위의 코드를 이용하는 클래스에서 따로 다른 오브젝트와 연결하는 부분들이 있다면 연결해주어야 한다.
'Unity 공부시작' 카테고리의 다른 글
유니티 :: Dictionary에 TextAsset을 이용하여 텍스트 파일 읽어오기 (0) | 2019.01.11 |
---|---|
유니티 :: 컬렉션 ( List, Stack, Dictionary ) (0) | 2019.01.11 |
유니티 :: 좌표계 (0) | 2019.01.07 |
유니티 :: 이벤트 함수 (0) | 2019.01.07 |
유니티 :: prefab에 오브젝트 할당 (0) | 2019.01.07 |