팀플 - 특강 - 배고파요 - 팀플 - 특강 - 팀플
그래도 어제 일한 덕분에 코드 리팩토링 끝냈다 ,,
과연 진짜 끝났을까.
1인 게임 개발자 특강
모델
- 복셀 모델과 폴리곤 모델
- 지형은 폴리곤 모델 (Blender)
- 캐릭터, 자잘한 것들, 차량은 복셀 모델
지형과 레벨 디자인
- Editor Scripting으로 지형을 만드는 환경을 자체적으로 개발
콘텐츠 아이콘
- 생성형 인공지능을 사용
- 게임에서 아이콘은 차지하는 면적은 작지만 중요도는 높고, 외주 비용도 비쌈
효과음
- 사운드 라이브러리 유료 결제
- splice -> 어떤 분이 채팅창에 추천해주심
백엔드
- Google Firebase 사용
- 뒤끝, Google Player Game Service, Apple Game Center, AWS Lamda 등등은 여러 제약 사항이 있어서 사용하지 않았음
Tip
- Enter Play Mode 선택사항 켜기
- 편집기에서 실행 화면이 뜰 때까지의 시간을 비약적으로 향상시켜줌
- 단, 정적 필드에 대한 문제를 해결해줘야 함
- 어셈블리 정의
- 스크립트가 많을 경우 고려
- 프로젝트에 따라 효과가 없을 수도 있음
프로토타입과 구조 설계
- 프로토타이핑을 통해 가능성을 확인 후 개발 시작
- 프로토타입은 구조적인 것을 고려하지 않음
-> 가능성만 확인 후 버리기
- 설계 구조를 잘 짜서 새로 만드는 것이 좋음
취업/이직을 위한 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>();
}
_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;
}
TODO
- 계획에 없었는데 TIL 쓰면서 갑자기 생긴 투두
얕은 지식으로 사용했더니 이런 불상사가..
배포된 빌드에서는 사용할 수 없다니.............. ;ㅁ;
결국 DontDestroyOnLoad로 다시 돌아가게 되는구나 ..
그냥 넘어가기엔 우리 게임을 모바일 게임처럼 만들어서 사실 이 부분은 수정을 해야 될 것 같다,,
지금은 DataManager로 데이터를 업데이트하고 관리하는 역할인데, 빌드 파일에서는 사용이 안 된다는 것 같으니 수정을..... 뿌엥
TODO
- 패들 스킨 선택 UI 및 로직 구현
- StartScene UI 프리팹들 수정
- 버그 테스트 및 밸런스 조절
- 시연 영상 작업
- 발표 및 PPT 준비
- GitHub README 꾸미기
- 노션 기록
- 어라?
- 야근이다
- ㅇ<-<
끗 .