유니티 버전 - 2022.3.48f1
목차
- 들어가며
- 코드 및 설명
- 마치며
들어가며
어떤 스크립트에서 싱글톤 패턴을 구현할때 일반적으로 Awake에서 null체크를 하고 instance를 지정해주는 것이 일반적입니다, 하지만 모종의 이유로 스크립트가 붙은 오브젝트 자체가 씬에 없다면 스크립트를 참조하려고 할때 오류가 발생할 것입니다, 프로퍼티를 이용하여 더 안전한 접근을 하는 방법을 구현해보겠습니다
코드 및 설명
먼저 Awake입니다, 오브젝트가 활성화 상태로 존재한다면 실행되면서 인스턴스를 지정해줍니다
private void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
하지만 씬에 실수로 오브젝트를 올리지 않았는데 instance에 접근하려고 한다면 오류가 발생합니다, 이때 프로퍼티 내에서 instance의 여부를 판단하여 돌려주거나 생성해줍니다
using UnityEngine;
public class SomeManager : MonoBehaviour
{
private static SomeManager instance;
public static SomeManager Instance
{
get // 인스턴스에 접근하고자 할때 실행됩니다
{
if (instance == null)
{
instance = FindAnyObjectByType<SomeManager>();
if (instance == null)
{
GameObject someManager = new GameObject("SomeManager");
someManager.AddComponent<SomeManager>();
instance = someManager.GetComponent<SomeManager>();
}
}
return instance;
}
}
}
현재 씬에서 활성화or비활성화된 SomeManager타입의 오브젝트를 찾습니다
if (instance == null)
{
instance = FindAnyObjectByType<SomeManager>();
찾아봐도 씬에 SomeManager가 없다면 아래 구문을 실행 합니다
if (instance == null)
{
GameObject someManager = new GameObject("SomeManager");
// "SomeManager"이름을 가진 빈 게임 오브젝트 생성
someManager.AddComponent<SomeManager>();
// 빈 오브젝트에 <SomeManager>스크립트 추가
instance = someManager.GetComponent<SomeManager>();
// someManager의 컴포넌트를 가져와서 할당
}
}
return instance;
유니티 버전 2023 이후로만 FindAnyObjectByType<T>()를 사용가능합니다
유니티 버전 2023 이전은 FindObjectOfType<T>()로 수행해야합니다
여기서 둘의 차이는 전자는 활성화/비활성화된 모든 오브젝트를 탐색하지만, 후자는 활성화된 오브젝트만 탐색가능합니다
마치며
사실 개발을 하면서 의도했던 오브젝트가 씬에 없을 것이라는 가능성은 크게 고려하지 않았기 때문에, 프로퍼티에 추가적인 검사를 할 필요성을 느끼지 못했습니다, 하지만 코드를 더 안전하게 만들기 위해, 게임 오브젝트의 존재 여부를 확인하는 검사를 추가하는 것은 좋은 방법이라고 생각합니다, 이를 통해 예기치 않은 오류를 방지하고, 시스템의 안정성을 높일 수 있습니다
이상입니다
'코드 및 공부 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 싱글톤 패턴 (0) | 2024.09.14 |
---|