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); //씬 이동해도 사라지지않게
}