Unity/Unity - Solutions

싱글턴 객체 에러

HappyFrog 2021. 6. 22. 15:50

Lobby의 Init후에 로그를 출력해보니 UIRoom은 존재한다고 나온다.

하지만 싱글턴으로 사용 시에 객체가 없다고 나온다.

=> 필요없는 LobbyManager 싱글턴을 없애고 LobbyPUN2의 필드에 Lobby를 만들고 할당해주어 객체를 생성한 뒤에 메서드들을 실행시키니 원활하게 잘 돌아간다.

 

하지만 조금 더 깔끔하게 할 수 있는 방법이 있다고해서 배워보았다.

그 방법은 싱글턴을 Unity로부터 독립시켜 그저 다리(bridge)역할만 하도록 하는 방법이었다.

 

[서버(PUN2)] - [싱글턴] - [로컬(Unity)]

 

위의 간단한 도식과 같이 싱글턴은 로컬 스크립트에서 서버의 기능을 이용하게 해주는 역할만 수행하도록 하며, 해당 싱글턴 코드의 가독성과 편리함을 향상시키기 위하여 싱글턴에 할당할 인터페이스를 만들어주어 사용하면 된다.

 

Photon의 기능을 이용할 서버 스크립트이다. 모든 Callback들과 서버관련 함수들을 사용할 수 있다. 때문에 앱의 시작과 동시에 생성되며, DontDestroyOnLoad를 걸어둔다.

그리고 서버 스크립트를 이용할 수 있도록 해주는 싱글턴이다. 오른쪽은 그 싱글턴의 인터페이스이다. 해당 인터페이스를 통해 조금 더 명확하게 코딩을 할 수 있으며, 로컬스크립트에서는 해당 싱글턴의 객체를 static(정적)으로 불러와서 Init함수를 사용하면 서버스크립트를 가진 객체를 찾아낼 수 있으며 그 후로는 싱글턴의 함수들을 통하여 서버의 기능들을 이용할 수 있게된다.

 

정말 굉장한 구조인 것 같다. 내가 싱글턴 두개를 가지고 끙끙대고 있으니 강사님께서 오셔서 구조를 손봐주신 것인데, 아직은 Init을 어디서 실행해야 할 지, 나중에 OnRoomListUpdate와 같이 콜백이 자동으로 실행되는 메서드는 어떻게 실행을 시킬지 고민이 많이 되지만 우선은 굉장히 구조가 깔끔해졌다. 내가 구조를 깔끔히 하겠다고 싱글턴을 2개를 쓰던 때와는 비교도 안되게 깔끔해진 코드이다.

 

 

강철의 연금술사

(대가로 작성했던 코드의 70%이상을 지불했다 ㅎ..)