• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

강의 다 보고 몇가지 질문할게 있습니다.

22.02.14 20:11 작성 조회수 218

0

일단 너무 좋은 강의 감사합니다.

모듈을 어떻게 만드는지 이벤트를 어떻게 쓰는지 잘 배웠습니다.

질문이 몇개 있는데요.

 

1) 질문은

QuestSystem.cs에서 

    private void Awake()

    {

        questDatatabase = Resources.Load<QuestDatabase>("QuestDatabase");

        achievementDatabase = Resources.Load<QuestDatabase>("AchievementDatabase");

 

        if (!Load())

        {

            foreach (var achievement in achievementDatabase.Quests)

                Register(achievement);

        }

    }

되어 있는데.. 이러면 작동이 안해서..이부분이 올려주신 섹션10 Script 스크립트도 위에 처럼 되어 있어서..

        if (!Load())

        {

            foreach (var quest in questDatatabase.Quests)

                Register(quest);

            

            foreach (var achievement in achievementDatabase.Quests)

                Register(achievement);

            

        }

이렇게 수정 했는데요. 이렇게 수정하면 맞는거겠죠? 

 

2. 질문은 제가 퀘스트와 업적을 엑셀로 만들어서 관리하고 있는데요.이걸 엑셀로 데이타를 Quest(ScriptableObject)로 만들어서 사용하면 데이타를 양분해서 엑셀은 엑셀대로 수정관리하고 Quest(ScriptableObject)대로 수정 관리 되면 통일성이 떨어지는거 같아서요.

강사님이라면 기획자가 엑셀로 넣어준 퀘스트 데이타를 어떻게 만드신 퀘스트 시스템에 적용하실건가요?

(엑셀 구조가 지금 퀘스트 구조랑 유사합니다)

   1)엑셀 데이타를 파싱해서 Quest(ScriptableObject)를 생성해서 한다.

   2)엑셀 데이타에 맞는 방식으로 모듈화 한다.

   3)다른 좋은방법이 있다.(있으시면 설명 좀..)

 

3.스킬시스템도 모듈화 강의를 해주신다고 하셨는데. 너무 궁금해서 예고편으로 어떤 구조로 만드는지 설명 좀 해주실 수 있을까요?

이틀테면 발사체 스킬이면 날라가는 방식(직선,방사형,곡선), 날라가는거리, 이동속도, 데미지, 피격 이펙트, 발사 이펙트 등등.. 이걸 어떻게 나눠서 모듈화 하는지..가 궁금하네요..

 

나머지는 다음 강의 하실떄 하면 좋을거 같은 의견인데요.

1) 구조를 나타내는 그림이 있었으면 좋겠어. 처음 강의 시작할떄 그림으로 구조를 한번 설명 해시면 이해가 빠를거 같습니다.

2) 코딩마치시고 실행할때 디버그로 타고 가면서 어떻게 동작되는지 한번 더 설명해 줬으면 좋겠습니다.

3) 유니티 프로젝트를 압축한 소스를 제공해주셨으면 좋겠습니다.  ScriptableObject로 만들어진 task,quest 세팅도 잘못하면 안되는데..

그런 부분 잘못하면 찾기가 너무 어렵더라고요. 완성 프로젝트로 비교하면서 어디가 잘못되었는지 찾을수 있으면 좋을거 같습니다.

 

긴 글 읽어주셔서 감사하고요. 오랜만에 너무 좋은 강의가 이렇게 길게 적게 되었습니다. 

아무쪼록 코로나 조심하시고 스킬시스템 강좌도 빨리 봤으면 좋겠네요!! 감사합니다

답변 1

답변을 작성해보세요.

1

1. 해당 부분은 제가 올린 그대로 작동하는게 맞습니다. 업적은 게임 시작 시에 자동 등록 해주어야하기 때문에 업적 데이터베이스에 퀘스트들을 모두 등록해주는 것입니다. 따라하셨는데 안되신다면 어떤 식으로 안되는건지 말씀해주시면 답변해드리겠습니다.

2. 저 같은 경우 퀘스트 시스템에 엑셀 파싱 기능을 만들어놓았구요, 저희 기획자는 직관적인 작업을 좋아해서 제가 만든 프레임워크를 이용해서 유니티에서 바로 데이터 작업을 합니다.

