- CageSystem
CageSystem
진행 중인 팀 프로젝트에서 제작을 맡은 Cage 부분의 내용
목적
몬스터를 가둬두고 몬스터에게 영향을 줄 Cage가 필요했다.
또 몬스터, 케이지의 상태를 카드를 사용 상호작용 해서 바꿀 수 있도록 구현했다.
CageSystem 도식
처음 CageSystem을 구현한 후 도식화 했다.
여러 기능이 Cage에 너무 많이 집중되어 있어서 리팩토링을 거쳤고 아직 도식화 하지 못했다.
CageManager
-
ObjectPool
Cage들에 카드를 사용했을때 사용한 카드가 표시될 수 있도록 이미지를 생성해주었는데 여러 턴을 진행할 경우 카드 이미지가 계속해서 생성되고 파괴되는 부분을 최적화 하기 위해서 ObjectPool방식을 사용했다. 처음에는 Cage마다 Pool을 들고 있다가 어차피 모든 Cage가 같은 이미지를 사용하기 때문에 CageManager로 옮겨서 한꺼번에 관리하게 변경하였고 모듈화 하는 것이 좋다는 튜터님의 피드백도 있어서 다른 부분에서 ObjectPool이 필요하다면 따로 클래스로 만들어 줄 예정
-
Singletion 디자인 패턴
CageManager는 DataManager가 저장하고 있는 정보를 로드하여 Cage 게임 오브젝트들을 생성하고 관리 해야되기 때문에 하위 Cage 관련 클래스들에서 쉽게 접근할 수 있도록 싱글톤 패턴으로 구현하였다. Cage들은 씬을 이동할 때 파괴되기 때문에 씬 이동시 다시 생성해줄 필요가 있어서 Cage들과 CageManager가 함께 파괴되고 재 생성 되었을때 로드해서 기존 정보를 이용해 Cage를 만들 수 있도록 Monobehaviour를 상속받고 관련 기능들을 구현했다.
</br>
-
List 자료구조
Cage를 저장하는 List<Cage>와 비어있는 Cage의 index를 저장할 List<int>를 사용해서 비어 있는 Cage를 찾을 필요가 없도록 구현했다. 데이터들을 메서드로만 추가하고 제거하게 하기 위해서 private로 구현했다.
CageCameraSystem
-
RenderTexture
메인 화면에서 Cage안의 몬스터의 모습을 확인하기 위해서 RenderTexture를 사용했다. 각 Cage마다 Camera와 RawImage로 만든 버튼에 RenderTexture를 연결해서 미니맵이나 CCTV 처럼 각 케이지를 확인할 수 있는 버튼을 구현했다.
CageCardSystem
-
List
Cage에 사용된 카드의 정보를 List<CardSO>로 관리하고 그에 맞는 아이콘을 CageManager의 ObjectPool에서 가져와 List<Image>로 관리하도록 구현했다. 외부에서 메서드로만 추가 삭제가 가능하게 하기 위해서 private로 구현했다.
Cage
Cage의 게임 오브젝트로 CageCameraSystem과 CageCardSystem에서 필요한 게임 오브젝트를 전부 들고 있도록 구현했는데
세 스크립트 모두 하나의 게임 오브젝트를 관리하는 스크립트이기 때문에
Cage만 MonoBehaviour를 상속받도록 하고 나머지 두 객체를 생성하면서 생성자로 전달하도록 구현해서 두 시스템은 Monobehaviour를 상속받지 않도록 했다.