Unity 내일배움캠프 TIL 0912 | UI Manager 코드 리팩토링 | Scriptable Object

cheeseonrose·2023년 9월 12일
0

Unity 내일배움캠프

목록 보기
32/89
post-thumbnail

팀플 - 특강 - 배고파요 - 팀플 - 특강 - 팀플

그래도 어제 일한 덕분에 코드 리팩토링 끝냈다 ,,

과연 진짜 끝났을까.

1인 게임 개발자 특강

모델

  • 복셀 모델과 폴리곤 모델
  • 지형은 폴리곤 모델 (Blender)
  • 캐릭터, 자잘한 것들, 차량은 복셀 모델

지형과 레벨 디자인

  • Editor Scripting으로 지형을 만드는 환경을 자체적으로 개발

콘텐츠 아이콘

  • 생성형 인공지능을 사용
  • 게임에서 아이콘은 차지하는 면적은 작지만 중요도는 높고, 외주 비용도 비쌈

효과음

  • 사운드 라이브러리 유료 결제
  • splice -> 어떤 분이 채팅창에 추천해주심

백엔드

  • Google Firebase 사용
  • 뒤끝, Google Player Game Service, Apple Game Center, AWS Lamda 등등은 여러 제약 사항이 있어서 사용하지 않았음

Tip

  • Enter Play Mode 선택사항 켜기
    • 편집기에서 실행 화면이 뜰 때까지의 시간을 비약적으로 향상시켜줌
    • 단, 정적 필드에 대한 문제를 해결해줘야 함
  • 어셈블리 정의
    • 스크립트가 많을 경우 고려
    • 프로젝트에 따라 효과가 없을 수도 있음

프로토타입과 구조 설계

  • 프로토타이핑을 통해 가능성을 확인 후 개발 시작
  • 프로토타입은 구조적인 것을 고려하지 않음
    -> 가능성만 확인 후 버리기
  • 설계 구조를 잘 짜서 새로 만드는 것이 좋음



취업/이직을 위한 TIL 작성법

TIL의 의미

  • 내가 학습한 내용, 아는 내용을 증명 + 잊지 않기 위한 수단
  • TIL을 통해 업무 성향, 성실도, 협업 가능성, 성장과정(과거 글 ~ 최근 글 비교) 파악 가능

  • 면접 전날 TIL을 꼭 정주행할 것

TIL 작성법

  • 제목에 학습한 내용과 기술적 키워드 담기
  • 내용을 구조적으로 설계 (번호, 소제목 사용)
  • 문제, 시도, 해결, 알게 된 것에 대한 내용 담기



UI Manager 코드 리팩토링

시퀀스 다이어그램

  • 코드 리뷰하면서 팀원들에게 설명도 하고 추후에 PPT에도 넣을겸 시퀀스 다이어그램을 만들어봤다. 일단은 GameOverPanel에 관련된 로직만 만들었음
  • 중요한 부분은 GameUIManager는 Stage가 요청한 UI 오브젝트들을 Dictionary 형태로 관리하는데, 이때 요청받은 오브젝트가 Dictionary 안에 없다면 Resources 폴더 안에서 Load 해온뒤 Dictionary에 저장한다.

GameUIManager

  • UI 오브젝트들을 Dictionary로 관리하는 GameUIManager이다.
  • GetUIComponent를 통해 Stage 객체가 UI 오브젝트 할당을 요청하면, 현재 Dictionary 안에 있는지 확인한 후 없으면 Resources 폴더에서 해당 UI 프리팹을 Load 해온다.
public class GameUIManager : MonoBehaviour
{
	public Dictionary<string, MonoBehaviour> stageUIDic;
    
    public static GameUIManager Instance;
    
    private void Awake()
    {
    	Instance = this;
        stageUIDic = new Dictionary<string, MonoBehaviour>();
    }
    
    public T GetUIComponent<T>() where T : MonoBehaviour
    {
    	if (!stageUIDic.ContainsKey(typeof(T).Name))
        {
        	var obj = Instantiate(Resources.Load($"Prefabs/UI/{typeof(T).Name}"));
            stageUIDic.Add(typeof(T).Name, obj.GetComponent<T>());
        }
        return stageUIDic[typeof(T).Name] as T;
    }
}
  • Stage.InitUIComponent
    • Stage 클래스에서는 이런 식으로 GameUIManager에 접근하여 UI 오브젝트들을 받아온다.
private void InitUIComponent()
{
	_gameOverPanel = GameUIManager.Instance.GetUIComponent<UIGameOverPanel>();
    _scoreAndTimePanel = GameUIManager.Instance.GetUIComponent<UIScoreAndTimePanel>();
}
  • 받아온 UI 오브젝트는 요렇게 사용
 _gameOverPanel.SetGameOverPanel(isClear, _score, starRating);



ScriptableObject

  • DontDestroyOnLoad가 예외처리를 해줘도 계속 중복되는 문제가 있어서 해결 방법을 찾다가 ScriptableObject라는 것을 알게 되었다
    바로 사용해.

정의

  • 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너
  • 값의 사본이 생성되는 것을 방지 -> 메모리에는 데이터 사본을 하나만 저장
  • 모든 프리팹의 레퍼런스를 통해 액세스 가능
  • 게임 오브젝트에 연결하는 MonoBehaviour와 달리 프로젝트의 에셋으로 저장해야 함
  • ScriptableObject에 데이터를 저장하는 작업은 편집할 때나 런타임에 가능
  • 배포된 빌드에서는 ScriptableObject를 사용할 수 없음 -> 대신 개발할 때 설정한 ScriptableObject 에셋의 저장된 데이터 사용 가능

사용 방법

  • ScriptableObject를 상속받는 스크립트를 생성한다.
    • menuName은 Asset 폴더에서 우클릭했을 때 나오는 메뉴 창에서 표시될 이름
    • order는 메뉴 창에서 표시될 순서
[CreateAssetMenu(menuName = "Data Manager", order = 1)]
public class DataManager : ScriptableObject
{  
	public int curStage = 1;
    public int lockedStage = 1;
    
    public int easyStar = 0;
    public int normalStar = 0;
    public int hardStar = 0;
}
  • Asset 폴더 우클릭 -> Create -> DataManager 생성
  • 그러면 짜잔 이렇게 생성된다!
  • 이제 요 프리팹을 연결해줄 스크립트에 끌어다놓으면 끝
  • 코드 상에서 이렇게 불러와서 사용하면 된다
    public DataManager _dataManager;

TODO

  • 계획에 없었는데 TIL 쓰면서 갑자기 생긴 투두
    얕은 지식으로 사용했더니 이런 불상사가..
    배포된 빌드에서는 사용할 수 없다니.............. ;ㅁ;
    결국 DontDestroyOnLoad로 다시 돌아가게 되는구나 ..
    그냥 넘어가기엔 우리 게임을 모바일 게임처럼 만들어서 사실 이 부분은 수정을 해야 될 것 같다,,
    지금은 DataManager로 데이터를 업데이트하고 관리하는 역할인데, 빌드 파일에서는 사용이 안 된다는 것 같으니 수정을..... 뿌엥



TODO

  • 이건 진짜 투두..
  1. 패들 스킨 선택 UI 및 로직 구현
  2. StartScene UI 프리팹들 수정
  3. 버그 테스트 및 밸런스 조절
  4. 시연 영상 작업
  5. 발표 및 PPT 준비
  6. GitHub README 꾸미기
  7. 노션 기록
  8. 어라?
  9. 야근이다
  10. ㅇ<-<

끗 .

0개의 댓글