2.1 파싱의 경우
모듈식 구조이기 때문에 파싱을 할려면  프로그래머 자신과 기획자 둘 다 시스템에 대한 이해도와 DB 구조에 대한 이해도가 꽤 필요하고 프로그래머가 기획자에게도 어떤 구조로 엑셀을 작성을 해야하는지 가이드해줘야 합니다.

DB 구조에 대한 이해도가 필요하다는건 모듈마다 따로 엑셀로 데이터를 관리해서 A라는 퀘스트의 데이터를 읽을 때 어떤 모듈을 사용하는지 확인하고, 그 모듈의 대한 정보가 있는 B라는 액셀 파일로가서 정보를 읽어오는 식으로 여러 액셀 파일을 검색해서 파싱을 해야합니다. 데이터베이스를 공부하셨다면 눈치채셨겠지만 제 3 정규형으로 만들어야 하는겁니다.

2.2 기획자에게 시스템을 가르쳐줄 경우
문서를 통해 한 눈에 볼 수 없다는 것은 아쉬운 부분이지만 엑셀 파싱은 구현이 만만치 않기도하고, 기획자가 제 3 정규형 DB 작성에 익숙하지 않다면 각종 문제가 일어날 수 있기 때문에  팀의 숙련도에 따라서는 가장 안전하고 빠른 방법입니다. 특히 유니티에서 바로 작업하는 것이기 때문에 기획자가 테스트하기도 편하고 퀘스트를 만드는데 있어 직관적이라 저희 기획자분은 이 방법을 더 선호하십니다.(물론 저는 역 파싱 기능을 만들어놓아서 기획자가 원하면 만든 퀘스트들을 모두 엑셀로 뽑아서 확인할 수 있습니다.)

당장 꼭 엑셀로 데이터를 관리해야하는게 아니라면 일단 2번으로 진행하면서 1번의 개발을 하시는걸 추천드립니다.

3. 간단히 말씀드리면 구조 자체는 퀘스트와 유사합니다.
Skill은 실제 효과를 담당하는 Effect와 Effect의 집합인 Skill 두 가지로 나뉘게 됩니다.

Effect에서 모듈화할 수 있는 부분을 보면
어떤 효과를 적용할 것인가?(DealDamage, DealDamage By Stat, Change Stat, Stun, Sleep...)
어떤 적용 파티클를 보여줄 것인가?(Unity Paritcle, Material Change...)
등이 있을겁니다.

Effect의 세부 데이터는 Effect에 Rank가 존재할 수 있기 때문에 따로 데이터로 빼서 관리할겁니다.

Skill에서 모듈화 할 수 있는 부분을 보면
어떻게 타겟을 정할 것인가? (Self, Select, AOE_Circle, AOE_Cone, AOE_Box, Hit Box, InRange...)
비용을 무엇으로 지불할 것인가?(Stat(HP, Mana...), Item...)
발동은 어떻게 할 것인가?(Instant, Projectile, SpawnObject...)
어떤 상황에 어떤 파티클을 보여줄 것인가?(Unity Paritcle, Material Change...)
스킬을 배울 수있는 조건은 무엇인가?(Level, Item, Point...)
등이 있을겁니다.

Effect와 마찬가지로 세부 데이터는 Skill에 Rank가 존재할 수 있기 때문에 따로 데이터로 빼서 관리할겁니다.

다음 강의에서는 이런 것들 외에도 캐릭터를 스킬 캐스팅 중 혹은 발동 중에 움직이지 못하게하거나 스턴, 슬립 같은 CC를 통해 캐릭터의 제어권을 뺏는 등 캐릭터의 상태를 스테이트 머신을 통해 제어하는 방법과 스킬과 애니메이션을 연동하는 방법 등을 배우게 될겁니다.
QuestSystem 같은 경우는 초보자분들이 따라오기 쉽게 ScriptableObject로 모든걸 해결했지만 스킬 시스템은 ScriptableObject와 다형성을 위해 추가된 SerializeReference를 섞어서 좀 더 본격적으로 개발을 할 것입니다.
결과적으로 가볍게 만들어본 이번 퀘스트 시스템고 달리 어느 정도 고수준의 다이나믹한 스킬을 만들 수 있는 스킬 시스템을 만드는 것을 목표로 합니다. 다이나믹한 스킬 시스템을 만드는건 꽤 어려운 일고 캐릭터의 상태 제어, 애니메이션 제어가 들어가기 때문에 초급 강의였던 이번 강의와 달리 난이도가 상당히 있을 것입니다.

