나 개발자 진짜 되냐?

[ 12月 19日 ] 오늘 내가 배운 것 _ 68日次 _ 오늘은 발표 자료 준비中 본문

오늘 공부를 정리해봐요!

[ 12月 19日 ] 오늘 내가 배운 것 _ 68日次 _ 오늘은 발표 자료 준비中

Snow Rabbit 2024. 12. 19. 22:46

 

나는 지금 발표자료 준비 중

 

발표자료 준비하면서

내 코드에 대해서

다시 돌아보는 시간을 가졌다.

 

.. 어렵다

다시 봐도 어렵다.

 

발표자료를 정리하면서

나중에 들어올 질문도 재차 확인해야 하고

데이터도 확인해야 하고..

쉽지 않다.

 

면접준비도 해야 하고.

 

오늘은 내가 만든 매니저들을 정리해 보는 시간을 살짝 가져보자.

 

< Singleton >

 

 

싱글톤을 상속받는 매니저들이다.

 

이 싱글톤은 추상화를 통해

 

독립적으로 사용할 의도가 없고

하위클래스에서만 사용을 하게끔 하고

싱글톤의 공통 조작들을 제공해 줄 수 있게 했다.

 

 

< ResourceManager >

 

경로에 대한 설정을 하기 위해

리소스 밑에 파일들을 enum으로 해주고

 

이미 불러온 데이터를 딕셔너리에 저장하고,

 

리소스폴더에서 데이터를 불러오는 방식을

동기로 가져오는 과정과

비동기로 가져오는 과정을 

두 개로 나누어서 구분된다.

 


동기에서는

리소시스 폴더에서 데이터를 즉시 로드한다.

 

에셋풀이 있다면 캐시 된 데이터를 반환한다.

handle이 되겠네요

 

딕셔너리 키값이 없다면

 

Resources.Load로 데이터를 로드하고

성공하면 assetPool에 추가한다.

 

 

비동기로드에서는

 

로드 중에 다른 작업을 수행할 수 있게 해 준다.

 

코드는 굉장히 똑같다.

 

 

로드에셋함수는 어떤 데이터를 불러올지 모르기 때문에

프리팹이나 스프라이트나 뭐 게임오브젝트나 등등

T로 반환하고 T를 꼭 써줘야 한다.

 

< SceneLoadManager >

 

ChangeScene이 중요한데

여기는 씬로드 자체를 제어하기 위해 있는 친구이다.

 

SceneManager.LoadScene은 비동기이기 때문에

그 밑의 코드들의 순서를 보장하지 못한다.

 

그래서 async 해주어

씬의 진행상황을 받아올 수 있게 되었다.

 

isDone을 통해

끝나지 않았다면

디버그 찍어주고

await 해줘서 기다린다.

 

while문이 끝나면

씬을 확인해 보고

씬 이름을 nowScene에 넣어주고 액션을 실행시켜 준다.

 

while문이 근데 또 비동기가 아니기 때문에

이 전체를 다 비동기 해주어야 한다.

 

그래서 이 함수 전체에다가 async를 달아준다.

 

 

UnLoad도 마찬가지이다.

이 친구는 single이 아니라

addtive로 해주면 다 쓰고 꺼줘야 하기 때문에 있는 친구이다.

 

 

 

< UIManager >

 

여기서는 UI를 동적으로 생성해 주는 친구이다.

 

Resource 폴더에 UI 프리팹을 로드해 주고

show, hide로 껐다 킬 수 있게 해 주었다.

무엇보다

이 UI를 딕셔너리에 저장해서 재사용이 가능하게 해 주었다.

 

 

밑에 코드를 보자

 

UI가 표시될 부모 트랜스폼을 만들어준다.

부모 오브젝트가 이동하면 같이 움직일 수 있게 해 주었다.

 

FindFirstObjectByType  함수를 사용하여

씬에서 특정 타입의 첫 번째 객체를 검색해서 찾는다.

 

SceneBase타입의 첫번째 객체를 찾아준다.

 

 

show해주는 부분이다.

UI프리팹을 Resource파일에서 가져와주고 보여주게 된다.

 

uiList.TryGetValue(uiName, out UIBase ui);

이 부분이 특히 어려웠는데

 

 

아까 만들어둔 딕셔너리에서 키값을 찾아주는 함수라고 한다!

 

키가 있으면 uiList 안에 uiName값을 ui에 넣어주고

아니면! ui는 null이고 메서드는 false로 준다.

 

hide 해주는 부분이다.

 

메모리방지를 위해

UI를 제거하고 딕셔너리에서 삭제해 준다.

 

 

여기가 이제 UI를 로드해 주는 곳이다.


동적으로 캠버스를 만들어주고

사이즈 및 설정을 해준다.


 

 

만약에 우리가 게임씬이든 인트로씬이든

둘 다 게임매니저라는 오브젝트 친구가 있어야 한다고 쳐보자.

 

그렇게 되면

씬이 바뀔 때마다 

싱글톤에 의해 새로운 게임매니저 오브젝트가 생성될 것이다.

 

그러면 그 오브젝트에 달려있던 인스펙터들이 날아가버리기 때문에

싱글톤으로 만들어 둔 의미가 없어진다.

 

그래서 우리는

 

현재 존재하는 오브젝트를

씬을 하나 만들어서 다 넣어주고

addtive를 활용해서 모든 씬이 로드될 때 

매니저가 있는 씬을 먼저 로드되게 만들어 둘 것이다. 

 

그래서 모든 씬들이 시작하기 전에

매니저가 있는 씬을 먼저 실행시키게 해줄 것이다.

 

그래서 씬들에게

너보다 먼저 만들어지는 씬이 있어..

라는 사실을 알려주기 위해

 

씬베이스를 만들어줄 것이다.

 

< SceneBase >

 

 

isDontDestroy를 실행한 적이 있냐?

없다면 씬을 이동해 주고

true 해줘서 실행했다고 알려주고

다시 unload 해준다.

addtive이기 때문에

화면이 끝나면 unload 해줘야 한다.

 

이쯤하고

내일은 데이터부분에 대해 정리해봐야겠다.