TIL? Today I Learned, SCC를 진행하면서 하루 배운 내용을 복습하기 위해 작성한다.
싱글톤 디자인 패턴은 전에 글로 다뤘던 기억이 있어서 해당 글을 참고하면 좋을 것 같다. 장점과 단점에 대해서도 알고 있는게 좋다.
[Unity] C# - 싱글톤(SingleTon) 코드
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
public static T Instance { get; private set; }
private static System.Action<T> s_onAwake;
public static void WhenInstantiated(System.Action<T> action)
{
if (Instance != null)
action(Instance);
else
s_onAwake += action;
}
protected virtual void Awake()
{
if (!enabled)
return;
if (Instance != null)
{
Debug.LogWarning($"Another instance of Singleton {typeof(T).Name} is being instantiated, destroying...", this);
Destroy(gameObject);
return;
}
Instance = (T)this;
InternalAwake();
s_onAwake?.Invoke(Instance);
s_onAwake = null;
}
protected void OnEnable()
{
if (Instance != this)
Awake();
}
protected virtual void InternalAwake() { }
}
InvokeRepeating("MakeRain", 0, 0.5f);
InvokeRepeating(메소드 이름, 시작 대기 시간, 반복 주기);
따라서 위의 예제는 MakeRain이라는 함수를 0초 이후에 0.5초 주기로 실행하겠다는 뜻이다.
함수를 일정 주기에 맞춰서 메소드를 호출하는 코드인데 실제 개발하면서 그렇게까지 많이 호출하지는 않았던 것 같다. 실제로는 Coroutine 이나 Unitask로 비동기처리를 했었다. 이에 대해 InvokeRepeating이나 Coroutine의 비교에 대한 글이 유니티 커뮤니티에 있길래 읽어봤다.
그렇게까지 큰 성능 차이는 미비하지만 대부분이 Coroutine을 선호하는데 제일 큰 이유는 문자열을 통해 메소드를 Invoke에 전달해야하기 때문에 버그 발생이 쉽다는 이유로 대부분이 Invoke와 InvokeRepeating을 기피한다고 한다.
진짜 성능까지 따지면서 쓰려면 UniTask가 Coroutine보다 성능이 더 좋기 떄문에 UniTask를 사용하는 것도 좋은 방안이다.
Update를 사용한 프레임 별 실행에 대해서도 다뤘는데 실제로 실행 주기를 알고 있으면 크게 도움이 된다.

유니티 공식에 업로드 되어있는 이미지인데 우리가 잘 알고 있어야 하는 순서는 아래와 같다.
Awake - OnEnable - Start - ( FixedUpdate - Update - LateUpdate ) - OnDisable - OnDestroy
Update 종류에 따른 순서를 기억하고 있어야한다.