본문 바로가기

무제_LR

ScriptableObject는 항상 동일한 인스턴스가 아니다?!?!?!?!?!?!?!?!?!?!?!?

여기 이전에 보여드렸던 메세지 브로커 역할을 하는 ScriptableEventSO가 있습니다.

 

각각 다른 프리팹 GlobalManager와 LocalManager의 EventListener가 이 SO를 참조하고 있었습니다.

그런데 LocalManager에 부착된 Listener가 작동을 하지 않아서 이리저리 살펴보니 웬 일??????

 

구독 및 호출 코드에서 해당 SO의 InstranceID를 확인해보니

GlobalManager의 Listener가 참조하는 ScriptableEventSO와

LocalManager의 Listener가 참조하는 ScriptableEventSO가 서로 다른 객체였던 것입니다!?!?!?!?!?!?!?!?!?

GPT에 물어보니 매 씬이 바뀔 때마다 직렬/역직렬을 거치는 과정에서 참조 SO가 새로 인스턴싱된다고 합니다.

그런데 최초 씬인 Initialize Scene에서부터 SO의 Enable이 2번 호출되는거로 보아 씬 변경과 관계없이 인스턴스가 2개 생기는 것 같은데??????????

 

암튼 해결 방법은 SerializedField로 박아넣지 말고 Resource.Load로 호출하라는 의미없는 조언뿐이었습니다.

    public static ScriptableEventSO instance;

    private void OnEnable()
    {
      if (instance == null)
        instance = this;
    }

이리저리 머리를 싸매고 고뇌한 결과 걍 이 SO를 싱글톤화시키니 원하는 대로 정상 작동했습니다.

 

  public class ScriptableStageEventListener : MonoBehaviour
  {
    [SerializeField] private StageEventType type;
    [SerializeField] private UnityEvent stageEvent;

    private void OnEnable()
      => ScriptableEventSO.instance.RegisterStageEvent(type, this);

    private void OnDisable()
      => ScriptableEventSO.instance.UnregisterStageEvent(type, this);

    public void Raise()
      => stageEvent?.Invoke();
  }
}

내가 클래스를 만들어 쓰란 것도 아니고 이미 에셋에 존재하는 SO를 참조하라는데 그걸 왜 뭔 인스턴스를 또 만들고 어이가없어서진짜