- CardSystem
CardSystem
진행 중인 팀 프로젝트에서 제작을 맡은 Card 부분의 내용을 정리
목적
프로젝트에서 몬스터를 잡아와서 관리하는 부분을 카드를 사용해서 표현하기로 했고
카드를 생성하여 덱을 구성하고 카드를 뽑고 사용하는 기능들을 여러가지 카드 관련 클래스로 구현했다.
CardSystem 도식
CardManager
-
Dictionary, List
CardManager는 카드의 생성과 랜덤 선택을 구현한 클래스로 카드의 정보를 담은 CardSO를 저장할 필요가 있었고 CardRarity에 따라서 등장 확률을 다르게 하기 위해서 따로 보관할 필요가 있기 떄문에 CardRarity를 Key로 List<GameObject>를 Value로 가진 Dictionary로 CardSO들을 관리
-
System.Security.Cryptography.RNGCryptoServiceProvider .NET 표준 라이브러리 클래스
Random 클래스를 사용하여 난수를 생성하게 되면 난수가 일정 패턴을 가지게 되어 원하는 정도의 랜덤성이 충족되지 않을 수 있기 때문에 RNGCryptoServiceProvider를 활용해 암호학적으로 안전한 패턴이 없는 난수를 생성
-
Singletion 디자인 패턴
CardSO의 프리펩들을 가지고 있다가 다른 Card 관련 클래스에서 쉽게 호출해서 CardSO를 랜덤으로 선택해야 되기 떄문에 어디서든 호출할 수 있고 프리펩들이 중복해서 로드되는 경우를 방지하기 위해서 싱글톤 패턴을 사용해 구현하였고 CardManager는 게임 플레이 내내 파괴되지 않아야 되기 때문에 Monobehaviour 없이 구현
Deck
-
List
Deck에서는 CardManager를 통해서 생성한 CardSO를 저장할 필요가 있었기 떄문에 List<CardSO>를 사용해 카드의 정보를 저장 사용한 카드를 따로 저장해 뒀다가 덱을 모두 사용 했을때 다시 덱으로 되돌리는 기능을 구현하기 위해서 덱 리스트와 버려진 덱 리스트로 나눠서 2개의 리스트로 카드를 관리 덱의 구조는 가장 위의 카드만을 뽑기 때문에 Stack을 사용하는 것이 좋지만 이후에 덱의 중간에 카드를 추가하거나 덱에서 카드를 선택해 가져오는 등 인덱싱을 하는 경우가 생길 수 있다고 생각해서 List를 Stack처럼 사용
Hand
-
List
Hand 에서는 CardSO 뿐만이 아니라 실제 카드의 게임 오브젝트인 Card도 관리를 할 필요성이 있기 떄문에 List<Card>와 List<CardSO> 두개의 리스트로 관리 두 개의 리스트가 항상 같이 수정되야 하기 떄문에 private로 선언하고 메서드를 사용해서 리스트를 수정
-
Corutine
카드를 한장씩 뽑아서 패가 완성되는 연출을 하기 위해서 코루틴을 사용해서 카드를 세팅하는 메서드를 호출
Card
-
DOTween
Card의 간단한 애니메이션을 쉽게 구현하기 위해서 DOTween을 사용하여 Card 게임 오브젝트의 transform을 조정해주는 것으로 애니메이션을 구현
HandCard : Card
-
Card
카드 선택창 또는 덱 UI에서는 요구되는 카드의 움직임 기능과 패에 있을 때 요구되는 기능이 달랐기 때문에 Card를 상속받은 HandCard을 구현, 패에서 움직이는 애니메이션 카드
CardSO
-
ScriptableObject
카드의 정보를 저장할 필요가 있지만 카드의 정보를 참조만 하면되는 상황이 였기 떄문에 ScriptableObject로 카드의 정보를 위한 클래스를 만들고 카드 마다 ScriptableObject를 만들어서 사용 카드의 효과 부분을 CardEffect라는 클래스로 저장한다.
FoodCardSO : CardSO
-
CardSO
Food 카드의 경우 FoodType이라는 데이터를 추가로 필요로 해서 CardSO를 상속