슬더스같이 전형적인 카드 게임을 만들어보고 있습니다. 
abstract class Skill : Monobehaviour이렇게 빈 껍데기 만들고 각 카드 스킬의 효과들을 구현한 스크립트들이 Skill을 상속받도록 했습니다.Fireball : SkillShield : Skill...
여기서 제 궁금증은 프로젝트 폴더에 잘 담겨있는 100개의 스킬 스크립트(Fireball과 같은)를 어떻게 관리하는지,플레이중 원하는(혹은 랜덤한) 스킬 컴포넌트를 갖고오는 방식이 뭐가 최선인지 잘 모르겠습니다.
일단은 제가 생각한 방법 몇가지를 일단 적어봅니다.


1. 각 스크립트의 이름 string 값을 통해 갖고오기

24b0d121e09c28a8699fe8b115ef04699231f7bf



예시로 카드 매니저에 이런 구현을 통해 스킬 컴포넌트를 갖고오는 것입니다. 이 경우 '원하는 스킬'을 스크립트 이름을 통해 갖고올 수 있습니다. 하지만 좀 생각해보니 문제가 발생하는데Skill에 추가된 필드들에 대해 자식들은 정의할 수가 없다는 것입니다.



24b0d121e09c28a8699fe8b115ef046c61f2204a



예시로 Skill 스크립트에 enum 타입의 Rarity rarity 변수를 추가해도 Fireball에서는 rarity에 값을 초기화 할 수 없어서 'Rarity.Common인 스킬들 중 랜덤한 1개의 스킬'을 갖고오는 구현을 만들 수 없습니다.

즉 각 스킬의 설정값(등급, 확률, 가격같은 변수들)들을 사전에 정의하기 난감합니다.


그래서 생각한게 가장 뻔한 2번째 방법입니다.





2. 프리팹으로 관리하기

모든 스킬 스크립트를 빈 오브젝트에 각각 컴포넌트로 달고 설정값들을 초기화한 다음 프리팹화 시켜 저장하는 방식입니다.


24b0d121e09c28a8699fe8b115ef046f574998


24b0d121e09c28a8699fe8b115ef046ec840cbf6


24b0d121e09c28a8699fe8b115ef046ec841cdf3


이러면 각 스킬마다의 Rarity나 Price들도 정의할 수 있다는 장점이 있습니다. 하지만 관리할게 스크립트 1가지에서 프리팹까지 2가지로 증가하긴 하는데 뭐 프리팹이 복잡한 것도 아니고 큰 문제가 될 거 같진 않아보입니다.


그러다가 좀 찾아보니 SO를 활용하는 방법도 있었습니다.





3. 기본값들을 SO로 빼기.


24b0d121e09c28a8699fe8b115ef046f5a4c9f99

예시로 앞서 본 스킬 필드들을 담은 SkillSO 스크립터블 오브젝트를 작성한 후


24b0d121e09c28a8699fe8b115ef04699439f5


24b0d121e09c28a8699fe8b115ef046c61f52b47


이런 식으로 기본값만 관리하고 스킬의 스킬 효과 함수는 1번 방법처럼 Fireball 스크립트와 Shield 스크립트에서 구현하고 호출하도록 합니다.

추가로 카드 매니저에 Data를 갖고오는 함수도 작성합니다.


24b0d121e09c28a8699fe8b115ef046f5e449b97


이게 3번째 방법인데 저는 SO로 데이터를 관리하기보단 스프레드 시트에 데이터들을 관리하고 유니티로 로드하는 것을 선호합니다.

또한 많은 강좌에서 SO내에 스킬 효과 함수를 그냥 작성하던데 이건 해보니까 여러 문제가 생기더라고요. 코루틴을 사용할 수 없다거나 Update를 사용할 수 없다거나.. 그래서 SO는 지양하는 편입니다.


고수님들이 보기엔 이 방법중 뭐가 가장 맞는 방법인가요? 아님 고수님들이 사용하시는 방법이 따로 있나요? 뉴비라 자세하고 쉽게 설명해주시면 정말 감사하겠습니다.