Unity 내일배움캠프 TIL 0911 | Stage 종료 패널 생성 | Scene 이동 | Unity를 위한 GitHub 특강

cheeseonrose·2023년 9월 11일
0

Unity 내일배움캠프

목록 보기
31/89
post-thumbnail

Unity 프로젝트를 위한 GitHub 특강

Git 협업 시 주의사항

  • Assets, Packages, ProjectSettings만 올리면 됨
  • .gitignore 중요 별표 백만개
  • 각자 작업의 파트를 분리
    • 해당하는 파트의 스크립트만 만들어서 생성 / 관리
    • 각 UI별로 할 일을 나누는 것도 좋은 방법
  • Git은 한 번이라도 Push 하면 기록이 남음
  • Commit은 한 번에 하나의 작업 단위로 올리는 것이 좋음
    • 명확한 이름으로 어떤 작업을 했는지 남길 것
  • Scene, Prefab은 수정할 때 꼭 미리 공유하고 진행

Tip

  • Find 계열 함수, SendMessage, BroadcastMessage 함수는 유지보수에 큰 어려움을 겪게 하므로 사용하지 않는 것이 좋음
    -> 시간복잡도↑ 성능↓ 오타로 인한 오류 발생 가능성↑
    • GameObject.Find는 거의 절대 안 씀
  • LINQ도 사용하지 않는 것이 좋음
  • Tag는 그나마 괜찮음
  • 쓰지 않는 기능은 삭제 (Update 등)
  • GetComponent는 성능면으로 무거운 작업이므로 변수에 저장해뒀다가 사용하면 도움이 됨 (캐싱)
  • 연쇄 호출을 피하자
    _stageManager.GetCharacterByName("Chad").GetComponent<PlayerData>().HP = 10;
    • 코드가 길어지면 분석이 힘들어짐
    • 각 계산 결과가 null이라면 그 다음 연산에 문제가 생김
      -> stage에 Chad라는 사람이 없으면 문제 발생
  • Unity Job System
  • DOTS: ECS (엔티티 컴포넌트 시스템) -> 나중에 공부해보기
    • 총알이 날아가는 것은 총알이 하는 일
    • 총알을 생성하고 지우는 것은 Manager가 하는 일
  • 고정된 문자열은 클래스 위에 모아서 상수로 선언해두고 활용하는 것이 좋음
  • Trigger가 UIManager, StageManager, PlayerManager를 생성 (최초의 Hierarchy 창에는 Trigger만 올라가있는 상태)
    • UIManager - 싱글톤
      • UIPopup
    • StageManager - 싱글톤
    • PlayerManager - 싱글톤
      • Player
    • Player가 UIPopup이 필요해지면 UIManager에게 접근 -> UIManager.Instance.Popup에 접근
    • UIPopup에서 캐릭터 이름이 필요해지면 PlayerManager에 접근 -> PlayerManager.Instance.Player에 접근
    • 어떻게 들고 있을거냐 -> 배열, 콜렉션 등을 사용
  • Manager는 싱글톤, Manager 하위의 UIManager, GameManager는 싱글톤이 아닐 수도 있음
    -> 그때그때 상황에 맞는 방식으로 구현



튜터님 답변 정리

Find 함수를 사용하지 않으면 어떻게 오브젝트를 불러오나요

  • 튜터님은 같은 프리팹 내에서는 [SerializeField]로 선언해주고 Inspector 창에서 연결시켜준다고 하셨다.
  • UI의 경우에는 기능별로 클래스를 만들고, 해당 UI에 스크립트를 연결
    -> 이 UI들을 한 번에 관리하는 곳이 UI Manager이고, UI Manager에서는 다른 곳에서 UI 기능을 호출할 때 적절한 클래스로 연결시켜주는 역할
  • UI Manager에서 UI 클래스들을 관리하는 방법은 변수로 선언하는 것이 아닌 Dictionary(Java로 치면 Map)에 담는 것
    클래스의 이름이 Key 값이 된다.

스테이지 점수를 표시하는 별 이미지를 Load 해서 넣는 방법 vs 미리 만들어놓고 SetActive로 설정

  • 지금은 비어있는 별과 채워져있는 별 두 가지밖에 없기 때문에 SetActive로 설정하는 것이 성능 면에서는 더 낫다.
    -> Load는 많을수록 성능에 안 좋음

DontDestroyOnLoad의 중복 생성 문제

  • Hierarchy 창에 StageManager를 꺼내놓지 말고, null일 때 new GameObject로 생성하게 하는 방법
  • DataManager를 두고 필요한 Data들을 관리하는 방법



팀 프로젝트

GameOverPanel

  • 원래는 Stage 클래스에서 StageUIManager를 호출 -> Stage 패널을 Set할 것을 요청
    이런 로직이었는데 튜터님한테 질문했던 내용을 바탕으로 수정 중이다.
    Stage 클래스에서 StageUIManager가 가진 gameOverPanel을 호출 -> Stage 패널을 Set할 것을 요청
    GameOverPanel 스크립트는 GameOverPanel에게 주고, Inspector 창에서 하위 오브젝트들을 연결
  • GameOverPanel
    • 현재 이미지를 Load하는 부분도 비어있는 별과 채워진 별 이미지를 각각 만들고 SetActive로 바꿀 예정이다.
    • SetBtn은 Awake 쪽으로 옮길 예정
// 점수에 따른 별 이미지 세팅
private void SetStarImage(int starRating)
{
	Sprite filledStar = Resources.Load<Sprite>("Image/StarImage/filled_star_img");
    Sprite emptyStar = Resources.Load<Sprite>("Image/StarImage/empty_star_img");
    
    _star1Image.sprite = (starRating >= 1) ? filledStar : emptyStar;
    _star2Image.sprite = (starRating >= 2) ? filledStar : emptyStar;
    _star3Image.sprite = (starRating >= 3) ? filledStar : emptyStar;
}

// Stage End Panel의 Home, Retry, Next Stage 버튼에 Click Listener를 달아줌
private void SetBtn()
{
	_homeBtn.onClick.AddListener(() => { GameManager.I.GoHome(); });
    _retryBtn.onClick.AddListener(() => { GameManager.I.RetryGame(); });
    _nextStageBtn.onClick.AddListener(() => { GameManager.I.GoNextStage(); });
}
  • 그리고 짜잔~ 디자인.. 근데 배경이 없어서 구려보임 ㅇㅅaㅇ

TODO

  • GameOverPanel에 비어있는 별과 채워진 별 이미지 추가
  • StageUIManager와 GameOverPanel의 분리 + 이에 따른 로직 수정
  • GameManager의 GoHome, RetryGame, NextStage 함수 로직 완성
    • GoHome의 경우 DataManager를 StartScene에 생성해서 DontDestroyOnLoad로 넘기는 방법 시도해보기



야근이다!!! 야근!!!!!!!!!!!

끗 ..

0개의 댓글