abstract class Skill : Monobehaviour이렇게 빈 껍데기 만들고 각 카드 스킬의 효과들을 구현한 스크립트들이 Skill을 상속받도록 했습니다.Fireball : SkillShield : Skill...
여기서 제 궁금증은 프로젝트 폴더에 잘 담겨있는 100개의 스킬 스크립트(Fireball과 같은)를 어떻게 관리하는지,플레이중 원하는(혹은 랜덤한) 스킬 컴포넌트를 갖고오는 방식이 뭐가 최선인지 잘 모르겠습니다.
일단은 제가 생각한 방법 몇가지를 일단 적어봅니다.
1. 각 스크립트의 이름 string 값을 통해 갖고오기
예시로 카드 매니저에 이런 구현을 통해 스킬 컴포넌트를 갖고오는 것입니다. 이 경우 '원하는 스킬'을 스크립트 이름을 통해 갖고올 수 있습니다. 하지만 좀 생각해보니 문제가 발생하는데Skill에 추가된 필드들에 대해 자식들은 정의할 수가 없다는 것입니다.
예시로 Skill 스크립트에 enum 타입의 Rarity rarity 변수를 추가해도 Fireball에서는 rarity에 값을 초기화 할 수 없어서 'Rarity.Common인 스킬들 중 랜덤한 1개의 스킬'을 갖고오는 구현을 만들 수 없습니다.
즉 각 스킬의 설정값(등급, 확률, 가격같은 변수들)들을 사전에 정의하기 난감합니다.
그래서 생각한게 가장 뻔한 2번째 방법입니다.
2. 프리팹으로 관리하기
모든 스킬 스크립트를 빈 오브젝트에 각각 컴포넌트로 달고 설정값들을 초기화한 다음 프리팹화 시켜 저장하는 방식입니다.
이러면 각 스킬마다의 Rarity나 Price들도 정의할 수 있다는 장점이 있습니다. 하지만 관리할게 스크립트 1가지에서 프리팹까지 2가지로 증가하긴 하는데 뭐 프리팹이 복잡한 것도 아니고 큰 문제가 될 거 같진 않아보입니다.
그러다가 좀 찾아보니 SO를 활용하는 방법도 있었습니다.
3. 기본값들을 SO로 빼기.
예시로 앞서 본 스킬 필드들을 담은 SkillSO 스크립터블 오브젝트를 작성한 후
이런 식으로 기본값만 관리하고 스킬의 스킬 효과 함수는 1번 방법처럼 Fireball 스크립트와 Shield 스크립트에서 구현하고 호출하도록 합니다.
추가로 카드 매니저에 Data를 갖고오는 함수도 작성합니다.
이게 3번째 방법인데 저는 SO로 데이터를 관리하기보단 스프레드 시트에 데이터들을 관리하고 유니티로 로드하는 것을 선호합니다.
또한 많은 강좌에서 SO내에 스킬 효과 함수를 그냥 작성하던데 이건 해보니까 여러 문제가 생기더라고요. 코루틴을 사용할 수 없다거나 Update를 사용할 수 없다거나.. 그래서 SO는 지양하는 편입니다.
고수님들이 보기엔 이 방법중 뭐가 가장 맞는 방법인가요? 아님 고수님들이 사용하시는 방법이 따로 있나요? 뉴비라 자세하고 쉽게 설명해주시면 정말 감사하겠습니다.
스킬은 순수 데이터와 스킬의 작동 방식을 정의하는 로직 스크립트 두 부분으로 나눌 수 있을 텐데, 데이터 부분의 관리는 3번의 SO 사용이 흔하지 않나 싶습니다. 그런데 말씀하신것처럼 시트에서 데이터를 관리하고 SO 사용을 피하고 싶으시다면, NPOI 등의 라이브러리를 사용하여 엑셀시트를 json이나 csv로 변환시킨 뒤 데이터를 이용하시는 것을 추천드립니다. 저도 SO는 기피하는 편입니다 관리가 생각보다 귀찮드라구요 - dc App
로직 부분은 1번처럼 리플렉션 써가며 구현하는 것도 괜찮습니다. 꼭 필요하지 않다면 굳이 monobehaviour 쓰지 않고 구현하는것도 좋겠죠? - dc App
좋은 정보 감사합니다!
음.. SO에서도 유니태스크로 말씀한 문제는 다 해결됨 인게임에서 0.01초 단위로 변수 수정, 참조 갈아끼워가며 바로 결과를 볼 수 있다는 점 git에 연동된다는 점, 파일경로나 ID(Key)가 바뀌어도 참조가 유지된다는 점 여러 에디터 코드로 자동화, 가독성 개선을 할 수 있다는 점이 장점임 물론 1인 개발 한정이긴함.. 여럿이서 만든다면 스프레드시트가 더 낫다고봄
아 인게임은 아니고 게임씬
특히 스킬은 직접 스킬 써보면서 수치 조정할 수 있는 이점이 매우 커서... 별도로 게임씬 현재 데이터를 저장하는 기능을 구현하는게 아니라면 (아니면 시트에 직접 옮겨 적거나..;) 직렬화를 사용하는 편이 쉬움