참고로 Effect와 Skill은 아이템에도 그대로 적용할 수 있습니다. 우리가 흔히 아는 HP 포션은 HP 회복 Effect를 가진 아이템인겁니다. 리그 오브 레전드에 보면 사용할 수 있는 아이템들이 있죠? Skill을 가진 아이템인 것입니다.  다음 강의를 보시면 스킬 시스템을 만드는 것에 더해 이런 아이템 효과를 넣는 방법까지 자연스럽게 알게 되실겁니다.(이 부분을 실제로 가르쳐드린다는건 아닙니다.)

가벼운 스킬 관리, 생성용 Custom Editor Window 작업도 할건지 아직은 고민 중입니다.

당장 생각나는 부분들을 적어봤는데 만족하실만큼 얘기를 드렸는지 모르겠네요.

─────────────────────────

수강과 피드백도 정말 감사합니다!
제가 부족하다고 느낀 부분을 정확히 짚어주셔서 굉장히 부끄럽네요 ㅠㅠ
얘기해주신 부분들을 메모해놓고 다음 강의를 제작할 때 꼭 참고하겠습니다.
코로나 조심하시고 강의 열심히 만들어보겠습니다!

다시 한번 감사드립니다.


배고파님의 프로필

배고파

질문자

2022.02.15

빠른 답변 감사 드립니다.

1. 질문에서 

QuestSystem에 Awake 함수에서

 if (!Load())

        {

            foreach (var achievement in achievementDatabase.Quests)

                Register(achievement);

        }

가 맞다고 하셨는데.. 이렇게 하면 업적 말고 퀘스트를 등록하는 부분이 없어서..

퀘스트 관련된건 하나도 작동하지 않고 있습니다.

꼭 저기가 아니더라고 

foreach (var quest in questDatatabase.Quests)

              Register(quest);

이 로직은 어딘가 있어야 될거 같은데요.. 제가 어디서 놓쳤을까요? ㅜ ㅜ

-----------------------------------------------------------------------------

질문에 자세히 답글 적어 주셔서 너무 감사합니다!!

스킬 시스템 모듈화 강좌 어서 빨리 보고 싶어 지네요!!!

다시 한번 너무 좋은 강좌, 모듈에 대한 생각을 하게 해준 강좌 감사합니다.

 

 

 

 

 

 

 

 

이번 강의에서는 NPC가 퀘스트를 주듯 QuestGiver를 통해 수동으로 퀘스트를 주는 방식만 사용하였습니다. QuestGiver는 4장 개요와 13장 메인퀘스트 제작에서 확인 가능합니다.

만일 퀘스트의 자동 등록이 필요하시다면 Quest에 useAutoAccept 옵션을 추가하셔서 QuestSystem의 Awake쪽에서 autoAcceptQuests = questDatabase.Quests.Where(x => x.UseAutoAccept); 식으로 옵션이 켜진 퀘스트들을 찾아와 Coroutine이나 Update 함수에서 해당 퀘스트들의 IsAcceptable이 true가 되면 Register 되게 만들면 됩니다.

위는 제가 드리는 하나의 예시로 꼭 저렇게 안하시더라도 본인의 스타일에 맞춰서 자유롭게 시스템을 커스터마이징 하시면 됩니다.
지금 수강생분이 작성한 것처럼 업적이랑 똑같이 시작 시에 다 등록시키고 싶다하시면 수강생분의 코드가 틀린게 아닙니다.
어떤게 더 나은 구현 방식일지, 더 나은 구현 방식은 없는지 고민해보시고 적용해보세요.

배고파님의 프로필

배고파

질문자

2022.02.15

감사합니다.

QuestGiver에서 quest를 등록하지 안았었네요!

바쁘신데 빠른 답변 너무 감사합니다